【问题标题】:Does aio_write always write the whole buffer?aio_write 是否总是写入整个缓冲区?
【发布时间】:2013-03-04 16:46:31
【问题描述】:

我知道 POSIX write 函数可以成功返回,即使它没有写入整个缓冲区(如果被信号中断)。您必须检查短写并恢复它们。

但是aio_write 有同样的问题吗?我不认为它会发生,但文档中没有提到它,而且我找不到任何说明它不会发生的东西。

【问题讨论】:

  • This other answer 说有。
  • @chrisaycock,是的,但它也说他从未真正使用过 aio_*,所以他可能弄错了。
  • 调用者无需多次调用aio_write() 即可将整个缓冲区传递给aoi_write()。然而,这并不能保证传入的整个缓冲区都会被写入。对aio_error() 的最终调用给出了整个异步I/O操作的结果。

标签: c linux posix aio


【解决方案1】:

简答

排除任何错误情况:实际可以,理论上不一定。

长答案

根据我的经验,调用者不需要多次调用aio_write() 来使用aoi_write() 写入整个缓冲区。

但这并不能保证传入的整个缓冲区确实会被写入。对aio_error() 的最终调用会给出整个异步 I/O 操作的结果,这可能表示错误。

无论如何,文档没有明确排除aio_return()的最终调用返回一个小于原始中指定的要写出的字节数的值调用aio_write(),确实需要将其解释为不会发送整个缓冲区,在这种情况下,有必要再次调用aio_write(),传入应该被指示为剩余写入的内容由上一次调用。

【讨论】:

    【解决方案2】:

    this 页面上的错误代码列表不包括EINTR,这是errno 中的值,表示“请再次调用以完成更多工作”。所以,不,您不需要再次调用aio_write 来写入相同的数据。

    这并不意味着您可以依赖每次写入的完成。例如,由于磁盘已满或类似情况,您仍然可以进行部分写入。但是您不需要检查EINTR 并“再试一次”。

    【讨论】:

    • “这个页面”应该是一个链接吗?
    • 另外,write 仅在信号在写入任何数据之前中断它时才返回 EINTR。否则,它返回成功,但返回写入的字节数小于请求的数量。
    • 修复了链接[我的浏览器决定重新启动,所以我在做的事情中有点“迷失”——应该尝试其他浏览器,但 FF 通常很好]。
    • @MatsPetersson:请不要链接到死页。这是一个臃肿的过时、非官方信息来源,也充满了广告。由于搜索引擎优化,它恰好出现在许多人的谷歌搜索结果中(搜索引擎优化通常有助于提高其搜索评级)。
    猜你喜欢
    • 2015-07-08
    • 2012-09-21
    • 2012-05-14
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多