我知道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
为什么?
答案 0 :(得分:4)
POSIX平台上的scanf
函数在其实现的某个地方使用read
系统调用。当定时器信号发生时,read
呼叫将中断并返回错误(EINTR
),这也会导致scanf
返回。您可以通过查看scanf
返回的内容来查看此内容。在这种情况下,它应该返回EOF
,errno
仍然设置为EINTR
。
对此的一个简单解决方案是要求信号重新启动中断的系统调用。这是通过在SA_RESTART
结构sigaction
成员中添加sa_flags
标记来完成的:
sa.sa_flags = SA_RESTART;
更多信息可以在例如this POSIX sigaction
reference