gpt4 book ai didi

c - SIGINT 信号后进程终止

转载 作者:太空狗 更新时间:2023-10-29 12:09:20 25 4
gpt4 key购买 nike

我不明白这里发生了什么,我有一个处理 SIGINT 信号然后生成子进程的父进程。当我按下 Ctrl+C 时,我期望的是两个进程都将打印“SIGINT received”然后继续,但结果是父进程在收到 SIGINT 后死亡,但是 child 还在。我无法理解。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <sys/signal.h>
#include <string.h>

void handler (int sig) {
printf("SIGINT received\n");
}

void child() {
while (1) {
printf("I'm the child\n");
sleep(1);
}

exit(0);
}

int main(int argc, char *argv[]) {
struct sigaction act;

memset(&act, 0, sizeof(act));

act.sa_handler = &handler;
// Link SIGINT with the handler
sigaction(SIGINT, &act, NULL);

// Create child
if (fork() == 0) child();

wait(NULL);

return 0;
}

执行示例:

$ ./test_signals
I'm the child
^CSIGINT received
I'm the child
SIGINT received
$ I'm the child
I'm the child

所以两个进程都处理 SIGINT 但父进程死了而子进程继续...

最佳答案

父进程在 main 函数中被阻塞,并在收到信号后对其进行处理,并从对 wait 的调用返回错误。

child 只是在处理 SIGINT 的 while 中循环。当处理的代码返回到它原来的位置(可能在 sleep 中被阻塞)并继续循环。

这段代码可以说明发生了什么:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <sys/signal.h>
#include <string.h>
#include <sys/errno.h>

void handler (int sig) {
printf("SIGINT received %d\n",getpid());
}

void child() {
while (1) {
printf("I'm the child\n");
sleep(1);
}

exit(0);
}

int main(int argc, char *argv[]) {
struct sigaction act;

memset(&act, 0, sizeof(act));

act.sa_handler = &handler;
// Link SIGINT with the handler
sigaction(SIGINT, &act, NULL);

// Create child
if (fork() == 0) child();

int r = wait(NULL);
if (r==-1 && errno==EINTR) printf("signal probably received in parent\n");

return 0;
}

请注意,禁止在信号处理程序中调用 printf

关于c - SIGINT 信号后进程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52804701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com