SETPGID - Linux手册页

时间:2019-08-20 17:58:49  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2017-09-15

名称

setpgid,getpgid,setpgrp,getpgrp-设置/获取进程组

语法

#包括
#包括

int setpgid(pid_t pid,pid_t pgid);
pid_t getpgid(pid_t pid);

pid_t getpgrp(void); / * POSIX.1版本* /
pid_t getpgrp(pid_t pid); / * BSD版本* /

int setpgrp(无效); / 系统V版本/
int setpgrp(pid_t pid,pid_t pgid); / * BSD版本* /

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

getpgid():

_XOPEN_SOURCE>= 500 || / *自glibc 2.12起:* / _POSIX_C_SOURCE>= 200809L

setpgrp()(POSIX.1):

_XOPEN_SOURCE >= 500
        || /* Since glibc 2.19: */ _DEFAULT_SOURCE
        || /* Glibc versions <= 2.19: */ _SVID_SOURCE

setpgrp()(BSD),getpgrp()(BSD):

[These are available only before glibc 2.19]
    _BSD_SOURCE &&
        ! (_POSIX_SOURCE || _POSIX_C_SOURCE || _XOPEN_SOURCE ||
            _GNU_SOURCE || _SVID_SOURCE)

说明

所有这些接口在Linux上都可用,并且用于获取和设置进程的进程组ID(PGID)。 POSIX.1指定的首选实现方法是:getpgrp(void),用于检索调用进程的PGID;和setpgid(),用于设置进程的PGID。

setpgid()将pid指定的进程的PGID设置为pgid。如果pid为零,则使用调用进程的进程ID。如果pgid为零,则使pid指定的进程的PGID与其进程ID相同。如果使用setpgid()将一个进程从一个进程组移动到另一个进程组(如创建管道时某些shell所做的那样),则两个进程组必须是同一会话的一部分(请参阅setid(2)和凭据(7)) 。在这种情况下,pgid指定要加入的现有进程组,并且该组的会话ID必须与加入进程的会话ID相匹配。

不含任何参数的getpgrp()的POSIX.1版本将返回调用进程的PGID。

getpgid()返回pid指定的进程的PGID。如果pid为零,则使用调用进程的进程ID。 (检索除调用者之外的其他进程的PGID几乎是没有必要的,并且POSIX.1 getpgrp()是该任务的首选。)

系统V风格的setpgrp()不带任何参数,等效于setpgid(0,0)。

BSD特定的setpgrp()调用带有pid和pgid参数,是一个包装函数,它调用

setpgid(pid,pgid)

从glibc 2.19开始,特定于BSD的setpgrp()函数不再由;公开。调用应替换为上面显示的setpgid()调用。

BSD特定的getpgrp()调用(带有一个pid参数)是一个包装函数,它调用

getpgid(pid)

从glibc 2.19开始,特定于BSD的getpgrp()函数不再由;公开。调用应替换为不带任何参数的POSIX.1 getpgrp()调用(如果目的是获取调用者的PGID),或替换为上面显示的getpgid()调用。

返回值

成功时,setpgid()和setpgrp()返回零。如果出错,则返回-1,并正确设置errno。

POSIX.1 getpgrp()始终返回调用者的PGID。

getpgid()和BSD特定的getpgrp()成功返回一个进程组。如果出错,则返回-1,并正确设置errno。

错误说明

EACCES
试图更改调用进程的子进程之一的进程组ID,并且该子进程已经执行了execve(2)(setpgid(),setpgrp())。
EINVAL
pgid小于0(setpgid(),setpgrp())。
EPERM
试图将进程移至另一个会话中的进程组,或更改调用进程的子进程之一的进程组ID,并且该子进程位于另一个会话中,或更改进程的进程组ID。会话负责人(setpgid(),setpgrp())。
ESRCH
对于getpgid():pid与任何进程都不匹配。对于setpgid():pid不是调用进程,也不是调用进程的子级。

遵循规范

setpgid()和不带参数的getpgrp()的版本符合POSIX.1-2001。

POSIX.1-2001还指定了getpgid()和不带参数的setpgrp()的版本。 (POSIX.1-2008将此setpgrp()规范标记为过时。)

带有一个参数的getpgrp()版本和带有两个参数的setpgrp()版本源自4.2BSD,并且未由POSIX.1指定。

备注

通过fork(2)创建的子级继承其父级的进程组ID。 PGID在execve(2)中保留。

每个进程组是会话的成员,每个进程是其进程组是成员的会话的成员。 (请参阅凭据(7)。)

会话可以具有控制终端。在任何时候,会话中的一个(只有一个)进程组可以成为终端的前台进程组;其余的进程组在后台。如果从终端生成信号(例如,键入中断键以生成SIGINT),则该信号将发送到前台进程组。 (有关生成信号的字符的描述,请参阅termios(3)。)只有前台进程组才能从终端读取(2);只有前台进程组才能从终端读取(2)。如果后台进程组尝试从终端读取(2),则向该组发送SIGTTIN信号,该信号将挂起它。 tcgetpgrp(3)和tcsetpgrp(3)函数用于获取/设置控制终端的前台进程组。

诸如bash(1)之类的程序使用setpgid()和getpgrp()调用来创建进程组,以实现shell作业控制。

如果某个进程的终止导致一个进程组变为孤立进程,并且如果新孤立进程组的任何成员都已停止,则SIGHUP信号和SIGCONT信号将被发送到该新孤立进程组中的每个进程。一个孤立的流程组是其中流程组的每个成员的父级本身或者本身也是该流程组的成员,或者是另一个会话中的某个流程组的成员(另请参见凭据(7))。

另外参见

getuid(2),setsid(2),tcgetpgrp(3),tcsetpgrp(3),termios(3),凭据(7)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/