进程组
每个进程除了有一进程I D之外,还属于一个进程组,进程组是一个或多个进程的集合。每个进程组有一个唯一的进程组I D。进程组I D类似于进程I D——它是一个正整数,并可存放在p i d _ t数据类型中。函数g e t p g r p返回调用进程的进程。
#include <sys/types.h>
#include <unistd.h>
pid_t getpgrp(void);
每个进程组有一个组长进程。组长进程的标识是,其进程组I D等于其进程I D。进程组组长可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。从进程组创建开始到其中最后一个进程离开为止的时间区间称为进程组的生命期。某个进程组中的最后一个进程可以终止,也可以参加另一个进程组。进程调用s e t p g i d可以参加一个现存的组或者创建一个新进程组
#include <sys/types.h>
#include <unistd.h>
int setpgid(pid_pt i d, pid_t p g i d);
这将pid 进程的进程组I D设置为p g i d。如果这两个参数相等,则由pid 指定的进程变成进程组组长。一个进程只能为它自己或它的子进程设置进程组I D。在它的子进程调用了e x e c后,它就不再能改变该子进程的进程组I D。如果p i d是0,则使用调用者的进程I D。另外,如果p g i d是0,则由p i d指定的进程I D被用作为进程组I D。
对话期
对话期(s e s s i o n)是一个或多个进程组的集合。进程调用s e t s i d函数就可建立一个新对话期。
#include <sys/types.h>
#include <unistd.h>
pid_t setsid(void);
如果调用此函数的进程不是一个进程组的组长,则此函数创建一个新对话期,结果为:
(1) 此进程变成该新对话期的对话期首进程( session leader,对话期首进程是创建该对话期的进程)。此进程是该新对话期中的唯一进程。
(2) 此进程成为一个新进程组的组长进程。新进程组I D是此调用进程的进程I D。
(3) 此进程没有控制终端(下一节讨论控制终端)。如果在调用s e t s i d之前此进程有一个控制终端,那么这种联系也被解除。
如果此调用进程已经是一个进程组的组长,则此函数返回出错。为了保证不处于这种情况,通常先调用fork,然后使其父进程终止,而子进程则继续。因为子进程继承了父进程的进程组ID,而其进程ID则是新分配的,两者不可能相等,所以这就保证了子进程不是一个进程组的组长。