可以进行短读/写的条件是什么?

时间:2011-03-26 13:31:36

标签: c posix signals

readwrite函数(以及sendrecvreadv,...等亲属)可以返回少于如果被信号中断(在某些情况下),也可能在其他情况下,请求的读/写长度。是否存在明确定义的条件,以确定何时会发生这种情况,还是在很大程度上取决于实施?以下是我对以下答案感兴趣的一些特殊问题:

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

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

2 个答案:

答案 0 :(得分:2)

对于第二个问题:如果非阻塞

,写入可以返回有限缓冲区大小的短写入

答案 1 :(得分:1)

至少有一个标准条件可能导致在常规文件上写入以返回短大小:

  

如果write()请求更多字节   写的比有空间的   例如,[XSI]文件大小限制   过程或物理结束   一个媒体),只有那么多的字节   是写的空间。对于   例如,假设有20个空间   在到达之前文件中的字节数更多   限制。写入512字节   返回20.下一个写的   非零字节数会给出一个   失败的回归(除非另有说明)   下文)。