【问题标题】:What are the conditions under which a short read/write can occur?什么情况下会发生短读/写?
【发布时间】:2011-07-23 11:49:15
【问题描述】:

如果被信号(在某些情况下),也许在其他情况下也是如此。是否有一套明确定义的条件来确定何时发生这种情况,还是很大程度上取决于实施?以下是一些我对答案感兴趣的特定问题:

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

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

【问题讨论】:

    标签: c posix signals


    【解决方案1】:

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

    【讨论】:

    • 如果它被阻塞,是否可以保证它不会返回短写入? (除非由信号引起)
    • @R.. 我认为不能保证。如果我没有出错,那么在其他情况下写入可能会失败:例如,如果在操作系统写出一些数据时移除了网卡。我认为即使在这种情况下写入也应该返回短字节。不确定。我必须检查我现在没有的网络代码。
    【解决方案2】:

    至少有一个标准条件会导致对常规文件的写入返回较短的大小:

    如果 write() 请求更多字节 写得比有空间(对于 例如,[XSI] 文件大小限制 过程或物理结束 介质),只有与那里一样多的字节 是余地应写。为了 例如,假设有 20 个空间 在到达之前的文件中的更多字节 限制。写入 512 字节将 返回 20. 下一次写入 a 非零字节数将给出 失败返回(除非另有说明 下面)。

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      相关资源
      最近更新 更多