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

廣告


  

廣告



廣告