当在Linux上使用阻止套接字,没有任何理由send()返回比请求少了什么,其他的不是中断,但部分成功send()的系统调用?
我知道这可能是非常实现的定义,并且即使没有任何已安装的信号处理程序依赖于该行为也可能是非常危险的(因此中断系统调用的原因).我可能会绕发送电话直到完成; 但是,如果有关于此事的任何官方消息,我将能够避免这种情况.
为什么假设send可能返回的数据少于在阻塞套接字上传输的请求数据?提出了同样的问题,结果不确定:中断的系统调用被提到作为一个简短的返回计数的例子,但仍然不清楚一个完整的TCP发送缓冲区是否会导致部分发送,或者send()只是阻塞,直到有足够的空间缓冲.
一般来说,如果传输缓冲区包含一些空间,但不足以满足整个发送请求,那么它将发送尽可能多的空间,然后返回实际添加到缓冲区的数量 - 短写入。
现在您可能会说阻塞(在阻塞套接字上)更有意义,但它不阻塞的原因是历史性的——TCP 基于 UNIX 管道,这就是 UNIX 管道的工作方式。主要原因是它使极端情况(在内核中)变得更容易——您不必担心阻止in the middle执行某些操作的系统调用;它要么执行某些操作并立即返回,要么不执行任何操作并阻塞,直到发生某个事件(此时内核从头开始重试)。您不必担心如果有人尝试在单次写入中写入超过最大缓冲区大小的数据(否则可能会导致死锁),会发生什么情况。