c - unix 中的信号/警报问题

标签 c unix signals alarm

问题一定很简单,但是..我不知道它是什么。它应该继续打印“alaarm”一段时间,但它只打印一次,然后程序就终止了:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>

void onAlarm();

void setupAlarm() {
 signal(SIGALRM, onAlarm);
 alarm(1);
}

void onAlarm() {
 setupAlarm();
 printf("alarmmmmmmmmmmmmmmmmm\n");
}

void main()
{
 setupAlarm();
 sleep(1000);
}

这里可能出了什么问题?去掉 sleep(1000) 会使程序立即终止(也就是说,甚至不显示那个“alaaarm”)。

回答

好的,下面的代码可以工作:

void onAlarm() {
    printf("alarmmmmmmmmmmmmmmmmm\n");
    alarm(1);
    sleep(1);
}

void main()
{
    signal(SIGALRM, onAlarm);
    alarm(1);
    sleep(2);
}

但我仍在努力解决这个问题,并试图理解为什么我需要这样编写代码。

最佳答案

哎呀,我之前的回答完全错误。查看调用 onAlarm() 时会发生什么:

  1. 它重置信号处理程序,

  2. 重置闹钟

  3. 取消之前的警报后,它再次开始等待。

什么代码路径实际上到达您对printf的调用?

关于c - unix 中的信号/警报问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4420163/

相关文章:

c - 动态内存分配问题

c - 输入长度未知的字符串

regex - diff 忽略一行内的模式,而不是整行

php - 将所有邮件重定向到文件

c - 使用 sigaction 处理信号

python - Scrapy 论坛抓取、项目管道和请求处理器之间的同步策略

c - 在 c-99 中使用快速排序

c - 字符串转换宏

创建文件,使用 lseek() 移动 1MB,然后将一个字节写入文件

process - SSH将信号转发到远程进程