2011-03-26 94 views
6

readwrite函数(以及亲属等sendrecvreadv,...)可以在其他返回一个数小于所请求的读/写长度的字节如果信号中断(在某些情况下),以及或许也是如此。是否有一套明确的条件来解决这种情况何时会发生,还是主要取决于实施?下面是我感兴趣的解答一些具体问题:什么情况下可能发生短的读/写?

  • 如果信号处理程序不中断(SA_RESTART),这将导致之前被传输的任何数据信号处理函数返回后重新启动中断的IO操作。但是如果已经发生部分读/写并且信号处理程序不中断,系统调用会立即以部分长度返回,还是会继续尝试读取/写入余数?
  • 当数据量少于请求数量时,显然读取函数可以返回网络,管道和终端文件描述符上的短读取。但是,在这些情况下,由于缓冲区大小有限,写入函数会返回短写入,还是会阻塞,直到写入所有数据?

我对所有三种标准要求的,通用的和Linux特定的行为感兴趣。

回答

2

对于你的第二个问题:写可以返回短写在有限的缓冲区大小,如果它是非阻塞

+0

http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html – 2011-03-26 13:57:14

+0

如果它阻塞,但是,是否有保证它不会返回短写入? (除非由信号引起) – 2011-03-26 14:16:13

+0

@R ..我不认为有保证。如果我没有犯错,还有其他情况下写入可能会失败:例如,如果网卡在操作系统写出一些数据时被移除,我认为即使在这种情况下写入也应该返回短字节。不确定这一点。我必须检查我的网络代码,我现在没有与我在一起。 – Heisenbug 2011-03-26 16:26:42

1

有可能会导致对常规文件写回到短尺寸至少有一个标准条件:

如果一个写()请求多个字节 被写入比有空间(对于 例如,[XSI]文件大小限制的过程或 介质物理末端的 ),仅作为 有很多字节,应该写出来十。例如,对于 示例,假设在达到 限制之前,文件中有多余空间可存储20个字节。写入512字节将使 返回20.下一次写入非零字节数将导致 故障返回(除了下面指出的 )。

相关问题