tcsetpgrp() - フォアグラウンド・プロセス・グループ ID の設定

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX_SOURCE
#include <unistd.h>

int tcsetpgrp(int fildes, pid_t newid);

機能説明

fildes によって参照された端末と関連した フォアグラウンド・プロセス・グループの プロセス・グループ ID (PGID) を設定します。この端末はプロセス呼び出し tcsetpgrp() の制御端末になって いなければならず、また現行の呼び出しプロセスのセッションと関連して いなければなりません。newid は、呼び出しプロセスと同じセッションで プロセスの PGID と一致していなければなりません。

端末と関連している PGID を設定すると、以前に端末と関連 していたプロセス・グループによる読み取りは失敗するか、あるいは プロセス・グループが SIGTTIN シグナルを停止することになります。また、書き込みはプロセスが (SIGTTOU シグナルを) 停止する原因に なったり、あるいは tcsetattr() がどのように SIGTTOU に対して TOSTOP や シグナル・オプションを設定するかよっては、正常に行われることが あります。

fildes は、制御端末を表している記述子 (標準入力、標準出力、および標準エラーなど) のいずれかの可能性があります。また、関数は、端末に使用中のファイル記述子から将来アクセスする ときに影響します。ファイル記述子を指定するときに、リダイレクトの使用を考慮して ください。

tcsetpgrp() が、呼び出し元の制御端末に対して バックグラウンド・プロセス・グループから呼び出されると、プロセスがどのように SIGTTOU を処理しているかによっては、SIGTTOU シグナルを生成できます。

SIGTTOU の処理 システムの動作
デフォルトまたはシグナル・ハンドラー SIGTTOU シグナルが生成され、関数は実行されません。tcsetpgrp() は -1 を戻し、errno を EINTR に設定します。
無視またはブロック SIGTTOU シグナルは送信されず、関数は正常に継続します。

戻り値

正常に実行された場合、tcsetpgrp() は 0 を戻します。

正常に実行されなかった場合、tcsetpgrp() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EBADF
fildes が、有効なオープン・ファイル記述子ではありません。
EINTR
シグナルが tcsetpgrp() 関数に割り込みました。
EINVAL
newid 値は、このインプリメンテーションによって サポートされません。
ENOTTY
プロセス呼び出し tcsetpgrp() に制御端末がないか、fildes が制御端末と関連していないか、あるいは 制御端末が呼び出しプロセスのセッションともはや関連していません。
EPERM
newid 値はインプリメンテーションによって サポートされていますが、プロセス呼び出し tcsetpgrp() と同じ セッションの任意のプロセスのプロセス・グループ ID と一致して いません。

CELEBT10
⁄* CELEBT10

   This example changes the PGID.

 *⁄
#define _POSIX_SOURCE
#include <termios.h>
#include <unistd.h>
#include <sys⁄wait.h>
#include <stdio.h>
#include <signal.h>

main() {
  pid_t pid;
  int status;

  if (fork() == 0)
    if ((pid = tcgetpgrp(STDOUT_FILENO)) < 0)
      perror("tcgetpgrp() error");
    else {
      printf("original foreground process group id of stdout was %d¥n",
             (int) pid);
      if (setpgid(getpid(), 0) != 0)
        perror("setpgid() error");
      else {
        printf("now setting to %d¥n", (int) getpid());
        if (tcsetpgrp(STDOUT_FILENO, getpid()) != 0)
          perror("tcsetpgrp() error");
        else if ((pid = tcgetpgrp(STDOUT_FILENO)) < 0)
          perror("tcgetpgrp() error");
        else
          printf("new foreground process group id of stdout was %d¥n",
                 (int) pid);
      }
    }

  else wait(&status);
}
出力:
original foreground process group id of stdout was 2228230
now setting to 2949128
new foreground process group id of stdout was 2949128

関連情報