假设linux进程正在尝试从套接字读取()数据并在socked fd上被阻止。当它被信号中断时会发生什么? 它会以errno EINRPT返回还是继续在socket fd上读取()?
接收信号时是否有适用于所有系统调用的通用规则?
答案 0 :(得分:2)
在套接字的特定情况下,read(2)
被认为是一个缓慢的系统调用,因为它可以永久阻塞;因此,如果接收到已设置信号处理程序的信号,则可能发生以下两种情况之一:
SA_RESTART
的{{1}}字段中使用sa_flags
标志设置了信号处理程序,则在处理程序返回之后(以及如果)处理器返回时自动重新启动系统调用( handler不返回include,但不限于调用struct sigaction
或使用exit(3)
/ longjmp(3)
)的处理程序代码;在这种情况下,用户代码看不到setjmp(3)
。EINTR
标记,则系统调用过早返回,SA_RESTART
设置为errno
。有关通用规则,请参阅EINTR
,请特别注意信号处理程序中断系统调用和库函数