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");
}
Я делаю что-то неправильно?
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
,
Исходя из обсуждения, ваш вопрос, скорее всего, «Почему мой kill()
не сгенерировать тот эффект, который я ожидал?
Чтобы понять, почему это происходит, вы должны сначала попробовать strace
на процесс, который является целью kill()
, Присоедините его к существующему процессу, pid
или вызвать его под strace
, strace
покажет изменения в маске сигнала и укажет, когда поступят сигналы. Если ваш сигнал поступает, вы должны отладить процесс, на который kill()
и попытайтесь понять, что должен делать установленный / используемый по умолчанию обработчик сигналов.