linux session数量,linux Session与进程组

Shell分前后台来控制的不是进程而是作业(Job)或者进 程组(Process Group)。一个前台作业可以由多个进程组

成,一个后台作业也可以由多个进程组成,Shell可以同时运行一个前台作业和任意多个后台作业,这称为作业控制(Job

Control)。例如用以下命令启动5个进程(这个例子出自[APUE2e]):

$ proc1 | proc2 &

$ proc3 | proc4 | proc5

其中proc1和proc2属于同一个后台进程组,proc3、proc4、proc5属于同一个前台进

程组,Shell进程本身属于一个单独的进程组。这些进程组的控制终端相同,它们属于同一个Session。当用户在控制终端输入特殊的控制键(例如Ctrl-C)时,内核会发送相应的信号(例如SIGINT)给前台进程组的所有进程。各进程、进程组、Session的关系如下图所示。

图 34.4. Session 与进程组

a4c26d1e5885305701be709a3d33442f.png

现在我们从Session和进程组的角度重新来看登录和执行命令的过程。

getty或telnetd进程在打开终端设备之前调用setsid函 数创建一个新的Session,该进程称为Session Leader,

该进程的id也可以看作Session的id,然后该进程打开终端设备作为这个Session中所有进程的控制终端。在创建新Session的同时也创建

了一个新的进程组,该进程是这个进程组的Process Group Leader,该进程的id也是进程组的id。

在登录过程中,getty或telnetd进程变成login,然后变成Shell,但仍然是同一个进程,仍然是Session Leader。

由 Shell进程fork出的子进程本来具有和Shell相同的Session、进程组和控制

终端,但是Shell调用setpgid函数将作业中的某个子进程指定为一个新进程组的

Leader,然后调用setpgid将该作业中的其它子进程也转移到这个进程组中。如果这

个进程组需要在前台运行,就调用tcsetpgrp函数将它设置为前台进程组,由于一个

Session只能有一个前台进程组,所以Shell所在的进程组就自动变成后台进程组。

在上面的例子中,proc3、proc4、proc5被Shell放到同一个前台进程组,其中有一个进程是该进程组的Leader,Shell调用wait等待它们运行结束。一旦它们全部运行结束,Shell就调用tcsetpgrp函数将自己提到前台继续接受命令。但是注意,如果proc3、proc4、proc5中的某个进程又fork出子进

程,子进程也属于同一进程组,但是Shell并不知道子进程的存在,也不会调用wait等待 它结束。换句话说,proc3 |

proc4 | proc5是Shell的作业,而这个

子进程不是,这是作业和进程组在概念上的区别。一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程组还存在(如果这个子进程还没终止),

则它自动变成后台进程组(回顾一下例 30.3

“fork”)。

下面看两个例子。

$ ps -o pid,ppid,pgrp,session,tpgid,comm | cat

PID PPID PGRP SESS TPGID COMMAND

6994 6989 6994 6994 8762 bash

8762 6994 8762 6994 8762 ps

8763 6994 8762 6994 8762 cat

这个作业由ps和cat两个进程组成,在前台运行。从PPID列 可以看出这两个进程的父进程是bash。从PGRP列

可以看出,bash在id为6994的进程组中,这个id等于bash的进程id,所以它是进程组的Leader,而两个子进程在id为8762的进程组中,ps是这个进程组的Leader。从SESS可

以看出三个进程都在同一Session中,bash是Session

Leader。从TPGID可以看出,前台进程组的id是8762,也就是两个子进程所在的进程组。

$ ps -o pid,ppid,pgrp,session,tpgid,comm | cat &

[1] 8835

$ PID PPID PGRP SESS TPGID COMMAND

6994 6989 6994 6994 6994 bash

8834 6994 8834 6994 6994 ps

8835 6994 8834 6994 6994 cat

这个作业由ps和cat两个进程组成,在后台运行,bash不

等作业结束就打印提示信息[1]

8835然后给出提示符接受新的命令,[1]是作业的编号,如果同时运行多个作业可以用这个编号区分,8835是该作业中某个进程的id。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值