linux C语言 进程组的概念 (pgid:process group id)(领头进程组长进程进程组的生存期)setpgid()setpgid()
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux C语言 进程组的概念 (pgid:process group id)(领头进程组长进程进程组的生存期)setpgid()setpgid()相关的知识,希望对你有一定的参考价值。
文章目录
进程组
进程组,每个进程组有一个领头进程。进程组是一个或多个进程的集合,通常它们与一组作业相关联,可以接受来自同一终端的各种信号。
获取调用进程进程组id(getpgrp)
每个进程组都有唯一的进程组ID(整数,也可以存放在pid_t类型中)。进程组由进程组ID来唯一标识。除了进程号(PID)之外,进程组ID也是一个进程的必备属性之一。
getpgrp: 获得进程组 id, 即领头进程的 pid
#include <unistd.h>
pid_t getpgrp(void);
//返回值;调用进程的进程组ID
设置进程组(setpgid)
每个进程组都有一个组长进程,组长进程的进程号等于进程组ID。组长进程可以创建一个进程组、创建该组中的进程。只要某个进程组中有一个进程存在,则该进程组就存在,与组长进程是否终止无关
。
从进程组创建开始到其中最后一个进程离开为止的时间区间称为进程组的生存期
。进程组中最后一个进程可以终止或者转移到另一个进程组中。
进程调用setpgid(setsid也可以)
可以参加一个现存的组或者创建一个新进程组。可以是前台进程组或后台进程组。
#include <sys/types.h>
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
//返回:若成功则为0,出错为-1
(基本:将pid指定的进程设置为进程组pgid中的一员)
这将pid进程的进程组ID设置为pgid。
- 如果pid是0,则使用调用者的进程ID。
- 另外,如果pgid是0,则由pid指定的进程ID被用作为进程组ID。(如setpgid(0, 0),将调用进程设置为进程组组长,进程组id为调用进程的进程号)
- 如果这两个参数相等,则由pid指定的进程变成进程组组长。
一个进程只能为它自己或它的子进程设置进程组ID
。在它的子进程调用了exec后,它就不再能改变该子进程的进程组ID。
在大多数作业控制shell中,在fork之后调用此函数,使父进程设置其子进程的进程组ID,然后使子进程设置其自己的进程组ID。这些调用中有一个是冗余的,但这样做可以保证父、子进程在进一步操作之前,子进程都进入了该进程组。否则依赖于哪一个进程先执行,就产生一个竞态条件。
(看不太懂上面的图。。。)
以上是关于linux C语言 进程组的概念 (pgid:process group id)(领头进程组长进程进程组的生存期)setpgid()setpgid()的主要内容,如果未能解决你的问题,请参考以下文章