親プロセスには、すべての子プロセスが終了するのを待つように強制する方法がないことがわかります。しかし、これは次のルールです。また、子プロセスが終了する前に親プロセスが終了すると、子プロセスは孤児プロセスになります。内部にプロセス。しかし、私が理解していないのは、子プロセスが孤児になり、子プロセスによって採用された場合の問題ですか?内部にプロセス。終了するまで親プロセス自体に接続する必要があるのはなぜですか?
ベストアンサー1
この規則の主な理由は、プロセスが子プロセスを分岐する場合、通常は子プロセスが実行されることです。基本プロセスで実行されると予想される操作の一部です。 フォークと見なされるプログラムの例はありますか?
ここにいくつかの例があります。
- 集中的な計算を実行するプログラムは、複数のCPU /コアで同時に実行するために独自の複数のコピーをフォークできます。 (このためにスレッドを使用することはおそらくより伝統的かもしれませんが、確かにプロセスをフォークして実行できます。)このようなプログラム可能プロセスごとに単一の出力のみを作成するように設計されています。ただし、基本プロセスがすべての子プロセスが完了するのを待ってから結果をマージするのも一般的です。
- このようなプログラムには、
netcat
ホスト A から読み取ってホスト B に書き込む 1 つのプロセスと、ホスト B から読み取ってホスト A に書き込む別のプロセスがある場合があります。 (もちろんスレッドでも可能です。) find -exec
つまり、 の場合xargs
(メイン)プログラムの作業はスレーブプログラムを実行することです。 完了するまでお待ちください。 ユーザーが次のように言うとどうなるか想像してください。探す。 -type f -exec cp {} /backup';' &&rm -r。
find
すべてのコピーが完了するのを待たずに終了します。
このような場合(およびその他の場合)は、すべての子プロセスが完了するまで基本プログラムの操作は完了しません。したがって、プログラムはすべての子プロセスを待つ前に終了してはいけません。
もちろん、これがフォークを使用できる唯一の方法ではありません。ネットワークサーバー(FTPやメールなど)には、通常、着信接続を受信し、クライアント接続が行われるたびに子プロセスを分岐する基本プロセスがあります。これらのサブプロセスはいつでも(クライアントによって決定された)終了することができ、基本プロセスはサブプロセスを待つ理由はありません。
子プロセスが終了したときにどの「親」/リッパープロセスに関連付けられているかについての情報は実際には問題になりません。