c - C 中的 Alarm() 和 SIGALRM 问题

标签 c signals alarm

我遇到了 SIGALRM 问题,似乎没有被触发。为了简化代码,我使用 signal() 而不是 sigaction() 。

目的是有一些循环读取,但在 x 秒后,在再次读取之前重新初始化所有变量。我为此使用了闹钟。

volatile sig_atomic_t restartBool;

void    catch_alarm(int sig)
{
    fprintf(stderr, "ALARM CALLED\n");
    restartBool = 1;
}

int     main(void)
{

     int n, fd_in = 0;
     char newChar;

    signal(SIGALRM, catch_alarm);

    while (1) {                     /* main loop */

            restartBool = 0;

            // Set a timer before we start reading
            alarm(2);

            while (restartBool == 0 && (n = read(fd_in, &newChar, 1)) == 1) {       /* parse input */
                /* ..... */
            }
            fprintf(stderr, "EXITED THE LOOP");

            // Cancel the alarm/timer
            alarm(0);
    }
}

catch_alarm() 函数中的 fprintf() 语句从未被调用,我不确定为什么(我在 Linux 上运行)。

任何帮助都会很好,

非常感谢,

贾里

最佳答案

很可能在计时器关闭之前,您的读取就返回了 0(没有剩余字节)。 IE,循环正在退出,因为您没有数据,然后您正在取消警报(尚未响起)。

关于c - C 中的 Alarm() 和 SIGALRM 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927934/

相关文章:

c# - PInvoke 找到一些函数,但找不到其他函数

c - -SIGCONT 不继续暂停的进程?

c - 为多个信号提供单个信号处理函数的正确方法是什么?

ios - 如何在应用程序关闭时执行操作?

android - AlarmManager 如何传递过去的警报?

C - BIO_get_fd() 总是无法获取有效的 FD

c - C 结构体的双指针内存分配

c - 使用c通过tcp套接字处理图像

python - Windows 的 Celery 任务超时/时间限制?

perl - 当 sleep() 不能很好地处理警报时,我还能做什么 'sleep'?