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"。 参见
广告
|