4

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

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

4

2 回答 2

1

简短的回答

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

长答案

根据我的经验,调用者不需要aio_write()多次调用就可以使用aoi_write().

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

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

于 2013-03-04T17:47:48.093 回答
1

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

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

于 2013-03-04T16:57:14.503 回答