c - sigaction 只捕获一次信号
问题描述
考虑以下代码:
#include <signal.h>
#include <stdio.h>
void catch ()
{
printf("hi\n");
}
int main()
{
struct sigaction act;
act.sa_handler = catch;
sigaction(SIGINT, &act, NULL);
for(;;);
return 0;
}
当这个程序运行时。我第一次按CTRL-C时,它会打印“hi”。
但是第二次程序退出。这可能是什么原因?
我想要的是程序在每次发出信号时都会捕获它。
解决方案
如果您不使用任何 SA_FLAG 来明确定义“第一次捕获信号后要做什么”的行为,它应该可以工作。
清除sigaction的内容,然后初始化。
memset(&act,0,sizeof(act)); // clear contents first
act.sa_handler = catch;
sigaction(SIGINT, &act, NULL);
请参阅sigaction(2)。
此外,正如 Daniel 指出的那样,不要在信号处理程序中使用 printf。参见信号安全(7)
如果你想打印一些东西,或者只是在你的信号处理程序中做一些事情,你必须使用信号安全函数。在您的情况下,您可以使用 write() 系统调用,而不是使用 printf。见write(2)。
经过,
write(1,"hi\n",3); // 1 means standard out.
推荐阅读
- unity3d - Unity,如何使用 AsEnumerable
- apache - 同一个 httpd.conf 中的多个域
- c - Node-ffi 调用 c DLL 返回一个指针
- javascript - 如何替换超类的javascript方法进行测试?
- python - 'image' 属性没有与之关联的文件
- python - virtualenv 没有从 /usr/bin 自动选择 python3
- c - 如果按顺序声明可分割变量,它们的地址是否会递增
- ios - 如何以编程方式在 UIPageViewController 中放置自动布局约束?
- bash - 将 echo 命令的结果保存在 shell 脚本中?
- dataframe - 通过列中的唯一值连接两个 pyspark 数据帧