《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高级环境编程》


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值