【发布时间】:2021-03-07 15:17:12
【问题描述】:
我目前正在从事一个需要管理信号的项目。 我目前正在使用此代码
#include <stdio.h>
#include <signal.h>
void gest_sig_int(int signo) {
write(1, "I receive a signal\n", 19);
}
int main(void) {
struct sigaction s;
s.sa_handler = gest_sig_int;
s.sa_flags = 0;
sigemptyset(&s.sa_mask);
sigaction(SIGINT , &s, NULL);
while (1);
return (0);
}
我用编译
gcc test.c -o test
如果我执行代码并使用 CTRL + C 程序显示
./test
^CI receive a signal
这正是我想要的结果!
但是当我尝试用 timeout 命令做同样的事情时,我的程序会收到两次信号
timeout -s INT 2 ./test
I receive a signal
I receive a signal
不知道是来自我的程序还是命令timeout
感谢阅读!
【问题讨论】:
-
printf不是异步信号安全的。从信号处理程序调用它会产生未定义的行为。 -
即使我使用 write 而不是 printf 输出也是完全一样的
-
然后更新问题以呈现具有明确行为的代码会改进它。但这里更大的信息是不要从信号处理程序调用
printf。不要认为它没问题,即使它似乎在任何给定情况下都有你期望的结果。我见过失败的案例,而让自己接受这种失败是一个糟糕的策略。 -
好的,感谢我编辑帖子的信息
-
无法重现。
timeout只发送一个信号,我只看到程序的一行输出。