我正在重写 awrite
以便aio_write
我可以处理超时(我不想打扰select
)。我从手册页中不明白的一件事是如何aio_write
失败。
因为write
我最感兴趣的是部分写入和EINTR
. 可以aio_write
(aio_error
准确地说)返回EINTR
或进行部分写入吗?
我从手册页中不明白的一件事是 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
如果没有足够的容量来写入所有字节,则启用的管道写入通道可能写入的字节数少于请求的字节数。