setpgid() - Unix、Linux系统调用 - 技术教程
Tutorials Point


  Unix入门
  Unix Shell编程
  高级Unix
  Unix实用参考
  Unix实用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考资料     讨论区     关于TP  

setpgid() - Unix、Linux系统调用


previous next AddThis Social Bookmark Button

广告

名称

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)中描述的TIOCGPGRPTIOCSPGRP调用用于获取/设置控制终端的进程组。

如果会话具有控制终端,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”。

参见



previous next Printer Friendly

广告


  

广告



广告
© . All rights reserved.