Provided by: manpages-ja-dev_0.5.0.0.20180315+dfsg-1_all bug

名前

       setpgid, getpgid, setpgrp, getpgrp - プロセスグループの設定/取得を行う

書式

       #include <unistd.h>

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

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

       int setpgrp(void); /* System V version */
       int setpgrp(pid_t pid, pid_t pgid);  /* BSD version */

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       getpgid():
           _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* glibc 2.12 以降: */ _POSIX_C_SOURCE >= 200809L

       setpgrp() (POSIX.1):
           _SVID_SOURCE || _XOPEN_SOURCE >= 500 ||
           _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* glibc 2.19 以降: */ _BSD_SOURCE

       setpgrp() (BSD), getpgrp() (BSD) [glibc 2.19 より前]:
           _BSD_SOURCE &&
               ! (_POSIX_SOURCE || _POSIX_C_SOURCE || _XOPEN_SOURCE ||
                  _XOPEN_SOURCE_EXTENDED || _GNU_SOURCE || _SVID_SOURCE)

説明

       これらのインターフェースすべてが  Linux  で利用可能で、 これらを使ってプロセスのプロセスグ
       ループ  ID   (PGID)   の   取得や設定ができる。   推奨の、POSIX.1   で規定された方法では、
       getpgrp(void)  で呼び出し元プロセスの PGID を取得し、 setpgid()  で設定する。

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

       POSIX.1 バージョンの getpgrp()  は引き数を一つもとらず、  呼び出し元プロセスの  PGID  を返
       す。

       getpgid()   は pid で指定されたプロセスの PGID を返す。 pid がゼロならば、呼び出し元プロセ
       スのプロセス ID が pid として使用される。 (呼び出し元プロセス以外のプロセスの PGID  の取得
       が必要になることは めったになく、呼び出し元プロセスの PGID を取得するには POSIX.1 バージョ
       ンの getpgrp()  を使うのが望ましい。)

       System V バージョンの setpgrp()  は引き数を一つもとらず、 setpgid(0, 0) と等価である。

       BSD 仕様の setpgrp()  は pidpgid を引き数にとり、 以下を呼び出すラッパー関数である。

           setpgid(pid, pgid)

       glibc 2.19 以降、 BSD 固有の setpgrp() 関数はもはや <unistd.h> では公開されない。 この関数
       の呼び出しは上記の setpgid() の呼び出しで置き換えるべきである。

       BSD 仕様の getpgrp()  は pid だけを引き数にとり、 以下を呼び出すラッパー関数である。

           getpgid(pid)

       glibc 2.19 以降、 BSD 固有の getpgrp() 関数はもはや <unistd.h> では公開されない。 この関数
       の呼び出しは、引き数を取らない 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()  の仕様を廃止予定としている。

       引き数  1  個バージョンの getpgrp()  と引き数 2 個バージョンの setpgrp()  は 4.2BSD に由来
       し、 POSIX.1 では規定されていない。

注意

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

       各プロセスグループはセッションのメンバーであり、各プロセスは  そのプロセスグループが所属し
       ているセッションのメンバーである。

       セッションは制御端末 (controlling terminal) を持つことができる。  いつでも、セッションに所
       属するプロセスグループの一つ  (だけ) が 端末のフォアグランドのプロセスグループになることが
       でき、  残りのプロセスグループはバックグラウンドになる。  端末からシグナルが生成された場合
       (例えば、中断キーを叩いて SIGINT が生成されるなど)、そのシグナルはフォアグラウンドのプロセ
       スグループ に送られる (シグナルを生成する文字の説明は termios(3)  を参照)。 フォアグラウン
       ドのプロセスグループだけが端末からの read(2) ができる。 バックグラウンドのプロセスグループ
       が端末からの read(2)  を行おうとした場合、そのプロセスグループにはシグナル SIGTTIN  が送ら
       れ、そのプロセスグループは一時停止 (suspend) する。 関数 tcgetpgrp(3)  と tcsetpgrp(3)  を
       使うと、制御端末のフォアグラウンドのプロセスグループを 取得/設定できる。

       setpgid()   と  getpgrp()   は、  bash(1)   のようなプログラムで、シェルのジョブ制御  (job
       control) の実装のための プロセスグループを作成するのに使われる。

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

       プロセスの終了によってプロセスグループが孤児  (orphaned)  になった際に、  その新たに孤児に
       なったプロセスグループに停止しているメンバーがいれば、  その孤児になったプロセスグループに
       属す全てのプロセスに SIGHUP  シグナルに続けて  SIGCONT  シグナルが送られる。  孤児になった
       (orphaned) プロセスグループとは、 そのプロセスグループの全てのメンバーについて、メンバーの
       親プロセスが、 親プロセス自身もそのプロセスグループのメンバーか、 別のセッションに属すプロ
       セスグループのメンバーのいずれかであるような、 プロセスグループのことである。

関連項目

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

この文書について

       この  man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。