APUE关于第九章进程关系的疑问

时间:2021-10-07 15:59:36
书中提到了如下两种情况
两种情况的PID和PPID的关系相差很大,请问第一种情况是老版本的SHELL吗,因为我电脑上的是第二种情况(Fedora9)

第一种
ps -xj | cat1 | cat2
下面看一看shell所用的进程控制:
PPID PID  PGID  SID TPGID  COMMAND
1    163   163  163  163  -sh
163  202   163  163  163  cat2
202  203   163  163  163  ps
202  204   163  163  163  cat1

第二种
按下列方式在一个管道中执行两个进程:
ps -xj | cat1
其输出为:
PPID  PID  PGID   SID  TPGID  COMMAND
1     700   700   700  710    -ksh
700   710   710   700  710    ps
700   711   710   700  710    cat1

另外这个进程关系在程序编写中很重要吗,谢谢

16 个解决方案

#1


与win不同linux下有较为严格的进程间父子关系
这些ID只不过是个编号,除了及其个别的为固定以外,其余是随机变化的

#2


我的意思是
第一种情况中 ps -xj | cat1 | cat2    shell先fork cat2 然后cat2 fork ps 和 cat1
而第二种情况则是 ps 和 cat1的父进程都是shell

#3



这个例子关注点在2个方面。

1. 如LZ说的,早期的,有些shell的处理,是管道链中的最后一个进程负责继续创建链中其他的进程,而自身是由shell创建。因此,进程关系如第一个的样子。现在的,bash不是这样。bash都是由shell创建。

2. 进程组的关系。有些shell不支持进程组。而bash这样的shell支持进程组。因此,查看子进程的进程组可以看出2段输出的差异。

#4


在第一个例子中,有一个会话,一个进程组
应该是不支持任务控制的shell

在第二个例子中,有一个会话,两个进程组
流行的shell应该都是这个样子

进程关系在编写程序的时候比较重要,像父子关系,是否同一进程组(发送信号时可以指定将信号发送给某个进程组)

#5


引用 3 楼 yutaooo 的回复:
这个例子关注点在2个方面。

1. 如LZ说的,早期的,有些shell的处理,是管道链中的最后一个进程负责继续创建链中其他的进程,而自身是由shell创建。因此,进程关系如第一个的样子。现在的,bash不是这样。bash都是由shell创建。

2. 进程组的关系。有些shell不支持进程组。而bash这样的shell支持进程组。因此,查看子进程的进程组可以看出2段输出的差异。


这两种情况 子进程的进程组好像没什么不同吧

#6


引用 4 楼 justkk 的回复:
在第一个例子中,有一个会话,一个进程组
应该是不支持任务控制的shell

在第二个例子中,有一个会话,两个进程组
流行的shell应该都是这个样子

进程关系在编写程序的时候比较重要,像父子关系,是否同一进程组(发送信号时可以指定将信号发送给某个进程组)


这里我有个地方不是很懂
ps j | cat
PPID   PID    PGID   SID    TTY      TPGID STAT   UID   TIME COMMAND
15740  15743  15743  15743  pts/0    26183 Rs     500   0:00 bash
15743  26183  26183  15743  pts/0    26183 R+     500   0:00 ps j
15743  26184  26183  15743  pts/0    26183 S+     500   0:00 cat

这里ps 和 cat都是shell的子进程 两者PGID相同是因为都是同一个进程的子进程的关系么

另外请高人指点下PGID和TPGID 区别在哪

#7


两者PGID相同是因为shell创建了一个新的进程组,这个新的进程组里面只有ps 和 cat
TPGID是指前台进程组,也就是能读取终端输入的进程组

#8



在一个session中可以最多拥有1个终端(或者没有)。

在一个session中可以最少有1个进程组,或者多个进程组。其中的一个为前台进程组,其他为后台进程组。

假设有终端,这个终端,在系统中用一个数据结构来表达。这个数据结构中有一项,就是TPGID,这个值表达一个进程组。可以认为,终端持有了这个进程组。终端持有的进程组,被称为前台进程组。因为只有1个坑位,只能有1个进程组蹲在这里,其他没蹲上的,都是后台进程组。

#9


该回复于2010-11-23 14:13:35被版主删除

#10


引用 7 楼 justkk 的回复:
两者PGID相同是因为shell创建了一个新的进程组,这个新的进程组里面只有ps 和 cat
TPGID是指前台进程组,也就是能读取终端输入的进程组


为什么shell创建的子程序和shell不是一个进程组,而如果自己fork的话却是父子进程都在一个进程组

这里面有什么奥秘吗 求指点

#11


这个我没研究了
shell执行程序时自动创建一个新的进程组,这应该是shell内部的逻辑了
我感觉不用深究了,了解就行了

#12


引用 8 楼 yutaooo 的回复:
在一个session中可以最多拥有1个终端(或者没有)。

在一个session中可以最少有1个进程组,或者多个进程组。其中的一个为前台进程组,其他为后台进程组。

假设有终端,这个终端,在系统中用一个数据结构来表达。这个数据结构中有一项,就是TPGID,这个值表达一个进程组。可以认为,终端持有了这个进程组。终端持有的进程组,被称为前台进程组。因为只有1个坑位,只能有1个进程组蹲在这里,其……


请问终端是怎样建立一个进程组的  谢谢

#13




10楼的问题就是。为了支持JOB这样的概念。将管道链起来的一组进程,划归到一个进程组。置于前台。而shell自身则退居后台。

12楼的问题是。tcsetpgrp()可以设置前台进程组。

LZ的问题APUE里有解释的,不过要仔细慢慢看。我比较本。。。。看了好几遍。

#14


该回复于2010-12-07 13:40:23被版主删除

#15


谢谢yutaooo

#16


还有justkk  neohope

谢谢大家

结贴

#1


与win不同linux下有较为严格的进程间父子关系
这些ID只不过是个编号,除了及其个别的为固定以外,其余是随机变化的

#2


我的意思是
第一种情况中 ps -xj | cat1 | cat2    shell先fork cat2 然后cat2 fork ps 和 cat1
而第二种情况则是 ps 和 cat1的父进程都是shell

#3



这个例子关注点在2个方面。

1. 如LZ说的,早期的,有些shell的处理,是管道链中的最后一个进程负责继续创建链中其他的进程,而自身是由shell创建。因此,进程关系如第一个的样子。现在的,bash不是这样。bash都是由shell创建。

2. 进程组的关系。有些shell不支持进程组。而bash这样的shell支持进程组。因此,查看子进程的进程组可以看出2段输出的差异。

#4


在第一个例子中,有一个会话,一个进程组
应该是不支持任务控制的shell

在第二个例子中,有一个会话,两个进程组
流行的shell应该都是这个样子

进程关系在编写程序的时候比较重要,像父子关系,是否同一进程组(发送信号时可以指定将信号发送给某个进程组)

#5


引用 3 楼 yutaooo 的回复:
这个例子关注点在2个方面。

1. 如LZ说的,早期的,有些shell的处理,是管道链中的最后一个进程负责继续创建链中其他的进程,而自身是由shell创建。因此,进程关系如第一个的样子。现在的,bash不是这样。bash都是由shell创建。

2. 进程组的关系。有些shell不支持进程组。而bash这样的shell支持进程组。因此,查看子进程的进程组可以看出2段输出的差异。


这两种情况 子进程的进程组好像没什么不同吧

#6


引用 4 楼 justkk 的回复:
在第一个例子中,有一个会话,一个进程组
应该是不支持任务控制的shell

在第二个例子中,有一个会话,两个进程组
流行的shell应该都是这个样子

进程关系在编写程序的时候比较重要,像父子关系,是否同一进程组(发送信号时可以指定将信号发送给某个进程组)


这里我有个地方不是很懂
ps j | cat
PPID   PID    PGID   SID    TTY      TPGID STAT   UID   TIME COMMAND
15740  15743  15743  15743  pts/0    26183 Rs     500   0:00 bash
15743  26183  26183  15743  pts/0    26183 R+     500   0:00 ps j
15743  26184  26183  15743  pts/0    26183 S+     500   0:00 cat

这里ps 和 cat都是shell的子进程 两者PGID相同是因为都是同一个进程的子进程的关系么

另外请高人指点下PGID和TPGID 区别在哪

#7


两者PGID相同是因为shell创建了一个新的进程组,这个新的进程组里面只有ps 和 cat
TPGID是指前台进程组,也就是能读取终端输入的进程组

#8



在一个session中可以最多拥有1个终端(或者没有)。

在一个session中可以最少有1个进程组,或者多个进程组。其中的一个为前台进程组,其他为后台进程组。

假设有终端,这个终端,在系统中用一个数据结构来表达。这个数据结构中有一项,就是TPGID,这个值表达一个进程组。可以认为,终端持有了这个进程组。终端持有的进程组,被称为前台进程组。因为只有1个坑位,只能有1个进程组蹲在这里,其他没蹲上的,都是后台进程组。

#9


该回复于2010-11-23 14:13:35被版主删除

#10


引用 7 楼 justkk 的回复:
两者PGID相同是因为shell创建了一个新的进程组,这个新的进程组里面只有ps 和 cat
TPGID是指前台进程组,也就是能读取终端输入的进程组


为什么shell创建的子程序和shell不是一个进程组,而如果自己fork的话却是父子进程都在一个进程组

这里面有什么奥秘吗 求指点

#11


这个我没研究了
shell执行程序时自动创建一个新的进程组,这应该是shell内部的逻辑了
我感觉不用深究了,了解就行了

#12


引用 8 楼 yutaooo 的回复:
在一个session中可以最多拥有1个终端(或者没有)。

在一个session中可以最少有1个进程组,或者多个进程组。其中的一个为前台进程组,其他为后台进程组。

假设有终端,这个终端,在系统中用一个数据结构来表达。这个数据结构中有一项,就是TPGID,这个值表达一个进程组。可以认为,终端持有了这个进程组。终端持有的进程组,被称为前台进程组。因为只有1个坑位,只能有1个进程组蹲在这里,其……


请问终端是怎样建立一个进程组的  谢谢

#13




10楼的问题就是。为了支持JOB这样的概念。将管道链起来的一组进程,划归到一个进程组。置于前台。而shell自身则退居后台。

12楼的问题是。tcsetpgrp()可以设置前台进程组。

LZ的问题APUE里有解释的,不过要仔细慢慢看。我比较本。。。。看了好几遍。

#14


该回复于2010-12-07 13:40:23被版主删除

#15


谢谢yutaooo

#16


还有justkk  neohope

谢谢大家

结贴