我有一个关于Linux系统中的信号的简单问题。据我所知,每个过程都有PIDPGID。当我创建一个进程时,它得到了唯一的PID,现在如果我使用fork()函数派生一个新进程,我将得到具有不同PID但相同PGID的子进程。
现在,密码

#include<stdio.h>
#include<unistd.h>
int main()
{
  int i=3;
  int j;
  for(j=0;j<i;++j)
  {
      if (fork() == 0)
      {
          while(1)
          {

          }
      }
  }
  printf("created\n");
  while(1)
  {

  }
  return 0;
}

当我编译这个程序并用命令运行它时
./foo

等一下,他创造了他的孩子,我创造了,然后我看到父母和孩子都走了,但是如果我创造了
./foo

等待分叉完成,并在其他终端执行
kill -INT <pid_of_foo>

我可以看到父母不在了,但孩子们还活着,还在吃我的CPU。
我不确定,但似乎CTRL-C将信号发送到某个进程组中的每个进程,而ps aux命令将信号发送到ps auxCTRL-C的进程。
我走对了吗?如果是,为什么键组合会用KILL -SIGNAL pid而不是PID=pid终止进程?

最佳答案

信号传递、进程组和会话
是的,你走对了路。
自bsd发布以来的现代unix变体实现了会话和进程组。
您可以将会话视为流程组的组。其思想是,由tty或伪tty行上的一次登录所产生的所有内容都是会话的一部分,与单个shell管道或其他进程逻辑分组相关的内容将被组织到单个进程组中。
这使得在前景和背景之间移动“作业”和传送信号更加方便。shell用户基本上不需要担心单个进程,但可以直观地控制一组相关命令。
键盘生成的信号在会话中发送到前台进程组。您正在使用的clikill命令将信号传递给各个进程。如果要尝试复制^c传递机制,可以使用kill 0;该机制将向同一进程组的每个成员发送信号,如果从脚本执行,则可以执行所需的操作。
注意:我编辑了您的问题,将GPID改为PGID。

08-26 22:26