阻止系统调用接收信号会发生什么?

时间:2015-09-27 20:02:44

标签: linux process operating-system signals interrupt

假设linux进程正在尝试从套接字读取()数据并在socked fd上被阻止。当它被信号中断时会发生什么? 它会以errno EINRPT返回还是继续在socket fd上读取()?

接收信号时是否有适用于所有系统调用的通用规则?

1 个答案:

答案 0 :(得分:2)

在套接字的特定情况下,read(2)被认为是一个缓慢的系统调用,因为它可以永久阻塞;因此,如果接收到已设置信号处理程序的信号,则可能发生以下两种情况之一:

  1. 如果在SA_RESTART的{​​{1}}字段中使用sa_flags标志设置了信号处理程序,则在处理程序返回之后(以及如果)处理器返回时自动重新启动系统调用( handler不返回include,但不限于调用struct sigaction或使用exit(3) / longjmp(3))的处理程序代码;在这种情况下,用户代码看不到setjmp(3)
  2. 如果未设置EINTR标记,则系统调用过早返回,SA_RESTART设置为errno
  3. 有关通用规则,请参阅EINTR,请特别注意信号处理程序中断系统调用和库函数

    部分