
関数を使用すると、次のようにwait
例1.1を実行するとSIGCHLD
信号が消費されます。wait
サンプル1.1
if (pid==0){
printf("child\n");
printf("%d\n",pid);
}
else{
printf("Parent\n");
printf("%d\n",pid);
wait(NULL);
sleep (10);
}
この関数を省略した例1.2(以下)を実行すると、wait
子プロセスは失敗します。wait
関数が信号を処理するのはなぜですかSIGCHLD
?
例1.2
if (pid==0){
printf("child\n");
printf("%d\n",pid);
}
else{
printf("Parent\n");
printf("%d\n",pid);
sleep (10);
}
答え1
あなたの2つのサンプルを読むことはできますが、あなたの質問はほとんど意味がありません。
POSIX / Single Unix仕様バージョン4、2018版によると、プロセスが子プロセスの状態を無視したいことをシステムに明示的に示していない場合:
ステータス情報(終了ステータスコードなど)を生成する必要があります。
[Exit]プロセスはゾンビプロセスに置き換える必要があります。 ...
親プロセスがプロセスの状態情報を取得すると、プロセスのライフサイクルが終了します。
プロセスが終了するのを待っている間にwait()、waitid()、またはwaitpid()を呼び出すときに、呼び出しプロセスの親プロセス内の1つ以上のスレッドがブロックされると、その1つ(または存在する場合)がwaitidを呼び出すことになります。 ()WNOWAITを含む、可能であればそれ以上)このスレッドは、[終了した]プロセスのステータス情報を取得してブロックを解除する必要があります。
SIGCHLDは親プロセスに送信する必要があります。
最後に注意してください -SIGCHLD
常に作成してください(親がそれを無視するように指定しない限り)!
修正する
私はあなたのプログラムスニペットのうちの2つをテストしましたが、私の考えには妥当だと思います。どちらも正常に実行されます。以下は、2つの完全なプログラムソースコードとターミナル出力です。
完全な例1.1:
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = fork();
if( pid == 0 ) {
printf("child\n");
printf("%d\n", pid);
}
else {
printf("Parent\n");
printf("%d\n", pid);
wait(NULL);
sleep(10);
}
}
完全な例1.2:
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = fork();
if( pid == 0 ) {
printf("child\n");
printf("%d\n", pid);
}
else {
printf("Parent\n");
printf("%d\n", pid);
sleep(10);
}
}
//64-bit Mac Mini./
$ make s1 s2 ; ./s1 ; ./s2
make: `s1' is up to date.
make: `s2' is up to date.
Parent
46431
child
0
Parent
46449
child
0
//64-bit Mac Mini./
$