作业和session

现在我们从Session和进程组的角度重新来看登录和执行命令的过程。
1. getty 或telnetd进程在打开终端设备之前调用setsid函数创建一个新的Session,该进程称
为Session Leader,该进程的id也可以看作Session的id,然后该进程打开终端设备作为这
个Session中所有进程的控制终端。在创建新Session的同时也创建了一个新的进程组,该进
程是这个进程组的Process Group Leader,该进程的id也是进程组的id。

2. 在登录过程中,getty 或telnetd进程变成login ,然后变成Shell,但仍然是同一个进程,仍然
是Session Leader。
3. 由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就把自己提到前台,如
果原来的前台进程组还存在(如果这个子进程还没终止),则它自动变成后台进程组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值