《unix高级环境编程》进程关系——进程组

       在UNIX 系统中,每个进程除了自己的进程 ID之外,还属于一个进程组。进程组是一个进程或多个进程的集合,进程组本身也有属于自己的进程组ID,进程组属于一个会话,fork()并不改变进程组ID。

进程组组长:
        进程ID与进程组ID相等的进程。组长可以改变子进程的进程组ID,使其转移到另一进程组。组长进程可以在所在的进程组创建进程,然后终止,从进程组创建开始到其中最后一个进程离开为止的时间区间称为进程组的生存期,进程组的最后一个进程可以终止或者转移到另一个进程组。

        可以通过以下函数获取进程组信息:

/* 进程组 */

/*
 * 函数功能:获取进程组ID;
 * 函数原型:
 */
#include <unistd.h>

pid_t getpgrp(void);    /* 返回值:调用进程的进程组ID */
pid_t getpgid(pid_t pid);/* 返回值:若成功则返回进程组ID,若出错则返回-1 */

/*
 * 函数功能:加入一个现有进程组或者创建一个新的进程组;
 * 返回值:若成功则返回0,若出错则返回-1;
 * 函数原型:
 */
int setpgid(pid_t pid, pid_t pgid);/* 将pid进程的进程组ID设置为pgid */
/* 说明:
 * 若两参数相等,则由pid指定的进程变成进程组组长;
 * 如果pid = 0,则使用调用者的进程ID;
 * 若pgid = 0,则由pid指定的进程ID将用作进程组ID;
 */
测试程序:

#include "apue.h"

int main(void)
{
    pid_t pid,fpid;

    if ((pid=fork())<0)
        err_sys("fork error");
    else if (0 == pid)
    {
        printf("The child process PID is %d.\n",getpid());
        printf("The child Group ID is %d.\n",getpgrp());
        printf("The child Group ID is %d.\n",getpgid(0));
    }
    else
    {
        fpid = getpid();
        sleep(3);
        setpgid(pid,fpid);
        printf("The parent process PID is %d.\n",fpid);
        printf("The parent Group ID is %d.\n",getpgrp());
    }
    exit(0);
}
输出结果:

The child process PID is 4475.
The child Group ID is 4474.
The child Group ID is 4474.
The parent process PID is 4474.
The parent Group ID is 4474.

参考资料:

《UNIX高级环境编程》


你可能感兴趣的:(进程组,Unix高级环境编程,进程关系)