我遇到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,由于您没有数据,因此正在退出循环,然后您将取消警报(警报尚未消除)。

10-06 09:53