您的位置:首页 > 其它

进程组、会话、控制终端、作业

2016-10-02 15:41 369 查看
1、进程组

同一进程组的各个进程接收来自同一终端的各种信号,每个进程由唯一的进程组id,利用getpgrp()或者getpgid(pid)来获取进程组id,每个进程中有一个组长进程,组长进程的id就是进程组的id,只有进程组中有一个进程存在该进程组就不会消失,与进程组长存在与否无关。某个进程组中的最后一个进程可以终止,也可以参加另一个进程组。

int setpgid(pid_t p i d, pid_t p g i d);

这将pid 进程的进程组 I D设置为p g i d。一个进程只能为它自己或它的子进程设置进程组 I D。

2、会话

进程调用setsid函数就可建立一个新会话期。

pid_t setsid(void); 返回:若成功则为进程组 I D,若出错则为-1。

如果调用此函数的进程不是一个进程组的组长,则此函数创建一个新对话期,结果为:

(1) 此进程变成该新对话期的对话期首进程( session leader,对话期首进程是创建该对话期的进程)。此进程是该新对话期中的唯一进程。

(2) 此进程成为一个新进程组的组长进程。新进程组 I D是此调用进程的进程I D。

(3) 此进程没有控制终端(下一节讨论控制终端)。如果在调用 s e t s i d之前此进程有一个控制终端,那么这种联系也被解除。

如果此调用进程已经是一个进程组的组长,则此函数返回出错。

为了保证不处于这种情况,通常先调用fork,然后使其父进程终止,而子进程则继续。因为子进程继承了父进程的进程组ID,而其进程ID则是新分配的,两者不可能相等,所以这就保证了子进程不是一个进程组的组长。

会话首进程是会话首进程的进程组ID。会话首进程是具有唯一进程ID的单个进程,所以可以将会话首进程的进程ID视为会话ID。

getsid函数,它返回一个进程的会话ID。(其中会话和会话期是同一个概念)

pid_t getsid(pid_t pid); 成功返回:会话首进程的进程组ID,失败返回-1

若pid是0,返回调用进程的会话首进程的进程组ID。限制:如果pid不属于该会话,则调用失败。

3、控制终端

•一个对话期可以有一个单独的控制终端(controlling terminal)。这通常是我们在其上登录的终端设备(终端登录情况)或伪终端设备(网络登录情况)。

• 建立与控制终端连接的对话期首进程,被称之为控制进程(controlling process)。

• 一个对话期中的几个进程组可被分成一个前台进程组(foreground process group)以及一个或几个后台进程组( background process group)。

• 如果一个对话期有一个控制终端,则它有一个前台进程组,其他进程组则为后台进程组。

• 无论何时键入中断键(常常是 D E L E T E或C t r l - C)或退出键(常常是C t r l - \),就会造成将中断信号或退出信号送至前台进程组的所有进程。

•如果终端界面检测到调制解调器已经脱开连接,则将挂断信号送至控制进程(对话期首进程)

4、作业

一个正在执行的进程组称为一个作业,作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。例如“nroff -man ps.1|grep kill|more”这个作业就同时启动了三个进程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息