【问题标题】:How to fix 'No such process' error from kill function on negation of pid如何在 pid 否定时从 kill 函数中修复“没有这样的进程”错误
【发布时间】:2019-04-07 17:51:06
【问题描述】:

正在尝试为 SIGINT 信号编写信号处理程序。我希望将新的 SIGINT 发送到由 pid 指定的进程组。 (使用signals.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 并出现“没有这样的进程”错误。

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

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

【问题讨论】:

  • 嘿guenni_90,好点,但我不这么认为。确实有一个 kill 命令作为 bash 可执行文件/内置 idk。但是 c 的 signal.h 库提供了 kill(pid_t pid, int sig) 函数来发送信号。这个函数的手册页可以用man 2 kill查看。
  • 我相信的问题是你认为你可以否定 any pid 并且它将被发送到进程组 - 但并非所有进程 id 都是进程组 id!跨度>
  • 请不要添加多语言标签,只添加您实际编程语言的标签。即使解决方案可以用于多种语言。
  • @someprogrammerdude 注意,以后的帖子会反映这一点。

标签: c signals posix


【解决方案1】:

kill(-pid, sig) 会将信号发送到 进程组 pidkill 将与 ESRCH 出错 if (Posix):

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
}

【讨论】:

  • 这完全是正确答案!对于我的具体情况,我需要通过setpgid(pid_t pid, pid_t pgid) 设置进程的组ID。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
相关资源
最近更新 更多