两种情况的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只不过是个编号,除了及其个别的为固定以外,其余是随机变化的
这些ID只不过是个编号,除了及其个别的为固定以外,其余是随机变化的
#2
我的意思是
第一种情况中 ps -xj | cat1 | cat2 shell先fork cat2 然后cat2 fork ps 和 cat1
而第二种情况则是 ps 和 cat1的父进程都是shell
第一种情况中 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应该都是这个样子
进程关系在编写程序的时候比较重要,像父子关系,是否同一进程组(发送信号时可以指定将信号发送给某个进程组)
应该是不支持任务控制的shell
在第二个例子中,有一个会话,两个进程组
流行的shell应该都是这个样子
进程关系在编写程序的时候比较重要,像父子关系,是否同一进程组(发送信号时可以指定将信号发送给某个进程组)
#5
这两种情况 子进程的进程组好像没什么不同吧
#6
这里我有个地方不是很懂
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是指前台进程组,也就是能读取终端输入的进程组
TPGID是指前台进程组,也就是能读取终端输入的进程组
#8
在一个session中可以最多拥有1个终端(或者没有)。
在一个session中可以最少有1个进程组,或者多个进程组。其中的一个为前台进程组,其他为后台进程组。
假设有终端,这个终端,在系统中用一个数据结构来表达。这个数据结构中有一项,就是TPGID,这个值表达一个进程组。可以认为,终端持有了这个进程组。终端持有的进程组,被称为前台进程组。因为只有1个坑位,只能有1个进程组蹲在这里,其他没蹲上的,都是后台进程组。
#9
#10
为什么shell创建的子程序和shell不是一个进程组,而如果自己fork的话却是父子进程都在一个进程组
这里面有什么奥秘吗 求指点
#11
这个我没研究了
shell执行程序时自动创建一个新的进程组,这应该是shell内部的逻辑了
我感觉不用深究了,了解就行了
shell执行程序时自动创建一个新的进程组,这应该是shell内部的逻辑了
我感觉不用深究了,了解就行了
#12
请问终端是怎样建立一个进程组的 谢谢
#13
10楼的问题就是。为了支持JOB这样的概念。将管道链起来的一组进程,划归到一个进程组。置于前台。而shell自身则退居后台。
12楼的问题是。tcsetpgrp()可以设置前台进程组。
LZ的问题APUE里有解释的,不过要仔细慢慢看。我比较本。。。。看了好几遍。
#14
#15
谢谢yutaooo
#16
还有justkk neohope
谢谢大家
结贴
谢谢大家
结贴
#1
与win不同linux下有较为严格的进程间父子关系
这些ID只不过是个编号,除了及其个别的为固定以外,其余是随机变化的
这些ID只不过是个编号,除了及其个别的为固定以外,其余是随机变化的
#2
我的意思是
第一种情况中 ps -xj | cat1 | cat2 shell先fork cat2 然后cat2 fork ps 和 cat1
而第二种情况则是 ps 和 cat1的父进程都是shell
第一种情况中 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应该都是这个样子
进程关系在编写程序的时候比较重要,像父子关系,是否同一进程组(发送信号时可以指定将信号发送给某个进程组)
应该是不支持任务控制的shell
在第二个例子中,有一个会话,两个进程组
流行的shell应该都是这个样子
进程关系在编写程序的时候比较重要,像父子关系,是否同一进程组(发送信号时可以指定将信号发送给某个进程组)
#5
这两种情况 子进程的进程组好像没什么不同吧
#6
这里我有个地方不是很懂
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是指前台进程组,也就是能读取终端输入的进程组
TPGID是指前台进程组,也就是能读取终端输入的进程组
#8
在一个session中可以最多拥有1个终端(或者没有)。
在一个session中可以最少有1个进程组,或者多个进程组。其中的一个为前台进程组,其他为后台进程组。
假设有终端,这个终端,在系统中用一个数据结构来表达。这个数据结构中有一项,就是TPGID,这个值表达一个进程组。可以认为,终端持有了这个进程组。终端持有的进程组,被称为前台进程组。因为只有1个坑位,只能有1个进程组蹲在这里,其他没蹲上的,都是后台进程组。
#9
#10
为什么shell创建的子程序和shell不是一个进程组,而如果自己fork的话却是父子进程都在一个进程组
这里面有什么奥秘吗 求指点
#11
这个我没研究了
shell执行程序时自动创建一个新的进程组,这应该是shell内部的逻辑了
我感觉不用深究了,了解就行了
shell执行程序时自动创建一个新的进程组,这应该是shell内部的逻辑了
我感觉不用深究了,了解就行了
#12
请问终端是怎样建立一个进程组的 谢谢
#13
10楼的问题就是。为了支持JOB这样的概念。将管道链起来的一组进程,划归到一个进程组。置于前台。而shell自身则退居后台。
12楼的问题是。tcsetpgrp()可以设置前台进程组。
LZ的问题APUE里有解释的,不过要仔细慢慢看。我比较本。。。。看了好几遍。
#14
#15
谢谢yutaooo
#16
还有justkk neohope
谢谢大家
结贴
谢谢大家
结贴