正在尝试为 SIGINT 信号编写信号处理程序。我希望将新的 SIGINT 发送到由 pid 指定的进程组。 (使用 signals.h 中的“kill”函数)。
kill 函数的联机帮助页 man 2 kill
指出负 pid 将向整个进程组发送信号。
以前我有这个只向 pid 发送信号并且工作正常。信号已发送,进程已做出正确 react 。
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 后程序崩溃
最佳答案
kill(-pid, sig)
会将信号发送到进程组 pid
。如果 ( Posix ):
kill
将因 ESRCH
而出错
ESRCH
No process or process group can be found corresponding to that specified by
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
}
关于c - 如何修复 pid 取反时 kill 函数的 'No such process' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55561984/