Ошибка Linux () неожиданная

Kill (pid, 0), кажется, неправильно устанавливает код ошибки … как указано в man для kill

ошибки

Функция kill () должна завершиться ошибкой, если:

EINVAL Значение аргумента sig является недопустимым или не поддерживается
номер сигнала.
EPERM У процесса нет разрешения на отправку
сигнал для любого процесса получения.
ESRCH Ни один процесс или группа процессов не могут
быть найденным в соответствии с указанным pid. Следующие
разделы информативны.
1

Он возвращает ENOENT (такого файла или каталога нет), а затем иногда возвращает EINTR (системный вызов прерван) …

Вот что я делаю:

kill(g_StatusInstance[i].pid, SIGTERM) == -1 && log_fatal_syscall("kill-sigterm");
kill(g_StatusInstance[i].pid, 0);

log_info_console( "Checking process for errors: %s\n", strerror(errno));

if(errno != ENOENT)
{
kill(g_StatusInstance[i].pid, SIGKILL) == -1 && log_fatal_syscall("kill-sigkill");
}

Я делаю что-то неправильно?

1

Решение

Kill(pid, 0) похоже не правильно установил код ошибки …
Возвращается ENOENT … EINTR

Вот что я делаю:

...
kill(g_StatusInstance[i].pid, 0);
log_info_console( "Checking process for errors: %s\n", strerror(errno));

Я делаю что-то неправильно?

Да. Вы не проверяете возвращаемое значение kill() системный вызов. kill() не устанавливает errno для какого-либо конкретного значения в успешном случае.

Попробуй это:

if(kill(g_StatusInstance[i].pid, 0) == -1) {
log_info_console( "Checking process for errors: %s\n", strerror(errno));
} else {
log_info_console( "kill returned 0, process still alive\n" );
}

В более общем случае, вы должны проверять возвращаемое значение каждого системного или библиотечного вызова, если только он не объявлен как возвращаемый. void,

4

Другие решения

Исходя из обсуждения, ваш вопрос, скорее всего, «Почему мой kill() не сгенерировать тот эффект, который я ожидал?

Чтобы понять, почему это происходит, вы должны сначала попробовать strace на процесс, который является целью kill(), Присоедините его к существующему процессу, pid или вызвать его под strace, strace покажет изменения в маске сигнала и укажет, когда поступят сигналы. Если ваш сигнал поступает, вы должны отладить процесс, на который kill() и попытайтесь понять, что должен делать установленный / используемый по умолчанию обработчик сигналов.

0

По вопросам рекламы [email protected]