Scanf没有等待输入

时间:2017-07-20 10:52:00

标签: c timer signals posix

我知道scanf等待输入。 但在这个程序中我写的是打印 无限循环中的 hello 。它不等我进入。

EmbeddedClass

输出:

timer expired 1 times
hello timer expired 2 times
hello timer expired 3 times
hello timer expired 4 times
hello timer expired 5 times
hello timer expired 6 times
hello timer expired 7 times

为什么?

1 个答案:

答案 0 :(得分:4)

POSIX平台上的scanf函数在其实现的某个地方使用read系统调用。当定时器信号发生时,read呼叫将中断并返回错误(EINTR),这也会导致scanf返回。您可以通过查看scanf 返回的内容来查看此内容。在这种情况下,它应该返回EOFerrno仍然设置为EINTR

对此的一个简单解决方案是要求信号重新启动中断的系统调用。这是通过在SA_RESTART结构sigaction成员中添加sa_flags标记来完成的:

sa.sa_flags = SA_RESTART;

更多信息可以在例如this POSIX sigaction reference