c - scanf函数和EINTR信号

标签 c linux signals scanf eintr

我正在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/

相关文章:

c - print_list 函数只打印链表中用户的第一个输入

c - 如何将多个 Fortran 字符串传递给 C?

java - 从 java 运行 linux 命令时出错

c# - Mono 上的 Azure TimerManager 的类型初始值设定项引发异常

c - sigpipe c 服务器/客户端 - 程序在哪里重新启动?

c - 终端访问控制问题

C 程序 :Error when reading character from stdin using scanf

c - C中的全局变量是自动变量吗?

linux - kubernetes pods 显示与主机不同的 ulimit 打开文件

linux - 向 linux 进程发送信号并拦截它们