我正在Linux平台上工作。 我有一个基于控制台的多线程应用程序,它加载用于其他功能的多线程共享对象库。 共享对象库内部打开一个串口进行通信。 该库使用“open”、“read”和“write”Linux 系统调用进行串行通信。串行通信使用信号处理程序来接收数据。 控制台应用程序中的主线程等待“scanf”语句,以获取用户的输入。
只要串行端口上有任何事件,就会生成信号,从而导致“scanf”调用被 EINTR(中断系统调用)中断。
有什么办法可以让“scanf”不会因为串行端口上的读写操作而被中断吗?
最佳答案
如果您使用 SA_RESTART
安装信号处理程序在 Linux 中,flag、read()
和 write()
调用不会返回 EINTR
错误;标准 I/O 函数的 scanf()
系列也不会(因为它们在内部使用 read()
)。请参阅man 7 signal “信号处理程序中断系统调用和库函数”部分了解详细信息。尽管此行为是特定于系统的,但我使用过的所有其他类 Unix 系统的行为方式都是相同的。 –Nominal Animal
关于c - scanf函数和EINTR信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29253086/