信号快捷键和进程组

时间:2012-05-12 18:39:00

标签: linux process fork

我对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

等一下,所以他创造了他的孩子,然后CTRL-C,然后ps aux我可以看到父母和孩子们已经离开了,但如果我这样做了

./foo

等待分叉完成,并在其他终端做

kill -INT <pid_of_foo>

ps aux我可以看到父母已经离开,但是孩子们仍然活着并吃着我的CPU。

我不确定,但似乎CTRL-C将信号发送到某个进程组中的每个进程,KILL -SIGNAL pid命令将信号发送到进程PID=pid没有PGID=pid

我是否在正确的轨道上?如果是,为什么密钥组合会使用PGID而非PID

来终止流程

1 个答案:

答案 0 :(得分:2)

信号传递,进程组和会话

是的,你走在正确的轨道上。

自BSD发布以来,现代Unix变种实现会话进程组

您可以将会话视为进程组的组。我们的想法是,在tty或伪tty行上单次登录所产生的一切都是会话的一部分,与单个shell管道或其他逻辑流程组相关的事情将被组织到一个进程组中。

这使得在前景和背景之间移动“作业”并且更方便地传递信号。 shell用户大多不需要担心单个进程,但可以直观地控制一组相关命令。

键盘生成的信号在会话中发送到前台进程组。您正在使用的CLI kill命令将信号传递给各个进程。如果您想尝试复制^ C传递机制,可以使用kill 0;这会将信号发送给同一进程组的每个成员,如果从脚本执行,它可以做你想要的。


注意:我编辑了您的问题,将GPID更改为PGID。