的read
和write
函数(以及亲属等send
,recv
,readv
,...)可以在其他返回一个数小于所请求的读/写长度的字节如果信号中断(在某些情况下),以及或许也是如此。是否有一套明确的条件来解决这种情况何时会发生,还是主要取决于实施?下面是我感兴趣的解答一些具体问题:什么情况下可能发生短的读/写?
- 如果信号处理程序不中断(
SA_RESTART
),这将导致之前被传输的任何数据信号处理函数返回后重新启动中断的IO操作。但是如果已经发生部分读/写并且信号处理程序不中断,系统调用会立即以部分长度返回,还是会继续尝试读取/写入余数? - 当数据量少于请求数量时,显然读取函数可以返回网络,管道和终端文件描述符上的短读取。但是,在这些情况下,由于缓冲区大小有限,写入函数会返回短写入,还是会阻塞,直到写入所有数据?
我对所有三种标准要求的,通用的和Linux特定的行为感兴趣。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html – 2011-03-26 13:57:14
如果它阻塞,但是,是否有保证它不会返回短写入? (除非由信号引起) – 2011-03-26 14:16:13
@R ..我不认为有保证。如果我没有犯错,还有其他情况下写入可能会失败:例如,如果网卡在操作系统写出一些数据时被移除,我认为即使在这种情况下写入也应该返回短字节。不确定这一点。我必须检查我的网络代码,我现在没有与我在一起。 – Heisenbug 2011-03-26 16:26:42