首页 文章

如果我在分叉之前在进程上注册自定义信号处理程序,后续子进程是否也会注册自定义信号处理程序?

提问于
浏览
1

当我们在父进程上调用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 回答

  • 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时,子进程将处于活动状态 .

  • 0

    一些注意事项:你对 stdio 的使用在信号和分叉方面都非常混乱 . 除非(粗略地说;详细规则可以在POSIX XSH 2.5.1中找到)在分叉之前刷新流,只有一个分叉的子代可以在fork之后继续使用给定的流(在你的情况下, stdout ) . 一般情况下,在按下Ctrl-C之前__64617_已达到while循环,这对您不会产生影响 .

    话虽如此,您的问题似乎是您的子进程立即退出:

    if (pid == 0) {
            return 0;
    }
    

相关问题