aio_write的错误

时间:2015-07-08 11:19:53

标签: c linux aio

我正在重写writeaio_write,以便我可以处理超时(我不想打扰select)。我在手册页中无法理解的一件事是aio_write如何失败。

对于write我最感兴趣的是部分写入和EINTR。可以aio_write(确切地说aio_error)返回EINTR还是部分写?

1 个答案:

答案 0 :(得分:1)

  

我从手册页中无法理解的一件事是如何才能实现   aio_write失败。

aio_write(3)本身很少会失败,只要你给它不好的数据或系统资源不足。

另一方面,

aio_error(3)用于检查排队(或可能已经完成)操作的状态。

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

对于部分写入,它也可以在与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的管道写入通道可以写入比请求更少的字节。