标签:进程组 会话进程 首进程 setpgid getpgrp
进程关系
调用格式
#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会发给每个孤儿进程
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:进程组 会话进程 首进程 setpgid getpgrp
原文地址:http://blog.csdn.net/a1009563517/article/details/48153705