当前位置: 技术问答>linux和unix
APUE关于第九章进程关系的疑问
来源: 互联网 发布时间:2016-10-19
本文导语: 书中提到了如下两种情况 两种情况的PID和PPID的关系相差很大,请问第一种情况是老版本的SHELL吗,因为我电脑上的是第二种情况(Fedora9) 第一种 ps -xj | cat1 | cat2 下面看一看shell所用的进程控制: PPID PID PGID SID...
书中提到了如下两种情况
两种情况的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
另外这个进程关系在程序编写中很重要吗,谢谢
两种情况的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
另外这个进程关系在程序编写中很重要吗,谢谢
|
这个例子关注点在2个方面。
1. 如LZ说的,早期的,有些shell的处理,是管道链中的最后一个进程负责继续创建链中其他的进程,而自身是由shell创建。因此,进程关系如第一个的样子。现在的,bash不是这样。bash都是由shell创建。
2. 进程组的关系。有些shell不支持进程组。而bash这样的shell支持进程组。因此,查看子进程的进程组可以看出2段输出的差异。
|
在第一个例子中,有一个会话,一个进程组
应该是不支持任务控制的shell
在第二个例子中,有一个会话,两个进程组
流行的shell应该都是这个样子
进程关系在编写程序的时候比较重要,像父子关系,是否同一进程组(发送信号时可以指定将信号发送给某个进程组)
应该是不支持任务控制的shell
在第二个例子中,有一个会话,两个进程组
流行的shell应该都是这个样子
进程关系在编写程序的时候比较重要,像父子关系,是否同一进程组(发送信号时可以指定将信号发送给某个进程组)
|
与win不同linux下有较为严格的进程间父子关系
这些ID只不过是个编号,除了及其个别的为固定以外,其余是随机变化的
这些ID只不过是个编号,除了及其个别的为固定以外,其余是随机变化的
|
两者PGID相同是因为shell创建了一个新的进程组,这个新的进程组里面只有ps 和 cat
TPGID是指前台进程组,也就是能读取终端输入的进程组
TPGID是指前台进程组,也就是能读取终端输入的进程组
|
在一个session中可以最多拥有1个终端(或者没有)。
在一个session中可以最少有1个进程组,或者多个进程组。其中的一个为前台进程组,其他为后台进程组。
假设有终端,这个终端,在系统中用一个数据结构来表达。这个数据结构中有一项,就是TPGID,这个值表达一个进程组。可以认为,终端持有了这个进程组。终端持有的进程组,被称为前台进程组。因为只有1个坑位,只能有1个进程组蹲在这里,其他没蹲上的,都是后台进程组。
|
这个我没研究了
shell执行程序时自动创建一个新的进程组,这应该是shell内部的逻辑了
我感觉不用深究了,了解就行了
shell执行程序时自动创建一个新的进程组,这应该是shell内部的逻辑了
我感觉不用深究了,了解就行了
|
10楼的问题就是。为了支持JOB这样的概念。将管道链起来的一组进程,划归到一个进程组。置于前台。而shell自身则退居后台。
12楼的问题是。tcsetpgrp()可以设置前台进程组。
LZ的问题APUE里有解释的,不过要仔细慢慢看。我比较本。。。。看了好几遍。
|