2

ジョブ制御を含む多くのことを実行できるミニ シェルを作成する必要があります。fork と execvp を使用して新しいジョブを作成することができました。しかし、execvp によって実行されるプログラムの終了コードも取得したいと考えています。他の投稿から調べたものから、 を使用してこれを行うことができますif(WIFEXITED(status))

ただし、ユーザーがシェルでプロセス名とともに「&」を入力した場合は、プロセスをバックグラウンドで実行する必要もあります。したがって、子プログラムがバックグラウンドで終了している間、親プロセスが待機するのを待つのは意味がありません。子プロセスが終了したことを親プロセスに通知するように設定できる割り込みはありますか? if(WIFEXITED(status))次に、ステートメントを使用して終了コードを取得できます。

sleep 100 &

フォアグラウンドで他のシェルコマンドを同時に実行できる間、バックグラウンドで実行されます。

4

1 に答える 1

3

あなたが特別なことをしなければ、親はSIGCHLD子供が亡くなったときに を受け取ります。ただし、複数の子が同時に終了する可能性があり、単一のシグナルを受け取ることに注意してください。これを処理する正しい方法は、(シグナル ハンドラで) ループすることです。

while (waitpid(-1, NULL, WNOHANG) > 0)
    /* Stuff. */
于 2012-11-10T07:25:08.160 に答える