gpt4 book ai didi

c - SIGINT 信号仅被捕获一次

转载 作者:行者123 更新时间:2023-11-30 19:34:09 24 4
gpt4 key购买 nike

以下是此问题的简单重现:

void handler(int sig){
if(sig == SIGINT){
printf("Signal caught\n");
execl("./recreate","./recreate",NULL);
}
}

int main(){
printf("Main start\n");
signal(SIGINT,handler);
while(1);

return 0;
}

它只是在收到信号后再次自行运行。发生的情况是它只能从终端读取 CTR+C 一次。从第二点开始,只需在控制台上写入 ^C 即可。我是否需要每次都重置处理程序或类似的事情?提前致谢。

最佳答案

signal 是高度实现定义的,因此您应该使用 sigaction。您观察到的是信号的所谓 sysv 语义 - 信号在处理程序中重置为 SIG_DFL 并且不会阻止重新执行。

你可能想要这样的东西:

#include <unistd.h>
#include <signal.h>
#include <stdio.h>

#define WRITE_LIT(fd, lit) write(fd, lit, sizeof lit - 1)

void handler(int sig){
if(sig == SIGINT){
WRITE_LIT(2, "Signal caught\n");
execl("./recreate","./recreate", (char*)NULL);
WRITE_LIT(2, "Couldn't run ./recreate\n");
_exit(127);
}
}

int main(){
printf("Main start\n");
sigaction(SIGINT, &(struct sigaction const){
.sa_handler = handler,
.sa_flags = SA_NODEFER /*don't block signals for the new process image*/
},
0);
while(1);
return 0;
}

这不会重置信号,也不会阻止它(默认情况是在处理程序的持续时间内阻止它),因为新的进程镜像可能不希望它被阻止。

关于c - SIGINT 信号仅被捕获一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44288704/

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