我遇到了 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/