第九章 进程关系
进程组
每个进程组都有一个组长进程。组长进程的标识是,其进程ID等于进程组ID
组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。从进程组创建开始到其中最后一个进程离开为止的时间成为一个进程组的生存期。进程中的最后一个进程可以终止,或者转移到另外一个进程组。
pid_t getgpid()或者进程所在的进程组ID
进程可以通过int setpgid(pid_t pid, pid_t pgid)来加入一个现有的组或者创建一个新进程组
setpgid 函数将pid进程的进程组ID设置为pgid ,如果这两个参数相等,则由pid制定的进程变成进程组的组长,如果pid 等于0 则使用调用者的进程ID,另外,如果pgid是0,则由pid指定的进程将用作进程组ID。
一个进程只能为它自己或者他的子进程设置进程组,
会话
会话是一个或者多个进程组的集合。
进程通过调用pid_t setsid()建立一个新会话。
如果调用次函数的进程不是一个进程组的组长,则此函数就会创建一个新会话,结果发生3件事
1 进程变成新会话首进程,此时该进程为新会话中的唯一进程
2 该进程成为一个新进程的组长进程。新进程组ID是调用进程的进程ID
3 该进程没有控制终端,如果调用setsid之前该进程有一个控制终端,那么这种联系也会被中断。
如果该调用进程已经是一个进程组的组长,则此函数返回错误。
pid_t getsid(pid_t pid)
如果pid是0的话,getsid返回调用进程的会话首进程的进程组ID
控制终端
会话和进程组有的一些其他特性。
1 一个会话可以有一个控制终端。这通常是登陆到其上的终端设备或者伪终端设备。
2 建立与控制终端连接的会话首进程被称为控制进程。
3 一个会话中的几个进程可以分成一个前台进程组,以及一个或者几个后台进程组
4 如果一个会话有一个控制终端,那么他就有一个前台进程组,会话中的其他进程则为后他进程组。
5 无论何时键入终端的中断键,就会将中断信号发送给前台进程的所有进程。
6 无论何时键入终端的退出键,就会将退出信号发送给前台进程组中的所有进程。