3

だから私はC(UNIX用)でミニシェルを構築しています。パイプラインを機能させる方法を見つけたところですが、ゾンビの問題が発生しています。私が持っているとしましょう:

echo a | echo b | echo c

これは、"c" を出力すべきときに、何も出力しません。ただし、シェルに各サブコマンドを実行するように指示し、次のコマンドに進む前に待機すると、正常に動作します。ただし、待機しない場合に得られるパイプ間の自然な調整が必要なため、これは実際の解決策ではありません。

最後のコマンドが実行された後、すべてのゾンビを効率的に待機する方法を考案するのに苦労しています。最後の実行後、シェルが終了する前にこれを試しました:

while(waitpid(-1, NULL, WNOHANG) > 0);

しかし、運が悪い。これまでのところ、機能する唯一の方法は、シェルに各サブコマンドを実行するように指示し、次のコマンドを開始する前に待機することです。メインシェルファイル全体は次のとおりです。

http://pastebin.com/YV96mFy7

input(processline()) を処理する main 関数は 105 行目から始まります。

ご協力ありがとうございます。他に何か必要な場合はお問い合わせください。

4

1 に答える 1

4

これを変える

while(waitpid(-1, NULL, WNOHANG) > 0);

に:

while(wait(NULL) > 0);

/* which is equivalent to */
while(waitpid(-1, NULL, 0) > 0);

これにより、親プロセスはすべての子プロセスが終了するまで待機します。親プロセスをブロックしたくない場合は、代わりにシグナルハンドラーをキャッチSIGCHLDして呼び出します。wait()

于 2012-12-01T05:32:32.277 に答える