名前


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 が pid として使用される。 pgid がゼロならば、 pid で指定されたプロセスのプロセスID が pgid として使用される。 setpgid() をプロセスをあるプロセス・グループから別のグループへ 移動するために使用する場合は(一部のシェルはパイプラインを生成 する時にこれを行う)、両方のプロセス・グループは同じセッションの 一部でなければならない。この場合は pgid は参加すべき既存の プロセス・グループを指定し、そのセッション ID は参加するプロセスの セッション ID に一致しなければならない。

getpgid() は pid で指定されたプロセスのプロセス・グループID を返す。 pid がゼロならば、呼び出したプロセスのプロセスID が pid として使用される。

setpgrp() 呼び出しは setpgid(0,0) と等価である。

同様に、 getpgrp() は getpgid(0) に等しい。 各プロセス・グループはセッションのメンバーであり、各プロセスは そのプロセス・グループがメンバーであるセッションのメンバーである。

プロセス・グループはシグナルを配送する時や、端末(terminal)によって 入力の要求を調停(arbitrate)する時に使用される: 端末と同じプロセス・グループID を持つプロセスはフォアグランド として読み込みを行うことができ、その他のプロセスが端末から読み込みを 行なおうとした場合、シグナルによって中断(block)させられる。 これらのコールは csh(1) のようなプログラムによって、ジョブ・コントロール(job control)の 実装の際にプロセス・グループを作成するために使用される。 termios(3) に記述されている TIOCGPGRPTIOCSPGRP コールは制御端末のプロセス・グループを取得/設定するのに使用する。

もしセッションが制御端末を持っていて、CLOCAL が設定されておらず、 ハングアップが起きた場合、セッション・リーダーに SIGHUP が送られる。 セッション・リーダーが終了した場合にはその制御端末のフォアグランドの プロセス・グループに所属する全てのプロセスに SIGHUP シグナルが送られる。

プロセスの終了によってプロセス・グループが孤児になった場合で、 もし新たに孤児になったプロセス・グループのメンバーが停止すると、 新たに孤児になったプロセス・グループの全てのプロセスに SIGHUP シグナルに 続けて SIGCONT シグナルが送られる。

返り値


setpgid() と setpgrp() は成功した場合、ゼロを返す。エラーの場合は -1 を返し、 errno が適切に設定される。

getpgid() は成功した場合プロセス・グループを返す。 エラーの場合は -1 を返し、 errno が適切に設定される。

getpgrp() は常に現在のプロセスのプロセス・グループを返す。

エラー


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 に準拠している。 setpgrp() 関数は 4.2BSD に由来する。 getpgid() 関数は SVr4 に準拠している。

注意


fork(2) で作成された子プロセスは、親プロセスのプロセス・グループID を継承する。 execve(2) の前後でプロセス・グループID は保存される。

POSIX の setpgid() は BSD の setpgrp() 関数からきている。また System V にも同じ名前の関数があるが、これは setsid(2) と同じものである。

glibc でプロトタイプを得るためには、_XOPEN_SOURCE と _XOPEN_SOURCE_EXTENDED を両方とも 定義するか、"#define _XOPEN_SOURCE n" を用いる。 ここで n は 500 以上の整数である。

関連項目


getuid(2), setsid(2), tcgetpgrp(3), tcsetpgrp(3), termios(3), feature_test_macros(7)

openSUSE Logo

コンテンツ