Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 指示快捷键和进程组_Linux_Process_Fork - Fatal编程技术网

Linux 指示快捷键和进程组

Linux 指示快捷键和进程组,linux,process,fork,Linux,Process,Fork,关于Linux系统中的信号,我有一个简单的问题。据我所知,每个进程都有它的PID和PGID。当我创建一个进程时,它会得到它唯一的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)

关于Linux系统中的信号,我有一个简单的问题。据我所知,每个进程都有它的
PID
PGID
。当我创建一个进程时,它会得到它唯一的
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;
}
等一下,他创建他的孩子,我做
CTRL-C
,然后
ps aux
我可以看到父母和孩子都走了,但如果我这样做了

./foo
等待分叉完成,并在其他终端执行

kill -INT <pid_of_foo>
kill-INT
我可以看到父母已经走了,但孩子们还活着,还在吃我的CPU

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

我走对了吗?如果是,为什么键组合使用
PGID
而不是
PID
终止进程?

信号传递、进程组和会话 是的,你在正确的轨道上

自BSD发布以来的现代Unix变体实现了会话和进程组

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

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

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


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

kill -INT <pid_of_foo>