以下で詳しく説明するコマンドを使用して、シーケンスをバックグラウンドまたはフォアグラウンドとして設定するだけです。pid = fork()を使用して、最初に設定したい親または子で確実に実行します。親では、pid は子の PID になり、子では 0 になります。次のように使用します。
if(pid)
// Parent
else
// Child
プロセス
プロセス pid は、プロセス グループ pgid に入れられます。
setpgid(pid, pgid);
pgid == pid または pgid == 0 の場合、プロセス グループ リーダー pid を持つ新しいプロセス グループが作成されます。それ以外の場合、これは pid を既存のプロセス グループ pgid に入れます。ゼロ pid は、現在のプロセスを参照します。setpgrp() の呼び出しは、setpgid(0,0) と同等です。
前景
セッション内のプロセス グループのうち、最大 1 つがそのセッションのフォアグラウンド プロセス グループになることができます。tty 入力と tty シグナル (^C、^Z などによって生成されるシグナル) は、このフォアグラウンド プロセス グループのプロセスに送られます。
プロセスは、tcgetpgrp(fd) を使用して、そのセッションでフォアグラウンド プロセス グループを決定できます。ここで、fd はその制御 tty を参照します。存在しない場合、これはプロセス グループ ID ではない 1 より大きいランダムな値を返します。
プロセスは、tcsetpgrp(fd,pgrp) を使用して、そのセッションでフォアグラウンド プロセス グループを設定できます。ここで、fd はその制御 tty を参照し、pgrp はそのセッション内のプロセス グループであり、このセッションは引き続きそのセッションの制御 tty に関連付けられています。呼び出しプロセス。
どうやってfdを取得しますか?定義上、/dev/tty は制御 tty を指し、標準入出力のリダイレクトとは完全に無関係です。(制御端末の名前を取得する関数 ctermid() もあります。POSIX 標準システムでは、/dev/tty が返されます。) 制御 tty の名前を開くと、ファイル記述子 fd が得られます。
バックグラウンド
フォアグラウンド プロセス グループではないセッション内のすべてのプロセス グループは、バックグラウンド プロセス グループです。キーボードのユーザーはフォアグラウンド プロセスとやり取りしているため、バックグラウンド プロセスはそこから離れている必要があります。バックグラウンド プロセスが端末から読み取ると、SIGTTIN シグナルを受け取ります。通常、それはそれを停止します。ジョブ制御シェルはユーザーに通知し、このバックグラウンド プロセスをフォアグラウンド プロセスとして続行するよう fg と言うことができます。その後、このプロセスは端末から読み取ることができます。しかし、バックグラウンド プロセスが SIGTTIN シグナルを無視またはブロックする場合、またはそのプロセス グループが孤立している場合 (以下を参照)、read() は EIO エラーを返し、シグナルは送信されません。(実際、端末からの読み取りが現在許可されていないことをプロセスに伝えることが目的です。シグナルが表示されない場合は、エラーが返されます。)
バックグラウンド プロセスが端末に書き込むとき、SIGTTOU シグナルを受け取ることがあります。May: つまり、これが発生しなければならないというフラグが設定されている場合 (デフォルトではオフ)。フラグを設定するには
% stty tostop
そしてそれを再びクリアする
% stty -tostop
そしてそれを検査する
% stty -a