【发布时间】:2011-12-24 09:16:03
【问题描述】:
这是Is a successful send() "atomic"? 的后续问题,因为我认为它实际上涉及一般的系统调用,而不仅仅是在套接字上发送。
哪些系统调用可以被中断,什么时候中断,中断在哪里处理?我了解了 SA_RESTART,但不完全了解发生了什么。
如果我在没有 SA_RESTART 的情况下进行系统调用,调用是否会被与我的应用程序无关但需要操作系统中止我的调用并执行其他操作的任何类型的中断(例如用户输入)中断?还是只被与我的进程直接相关的信号(CTRL+C,套接字关闭,...)打断?
设置 SA_RESTART 时,send() 或任何其他“慢”系统调用的语义是什么?它会一直阻塞直到我的所有数据都被传输或套接字关闭,还是它可以返回一个小于 send() 参数中的计数的数字?
在哪里实施了重新启动?操作系统是否知道我希望在任何中断时重新启动调用,或者是否有一些信号发送到我的进程然后由库代码处理?还是我必须自己做,例如将调用包装在一个 while 循环中,并根据需要经常重试?
【问题讨论】: