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

标签 c signals posix

正在尝试为 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/

相关文章:

kubernetes - kubectl:从明文 secret 中获取特定值

c - MPI 向工作人员发送信息时出现问题

linux - Cygwin:中断阻塞读取

c - 当我在命令参数中输入 4/a 时,为什么不会输出 "invalid input"

python socket recv() 和信号

c - 信号处理问题

linux - CMake 是否支持 glibc 功能测试宏

c - 杀戮和收获过程

将 C 校验和函数转换为 Lua

c - 无法分配信号量/netconn Tiva C TM4C1294