親プロセスでSIGINT(ctrl + c)を呼び出すと、親プロセスがシグナルを子プロセスに中継することを理解しています。ただし、フォークする前にカスタムシグナルハンドラーを登録したと仮定すると、子プロセスは親プロセスと同じ方法でシグナルを処理しますか。例えば:
void interruptHandler(int sig) {
int thisPid = (int) getpid();
while (1) {
int childPid = wait(NULL);
if (childPid == -1) break;
printf("\t[%d] terminated.\n", childPid);
}
printf("PID[%d] Ended.\n", thisPid);
exit(1);
}
int main(int argc, char const *argv[]) {
if (signal(SIGINT, interruptHandler) == SIG_ERR) {
printf("Handler registration error");
}
for (int count = 0; count < 10; count++) {
int pid = fork();
if (pid == 0) {
return 0;
}
}
while (1);
return 0;
}
上記のプロセスの実行中にctrl + cを実行すると、親プロセスはカスタムハンドラーでのみシグナルを処理し、子プロセスはデフォルトハンドラーでシグナルを処理するという印象を与えます。
出力は次のようになります:1
子プロセスにカスタムハンドラーを使用させる方法はありますか?
これを行うとき:
for (int count = 0; count < 10; count++) {
int pid = fork();
if (pid == 0) {
return 0;
}
}
子プロセスにすぐに終了するように指示しているので、シグナルを取得する機会はありません。代わりに、子をbreak
ループから外します。
for (int count = 0; count < 10; count++) {
int pid = fork();
if (pid == 0) {
break;
}
}
次に、CTRL-Cを押すと、子プロセスがアクティブになります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加