2013-03-04 46 views
4

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

但是aio_write有同样的问题?我不认为它确实如此,但在文档中没有提及它,但我找不到任何说明不会发生的事情。

+0

[This other answer](http://stackoverflow.com/a/3697738/478288)表示它。 – chrisaycock 2013-03-04 16:55:32

+0

@chrisaycock,真的,但它也说他从来没有真正使用aio_ *,所以他可能会被误认为。 – cjm 2013-03-04 17:03:35

+0

调用者不需要多次调用'aio_write()'将整个缓冲区传递给'aoi_write()'。但是,这并不能保证传入的整个缓冲区都将被写入。对'aio_error()'的最终调用给出**整个异步I/O操作的结果。 – alk 2013-03-04 17:29:58

回答

1

this页面上的错误代码列表不包括EINTR,这是errno中的值,意思是“请再次打电话做更多的工作”。所以,不需要再次调用aio_write来写同一段数据。

这并不意味着您可以依靠每个写入完成。例如,您仍然可以获得部分写入,因为磁盘已满或其他类型。但你不需要检查EINTR并“再试一次”。

+0

“这个页面”应该是一个链接吗? – cjm 2013-03-04 16:59:33

+1

另外,如果在写入任何数据之前信号中断它,'write'只返回'EINTR'。否则,它返回成功,但返回写入的字节数小于请求的数量。 – cjm 2013-03-04 17:01:42

+0

修正了这个链接[我的浏览器决定重新启动,所以我在做的事情上有点“迷失” - 应该尝试另一个浏览器,但FF通常很不错]。 – 2013-03-04 17:05:13

1

简短的回答

剔除错误的任何情况下:实用是,theoratical不一定。

龙答案

从我的经验的调用者不需要调用aio_write(),曾多次编写使用aoi_write()整个缓冲区。

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

总之文档没有明确排除了对aio_return()回报值小于字节写出来的量最终调用原调用aio_write(),确实需要被解释成什么规定的情况下那就不是整个缓冲区都会被发送出去,在这种情况下,有必要再次调用aio_write()来传递已被指示为被前一个调用写入的内容。