进程组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会发给每个孤儿进程
进程关系
调用格式
#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会发给每个孤儿进程
相关文章推荐
- UITableViewCell分割线从最左边开始和分割线颜色设置
- Struts(19)Struts集成
- Struts(18)标签
- Ubuntu Python 环境配置
- Android手势检测 带你打造支持图片缩放、平移预览(下)
- 【leetcode每日一题】25.Reverse Nodes in k-Group
- 在Root的手机上开启ViewServer,使得HierachyViewer能够连接
- struts(17)注释
- Struts(16)异常处理
- CSS hack
- 查看端口占用
- 一道试题引发的血案 int *ptr2=(int *)((int)a+1);
- 最优二叉搜索树
- JavaScript中innerHTML,innerText,outerHTML的用法及区别
- BootStrap4 中文版
- Linux下 Mysql安装的问题记录
- hibernate.cfg.xml文件连接mySql、Oracle、SqlServer配置
- Shortcuts Now Are Paid Back with Interest Later
- Struts(15)类型转换
- Struts(14)本地化/国际化(i18n)