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”。 參見
廣告
|