您的位置:首页 > 其它

进程组ID操作

2015-09-01 09:36 225 查看

进程关系

调用格式

#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会发给每个孤儿进程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: