プロセスをフォークし、子プロセスをフォアグラウンドとバックグラウンドで実行するかどうかを決定するプログラムがあります。シグナル関数を呼び出して、フォークする前に子シグナルを処理し、死んだ子プロセスがゾンビにならないようにします。
これまでのところ、プログラムは正常に動作し、ユーザーが「&」を使用してコマンドを入力するたびに子プロセスを作成してバックグラウンドで実行し、ユーザーが「&」を使用せずにコマンドを入力するたびにフォアグラウンドで実行します。
しかし、私は非常に興味深い行動を見つけました。この一連の操作を次のように呼び出したとします。
sleep 5 &
ls
最初のコマンドは正常に動作し、親プロセスはスリープ 5 が終了するのを待ちません。ただし、「ls」を実行すると、そのフォルダー内のすべてのファイルが出力されますが (これは良いことです)、シェルがスタックして、前の「sleep 5 &」が終了するのを待っています...
なぜこれが起こるのですか?子プロセスと親プロセスのコード (分岐後) は、次のようになります。
if (pid == 0)
{
// child process, execute stuff
execv();
}
else if (pid > 0)
{
// parent process: call waitpid to wait for foreground child
}
私はいくつかの研究を試みましたが、私を助けることができるものを見つけることができません. execv() の前に呼び出して、子プロセスに「set session-id」を使用しようとしましたが、子プロセスが端末に何かを出力できなくなります。どんな助けでも大歓迎です。ありがとう!