Как исправить ошибку «Нет такого процесса» из функции kill при отрицании pid - PullRequest
1 голос
/ 07 апреля 2019

Попытка записать обработчик сигнала для сигнала SIGINT. Я хочу, чтобы новый SIGINT был отправлен в группу процессов, указанную в pid. (используя функцию kill из signal.h).

Страницы man для функции kill man 2 kill указывают, что отрицательный pid отправит сигнал всей группе процессов.

Раньше у меня было это, которое только посылало сигнал на пид, и оно работало нормально. Сигнал отправлен и процесс правильно отреагировал.

void handle_sigint(int sig){
  pid_t pid = getprocesspid();
  if(kill(pid, sig) < 0){
    //Not taken
  }
}

Однако, когда я отменяю pid, функция kill возвращает -1 и выдает ошибку с ошибкой «Нет такого процесса».

void handle_sigint(int sig){
  pid_t pid = getprocesspid();
  if(kill(-pid, sig) < 0){
    //Errors out
  }
}

Это действительно странно для меня. Я могу проверить, что PID является правильным для процесса. Однако каждый раз после того, как я отменяю pid, программа вылетает

1 Ответ

0 голосов
/ 07 апреля 2019

kill(-pid, sig) отправит сигнал в группу процессов pid. kill выдаст ошибку с ESRCH, если ( Posix ):

ESRCH

Не найден процесс или группа процессов , соответствующая указанной в pid.

Не все идентификаторы процессов являются идентификаторами групп процессов.

Вы можете получить идентификатор группы процессов для процесса с помощью pid_t getpgid(pid_t pid), т.е.

pid_t pid = getprocesspid();
pid_t pgid = getpgid(pid);

if (pgid == -1) {
    // getpgid errored
}

if (kill(-pgid, sig) < 0){
    //Errors out
}
...