1.getpgrp函数
进程组是一个或多个进程的集合。每个进程组有一个唯一的进程组ID。进程组ID类似于进程ID——它是一个正整数,并可存放在pid_t数据类型中。函数getpgrp返回调用进程的进程组ID。
每个进程组有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID。
进程组组长可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关。从进程组创建开始到其中最后一个进程离开为止的时间区间称为进程组的生命期。某个进程组中的最后一个进程可以终止,也可以参加另一个进程组。
2.setpgid函数
进程调用setpgid可以参加一个现存的组或者创建一个新进程组(用setsid也可以创建一个新的进程组)。
3.tcgetpgrp和tcsetpgrp函数
函数tcgetpgrp返回前台进程组ID,如果进程有一个控制终端,则该进程可以调用tcsetpgrp将前台进程组ID设置为pgrpid。pgrpid值应当是在同一对话期中的一个进程组的ID。filedes必须引用该对话期的控制终端。
大多数应用程序并不直接调用这两个函数。它们通常由作业控制shell调用。只有定义了POSIX_JOB_CONTROL,这两个函数才被定义了。否则它们返回出错。
4.作业控制
作业控制是伯克利在1980年左右加到UNIX的一个新特性。它允许在一个终端上起动多个作业(进程组),控制哪一个作业可以存取该终端,以及哪些作业在后台运行。作业控制要求三种形式的支持:
(1)支持作业控制的shell。
(2)内核中的终端驱动程序必须支持作业控制。
(3)必须提供对某些作业控制信号的支持。
我们可以键入一个影响前台作业的特殊字符一—挂起键(一般采用Ctrl-Z)与终端进行交互作用。键入此字符使终端驱动程序将信号SIGTSTP送至前台进程组中的所有进程,后台进程组作业则不受影响。实际上有三个特殊字符可使终端驱动程序产生信号,并将它们送至前台进程组,它们是:
(1)中断字符(一般采用DELETE或Ctrl-C)产生SIGINT。
(2)退出字符(一般采用Ctrl-\)产生SIGQUIT。
(3)挂起字符(一般采用Ctrl-Z)产生SIGTSTP。
5.孤儿进程组
一个父进程已终止的进程称为孤儿进程(orphan process),这种进程由init进程收养。