当我们在父进程上调用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
有没有办法让子进程使用自定义处理程序?
2 回答
当你这样做:
你告诉孩子进程立即退出,所以他们永远不会有机会获得信号 . 相反,让孩子
break
离开循环:然后,当按下CTRL-C时,子进程将处于活动状态 .
一些注意事项:你对
stdio
的使用在信号和分叉方面都非常混乱 . 除非(粗略地说;详细规则可以在POSIX XSH 2.5.1中找到)在分叉之前刷新流,只有一个分叉的子代可以在fork之后继续使用给定的流(在你的情况下,stdout
) . 一般情况下,在按下Ctrl-C之前__64617_已达到while循环,这对您不会产生影响 .话虽如此,您的问题似乎是您的子进程立即退出: