ジョブ制御をサポートしていないシェルには、フォアグラウンドとバックグラウンドプロセスの概念がありますか?

ジョブ制御をサポートしていないシェルには、フォアグラウンドとバックグラウンドプロセスの概念がありますか?

私は、一度シェルがジョブ制御をサポートしている場合にのみ、「フォアグラウンド」プロセスと「バックグラウンド」プロセス(グループ)の概念を持つことができると思いました。しかし、私はこれが事実ではないことを示唆する詩を読んだ。

~からアプエ第10.3条:

この信号状態動作の具体例は、対話型シェルがバックグラウンドプロセスに対する割り込み信号と終了信号を処理する方法である。ジョブ制御をサポートしていないシェルの使用バックグラウンドでプロセスを実行するとき、良い

cc main.c &

シェルは、バックグラウンド・プロセスの割り込みおよび終了信号処理を無視するように自動的に設定します。これは、中断文字を入力してもバックグラウンドプロセスに影響を与えないようにするためです。これが完了せず、割り込み文字を入力すると、フォアグラウンドプロセスだけでなく、すべてのバックグラウンドプロセスも終了します。


ところで、上記の例を考えてみると、

これが完了せず、割り込み文字を入力すると、フォアグラウンドプロセスだけでなく、すべてのバックグラウンドプロセスも終了します。

これはまた、フォアグラウンドプロセスとバックグラウンドプロセスが同時に同じ端末に接続できることを示すようである。これは本当ですか?ターミナルはフォアグラウンドプロセス(グループ)にしか付けられないといつも考えていたからだ。

ベストアンサー1

FWIW、「バックグラウンドプロセス」[1]、「制御端末」[2]、シェルの演算子などの概念は、&4.1BSDにのみ登場したタスク制御の概念よりも先にあります。

ジョブ制御が実装され標準化された後、ジョブ制御のないシェルのバックグラウンドプロセスの動作は、一種の「ジョブ制御ライト」として分析できます。ここで、 とは無視され、SIGINT標準入力はパイプからリダイレクトされ、SIGQUIT操作を開始します。ある種の模倣に対する背景作業の動作(ただし、まさにそこにはありません;-))。/dev/null&

これはまた、フォアグラウンドプロセスとバックグラウンドプロセスが同時に同じ端末に接続できることを示すようである。これは本当ですか?ターミナルはフォアグラウンドプロセス(グループ)にしか付けられないといつも考えていたからだ。

ジョブ制御のないシェルでは、同期(「フォアグラウンド」)または非同期(「バックグラウンド」)のいずれに関係なく、すべてのプロセスが実際に同じプロセスグループ(ジョブ)で実行されます。シェルプロセスの場合と同様に、バックグラウンドまたはフォアグラウンドジョブが可能です。ターミナル。

これらのプロセスはすべて、たとえばSIGINTシェル自体がフォアグラウンドプロセスグループにあり、端末からの^C入力が行われると、対応する「バックグラウンドモード」は信号を無視してシミュレートされますSIGINT。魔法残りコマンドが&シェルスクリプトから開始されると、独自のSIGINTハンドラがインストールされます。

通常、シェルスクリプトが実行されます。いいえset -mこのオプションを使用しない限り、ジョブ制御。

[1]「初心者のためのUnix」の「The Shell」の章を参照してください。部分Unix v6展開(1975)。

[2]「タイプライターを操る」から殺す(2)Unix v6と同じマンページです。

おすすめ記事