【问题标题】:scanf function and EINTR signalscanf 函数和 EINTR 信号
【发布时间】:2015-03-25 10:27:43
【问题描述】:

我在 Linux 平台上工作。 我有一个基于控制台的多线程应用程序,它为其他功能加载多线程共享对象库。 共享对象库在内部打开一个串行端口进行通信。 该库使用“打开”、“读取”和“写入”Linux 系统调用进行串行通信。串行通信使用信号处理程序来接收数据。 控制台应用程序中的主线程等待“scanf”语句,以获取用户的输入。

只要串行端口上有任何活动,就会生成信号,因此“scanf”调用会被 EINTR(中断的系统调用)中断。

有什么方法可以让'scanf'不会因为串口的读写操作而被中断?

【问题讨论】:

  • EINTR 是 errno 不是信号
  • 您可以尝试NONBLOCK 获取输入。它不会帮助你避免这种情况。
  • 是的,EINTR 是一个 errno。
  • 下面是我的代码 sn-p

标签: c linux signals scanf eintr


【解决方案1】:

如果您使用SA_RESTART 标志安装信号处理程序,read()write() 调用将不会在 Linux 中返回 EINTR 错误; scanf() 系列标准 I/O 函数也不会(因为它们在内部使用 read())。有关详细信息,请参阅man 7 signal 部分“信号处理程序中断系统调用和库函数”。尽管这种行为是特定于系统的,但我使用过的所有其他类 Unix 系统的行为方式都相同。 – Nominal Animal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2013-11-23
    • 2012-01-07
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多