我正在读一本关于 UNIX 系统的书,并且正在讨论信号的部分。当谈到系统调用运行并收到信号时会发生什么时,我有点困惑。它表示操作系统read()
在收到信号中断时会安排重新启动某些系统调用(例如)。
然而,当阅读信号的手册页时,它是这样的:
对于某些系统调用,如果在调用执行时捕获到信号并且调用提前终止,则调用会自动重新启动。任何使用 signal(3) 安装的处理程序都将设置 SA_RESTART 标志,这意味着任何可重新启动的系统调用在收到信号后都不会返回。受影响的系统调用包括通信通道或低速设备上以及 ioctl(2) 期间的 read(2)、write(2)、sendto(2)、recvfrom(2)、sendmsg(2) 和 recvmsg(2) ) 或等待(2)。然而, 已提交的调用不会重新启动,而是返回部分成功(例如,短读取计数)。这些语义可以使用 siginterrupt(3) 进行更改。
“已提交的呼叫”是什么意思?
是否有可能因信号中断而导致读取无法正常运行?
如果由于信号导致读取失败(或行为不正常),我该如何避免这种情况?
非常感谢带有示例代码的答案。