如何修复pid取反时来自kill函数的'No such process'错误

时间:2019-04-07 17:51:07

标签: c signals posix

试图为SIGINT信号编写信号处理程序。我希望将新的SIGINT发送到由pid指定的进程组。 (使用signal.h中的“ kill”功能)。

kill函数man 2 kill的联机帮助页指示负pid将向整个进程组发送信号。

以前,我只有将其发送到pid的信号,并且工作正常。信号已发送,过程已正确反应。

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

但是,当我否定pid时,kill函数将返回-1并出现错误,并显示“ No such process”错误。

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

这对我来说真的很奇怪。我可以验证该进程的pid是否正确。但是,每次我取消pid之后,程序都会崩溃

1 个答案:

答案 0 :(得分:0)

kill(-pid, sig)会将信号发送到进程组 pid。如果(Posix),kill会以ESRCH错误:

  

ESRCH

     

找不到对应于pid指定的进程或进程组

并非所有进程ID都是进程组ID。

您可以使用pid_t getpgid(pid_t pid)(即

)获取流程的流程组ID。
pid_t pid = getprocesspid();
pid_t pgid = getpgid(pid);

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

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