进程组ID操作



进程关系

调用格式
       #include <unistd.h>

       int setpgid(pid_t pid, pid_t pgid); 
       pid_t getpgid(pid_t pid);

       pid_t getpgrp(void);                /* POSIX.1 version */
       pid_t getpgrp(psid_t pid);          /* BSD version */

       int setpgrp(void);                  /* System V version */
       int setpgrp(pid_t pid, pid_t pgid); /* BSD version */
描述:获取、设置一个进程的进程组id。所有这些接口都适用于linux中,不过普遍使用getpgrp来获取进程的组id,使用setpgid()来设置进程的组id


setpgid(pid_t pid, pid_t pgid)函数
pid = 0    设置调用进程的组id
pid > 0    设置指定pid进程的组id为pgid 
pgid = 0   设置置指定pid进程的组id为pid,创建一个进程组,pid进程为组长
如果要把一个进程从进程组A移动到进程组B,A和B必须是在同一个会话中。 


getpgrp(void)函数
返回调用进程的进程组id


getpgid(pid_t pid)函数
pid = 0     返回调用进程的进程组id
pid > 0     返回指定进程的进程组id


setpgrp(void)函数
等同于setpgid(0, 0)
    
setpgrp(pid_t pid, pid_t pgid)函数
等同于setpgid(pid, pgid)


getpgrp(psid_t pid)函数
等同于getpgrp(void)


返回值
 成功setpgid()和setpgrp()返回0,失败返回-1,设置errno
 getpgrp()返回调用进程的组id
 getpgid()和getpgrp(psid_t pid)成功返回进程组id,失败返回-1,设置errno

ERRNO错误定义
 EACCES  企图修改通过execve生成的子进程的进程组id(setpgid(),setpgrp())
 EINVAL  pgid<0(setpgid(), setpgrp())
 EPERM   1.企图把进程移动到另外一个不在同一个会话中的进程组
  2.企图修改调用进程的子进程的进程组,但子进程在另外一个会话中
  3.企图修改会话首进程的进程组id
  (setpgid(), setpgrp())
 ESRCH 1.getpgid()指定pid进程不存在
  2.setpgid()指定pid进程既不是调用进程也不是调用进程的子进程

注意
1.fork的子进程会从父进程继承组id,execve创建的子进程不会继承
2.一个会话可以有一个控制终端。在任何时候,尤其仅有一个会话中的进程组为前台进程组,会话中其他进程组为后台进程组。如果控制终端收到一个信号,信号会发给前台进程组。只有前台

进程组可以获取到该信号。如果后台进程想从控制终端获取信号,那么后台进程组发送SIGTSTP信号吧把前台进程挂起在调用函数tcsetpgrp来控制后台进程组成为前台进程组
3.如果一个会话有控制终端,这个控制终端标志位CLOCAL没有被设置,而且这个终端挂断了,那么会话首进程会发出SIGHUP信号。如果会话首进程终止结束,会发出SIGHUP信号给前台进程组中

的所有进程。
4.setpgid()和getpgrp()也可以用来作业控制
5.如果进程组中一个进程意外退出导致整个进程组成为孤儿进程,而且所有孤儿进程中有个进程结束了,那么信号SIGCONT和SIGHUP会发给每个孤儿进程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值