標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 |
#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 を戻します。
⁄* 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