试图为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之后,程序都会崩溃
答案 0 :(得分:0)
kill(-pid, sig)
会将信号发送到进程组 pid
。如果(Posix),kill
会以ESRCH
错误:
ESRCH
找不到对应于
pid
指定的进程或进程组。
并非所有进程ID都是进程组ID。
您可以使用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
}