setpgid() - Unix,Linux系统调用
广告
名称setpgid, getpgid, setpgrp, getpgrp - 设置/获取进程组概要
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
pid_t getpgid(pid_t pid);
int setpgrp(void);
pid_t getpgrp(void); 描述
setpgid() 将由pid指定的进程的进程组ID设置为pgid。如果pid为零,则使用当前进程的进程ID。如果pgid为零,则使用由pid指定的进程的进程ID。如果setpgid() 用于将进程从一个进程组移动到另一个进程组(例如,某些shell在创建管道时所做的那样),则这两个进程组必须属于同一个会话。在这种情况下,pgid指定要加入的现有进程组,并且该组的会话ID必须与加入进程的会话ID匹配。
getpgid() 返回由pid指定的进程的进程组ID。如果pid为零,则使用当前进程的进程ID。 调用setpgrp() 等效于setpgid(0,0)。 类似地,getpgrp() 等效于getpgid(0)。每个进程组都是一个会话的成员,每个进程都是其进程组所属会话的成员。 进程组用于分发信号,并由终端来仲裁对其输入的请求:与终端具有相同进程组的进程位于前台,可以读取,而其他进程如果尝试读取则会因信号而阻塞。因此,这些调用被诸如csh(1)之类的程序用于在实现作业控制时创建进程组。termios(3)中描述的TIOCGPGRP和TIOCSPGRP调用用于获取/设置控制终端的进程组。 如果会话具有控制终端,CLOCAL未设置并且发生挂起,则会话领导者将收到SIGHUP信号。如果会话领导者退出,则SIGHUP信号将发送到控制终端的前台进程组中的每个进程。 如果进程的退出导致进程组成为孤儿,并且如果新成为孤儿的进程组的任何成员都被停止,则将向新成为孤儿的进程组中的每个进程发送SIGHUP信号,然后是SIGCONT信号。
返回值成功时,setpgid() 和 setpgrp() 返回零。出错时,返回 -1,并且errno被相应地设置。
getpgid() 成功时返回一个进程组。出错时,返回 -1,并且errno被相应地设置。
getpgrp() 始终返回当前进程组。 错误
标签 | 描述 |
EACCES | 尝试更改调用进程的子进程之一的进程组ID,并且子进程已经执行了execve() (setpgid(), setpgrp())。 |
EINVAL |
pgid 小于 0 (setpgid(), setpgrp())。 |
EPERM | 尝试将进程移动到不同会话中的进程组,或更改调用进程的子进程之一的进程组ID,并且子进程位于不同会话中,或更改会话领导者的进程组ID (setpgid(), setpgrp())。 |
ESRCH | 对于getpgid():pid与任何进程都不匹配。对于setpgid():pid不是当前进程,也不是当前进程的子进程。 |
符合标准函数setpgid() 和 getpgrp() 符合 POSIX.1-2001。函数setpgrp() 来自 4.2BSD。函数getpgid() 符合 SVr4。注释通过fork(2)创建的子进程继承其父进程的进程组ID。进程组ID在execve(2)中保留。POSIX 从 BSD 函数setpgrp() 获取了setpgid()。System V也具有相同名称的函数,但它与setsid(2)相同。 要在glibc下获取原型,请同时定义_XOPEN_SOURCE和_XOPEN_SOURCE_EXTENDED,或者对大于或等于500的某个整数n使用“#define _XOPEN_SOURCE n”。 参见
广告
|