unix (Mac OS) 系统调用在什么情况下会在被信号中断后重新启动?手册页中的“调用已提交”是什么意思?

unix (Mac OS) 系统调用在什么情况下会在被信号中断后重新启动?手册页中的“调用已提交”是什么意思?

我正在读一本关于 UNIX 系统的书,并且正在讨论信号的部分。当谈到系统调用运行并收到信号时会发生什么时,我有点困惑。它表示操作系统read()在收到信号中断时会安排重新启动某些系统调用(例如)。

然而,当阅读信号的手册页时,它是这样的:

对于某些系统调用,如果在调用执行时捕获到信号并且调用提前终止,则调用会自动重新启动。任何使用 signal(3) 安装的处理程序都将设置 SA_RESTART 标志,这意味着任何可重新启动的系统调用在收到信号后都不会返回。受影响的系统调用包括通信通道或低速设备上以及 ioctl(2) 期间的 read(2)、write(2)、sendto(2)、recvfrom(2)、sendmsg(2) 和 recvmsg(2) ) 或等待(2)。然而, 已提交的调用不会重新启动,而是返回部分成功(例如,短读取计数)。这些语义可以使用 siginterrupt(3) 进行更改。

  1. “已提交的呼叫”是什么意思?

  2. 是否有可能因信号中断而导致读取无法正常运行?

  3. 如果由于信号导致读取失败(或行为不正常),我该如何避免这种情况?

非常感谢带有示例代码的答案。

相关内容