1

我正在重写 awrite以便aio_write我可以处理超时(我不想打扰select)。我从手册页中不明白的一件事是如何aio_write失败。

因为write我最感兴趣的是部分写入和EINTR. 可以aio_writeaio_error准确地说)返回EINTR或进行部分写入吗?

4

1 回答 1

1

我从手册页中不明白的一件事是 aio_write 怎么会失败。

aio_write(3)本身很少失败,只有当你给它坏数据或系统资源不足时。

aio_error(3)另一方面,用于检查排队(或可能已完成)操作的状态。

所以,是的,aio_error(3)可以在返回它EINTR的相同条件下write(2)返回:如果在写入开始之前捕获了一个信号,并且信号处理程序返回(并且信号处理程序没有在字段中设置SA_RESTART标志,否则系统调用将自动重新启动,您将看不到)。sa_flagsstruct sigactionEINTR

至于部分写入,它也可能发生 - 再次,在与它相同的条件下write(2)- 但您无法从aio_error(3). 通常的流程如下:

  • 您调用aio_error(3)以查看操作是否正在进行或已完成(或已取消)。如果它返回 0 以外的任何值,那么要么是有错误,要么是在进行中,要么是被取消了。因此,实际上没有写入,您不能调用aio_return(3). 如果它正在进行中,请执行其他操作并稍后重试,或使用aio_suspend(3)等待它完成。
  • 如果aio_error(3)返回 0,则表示请求成功完成。部分写入被解释为成功。因此,您调用aio_return(3)以从发生的底层证券write(2)中获取实际返回值:此时您可以检查部分写入。

请注意,部分写入不一定是错误;这就是为什么aio_error(3)不这样对待他们。例如,O_NONBLOCK如果没有足够的容量来写入所有字节,则启用的管道写入通道可能写入的字节数少于请求的字节数。

于 2015-07-08T11:37:46.880 回答