进程关系

来源:互联网 发布:跟大叔滚床单知乎 编辑:程序博客网 时间:2024/04/28 10:25
p { margin-bottom: 0.08in; }

1 进程组

进程组是一个或多个进程的集合。每个进程组有一个唯一的进程组ID。每个进程组有一个组长进程。组长进程的标识是,其进程组ID等于其进程I D

进程组组长可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。从进程组创建开始到其中最后一个进程离开为止的时间区间称为进程组的生命期。某个进程组中的最后一个进程可以终止,也可以参加另一个进程组。

pid_tgetpgrp(void); 返回:调用进程的进程组ID

intsetpgid(pid_pt i d, pid_t p g i d);进程调用se t p g i d可以参加一个现存的组或者创建一个新进程一个进程只能为它自己或它的子进程设置进程组ID。在它的子进程调用了ex e c后,它就不再能改变该子进程的进程组ID

2 对话期

对话期(se s s i o n)是一个或多个进程组的集合。

pid_tsetsid(void); 建立一个新对话期。

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

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

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

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

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

3 控制终端

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

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

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

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

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

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

当对话期首进程打开第一个尚未与一个对话期相关联的终端设备时,S V R 4将此作为控制终端分配给此对话期。这假定对话期首进程在调用op e n时没有指定O N O CT T Y标志。



pid_ttcgetpgrp(inft i l e d e s) ; 函数tc g e t p g r p返回前台进程组ID,它与在f i l e d es上打开的终端相关。

int tcsetpgrp(infti l e d e s, pid_t p g r p i d) ; 如果进程有一个控制终端,则该进程可以调用tc s e t p g r p将前台进程组ID设置为p g r p i dpg r p i d值应当是在同一对话期中的一个进程组的IDf i l e d es必须引用该对话期的控制终端。

4 作业控制

① s h e ll并不在任何随意的时间打印后台作业的状态改变——它只在打印其提示符

之前这样做。如果不这样处理,则当我们正输入一行时,它也可能输出。

下列信号均送入作业控制中的前台进程组:

中断字符(一般采用DE L E T EC t r l - C)产生SI G I N T

退出字符(一般采用Ct r l - \)产生S I G Q UI T

挂起字符(一般采用Ct r l - Z)产生S I G T ST P

只有前台作业接收终端输入。如果后台作业试图读终端,那么这并不是一个错误,但是终端驱动程序检测这种情况,并且发送一个特定信号SI G T T IN给后台作业。这通常会停止此后台作业,而有关用户则会得到这种情况的通知,然后就可将此作业转为前台作业运行,于是它就可读终端。

Fg可以将后台运行的作业转为前台进程组(t c s e t p g r p),并将继续信号(S I G C O N T )送给该进程组。因为该作业现在前台进程组中,所以它可以读控制终端。

sttytostop 禁止后台作业向控制终端输出,默认情况下后台作业可以输出到控制终端。

5 shell执行程序


PPID:父进程ID

PID: 进程ID

PGID:进程组ID

SID: 对话期ID

TPGID:终端进程组ID

注意,说进程与终端进程组ID ( T P G ID)相关联是用词不当。进程并没有终端进程控制组。进程属于一个进程组,而进程组属于一个对话期。对话期可能有,也可能没有控制终端。如果它确有一个控制终端,则此终端设备知道其前台进程的进程组ID

6 孤儿进程组

一个父进程已终止的进程称为孤儿进程(orphanprocess),这种进程由in i t进程收养。

PO S I X . 1将孤儿进程组(orphaned processg r o up)定义为:该组中每个成员的父进程或者是该组的一个成员,或者不是该组所属对话期的成员。对孤儿进程组的另一种描述可以是:一个进程组不是孤儿进程组的条件是:该组中有一个进程,其父进程在属于同一对话期的另一个组中。如果进程组不是孤儿进程组,那么在属于同一对话期的另一个组中的父进程就有机会重新起动该组中停止的进程。


7 系统中的精灵进程

sy s l o g d精灵进程可用于任何为操作人员记录系统消息的程序中。可以在一台实际的控制台上打印这些消息,也可将它们写到一个文件中。

se n d m a i l是标准邮递精灵进程。

up d a t e程序定期将内核缓存中的内容写到硬盘上(通常是每隔30秒)。为了做到这一点,该程序每隔30秒调用sy n c2)函数一次。

cr o n精灵进程在指定的日期和时间执行指定的命令。许多系统管理任务是由cr o n定期地使相关程序执行而得以实现的。

in e t d精灵进程。它监听系统的网络界面,以输入对各种网络服务器的请求。

lp d处理对系统提出的各个打印请求。

8 精灵进程的编写规则

(1)首先做的是调用fo r k,然后使父进程ex i t。这样做实现了下面几点:第一,如果该精灵进程是由一条简单sh e l l命令起动的,那么使父进程终止使得sh e l l认为这条命令已经执行完成。第二,子进程继承了父进程的进程组ID,但具有一个新的进程ID,这就保证了子进程不是一个进程组的首进程。这对于下面就要做的se t s i d调用是必要的前提条件。

(2)调用se t s i d以创建一个新对话期。于是执行9. 5节中列举的三个操作,使调用进程:(a)成为新对话期的首进程,(b)成为一个新进程组的首进程,(c)没有控制终端。

3)将当前工作目录更改为根目录。从父进程继承过来的当前工作目录可能在一个装配的

文件系统中。因为精灵进程通常在系统再引导之前是一直存在的,所以如果精灵进程的当前工作目录在一个装配文件系统中,那么该文件系统就不能被拆卸。

另外,某些精灵进程可能会把当前工作目录更改到某个指定位置,在此位置做它们的工作。例如,行式打印机假脱机精灵进程常常将其工作目录更改到它们的sp o o l目录上。

(4)将文件方式创建屏蔽字设置为0。由继承得来的文件方式创建屏蔽字可能会拒绝设置某些许可权。例如,若精灵进程要创建一个组可读、写的文件,而继承的文件方式创建屏蔽字,屏蔽了这两种许可权,则所要求的组可读、写就不能起作用。

(5)关闭不再需要的文件描述符。这样使精灵进程就不再持有从其父进程继承来的某些文

件描述符(父进程可能是sh e l l进程,或某个其他进程)。但是,究竟关闭哪些描述符则与具体的精灵进程有关,所以在下面的例子中不包含此步骤。可以使用程序2- 3中的op e n m a x函数来决定最高文件描述符值,并关闭直到该值的所有描述符。


原创粉丝点击