aio_write 的错误

Errors of aio_write

我正在将 write 重写为 aio_write,这样我就可以处理超时(而且我不想为 select 操心)。我从手册页中不明白的一件事是 aio_write 怎么会失败。

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

One thing that I don't understand from the man pages is how can the aio_write fail.

aio_write(3) 本身很少会失败,除非你给它错误的数据或系统资源不足。

另一方面,

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

所以,是的,aio_error(3) 可以 return EINTR 在与 write(2) return 相同的条件下:如果在写入之前捕获到信号已经启动,并且信号处理程序 returned(并且信号处理程序未在 struct sigactionsa_flags 字段中设置 SA_RESTART 标志,否则系统调用将是自动重新启动,您将看不到 EINTR).

至于部分写入,它也可能发生 - 同样,在与 write(2) 相同的条件下 - 但你无法从 [=11 的 return 值中检查这一点=].通常的流程如下:

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

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