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 sigaction
的 sa_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
的管道写入通道可能会写入比请求更少的字节,如果没有足够的容量来写入所有字节。
我正在将 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 sigaction
的 sa_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
的管道写入通道可能会写入比请求更少的字节,如果没有足够的容量来写入所有字节。