ここでそれに応じて名前付き信号処理関数を作成しました。このハンドラはシグナル関数を使用してカーネルに登録され、マイサブプロセスがシグナルをhandler
生成すると呼び出されます。SIGCHLD
これは私のコードです
#include<stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void handler(int sig){
pid_t pid;
printf("The name of the PID=%d\n",getpid());
pid=wait(NULL);
printf("Pid %d exited \n",pid);
}
int main(){
signal(SIGCHLD,handler)
if(!fork()){
printf("This is the child process %d\n",getpid());
exit(1);
}
printf("Parent pid is %d\n",getpid());
printf("The parent is waiting");
return 0;
}
出力は次のとおりです
Parent pid is 4356
The parent is waitingThis is the child process 4357
私の質問は、ハンドラ関数を登録するために信号関数を使用してもハンドラが呼び出されない理由です。これは、私のハンドラが登録されていない場合にのみ発生します。なぜ?
ベストアンサー1
「親プロセスが待っています」と言い、数サイクル待ってから「0を返す」ことで終了します。 SIGCHLDを受信するには、子プロセスが操作を実行する前に親プロセスが終了しないことを確認する必要があります。
最も簡単な方法は次のとおりですreturn 0
。前に行を挿入します。
sleep(10);
これにより、両親が最大10秒間待機します。
あなたはあなたの両親に気付くでしょういいえ実際に10秒だけ待ってください。その理由は、読者に練習問題として残しました。 (ヒント:マニュアルページを読んでください;-)