我正在重写write
到aio_write
,以便我可以处理超时(我不想打扰select
)。我在手册页中无法理解的一件事是aio_write
如何失败。
对于write
我最感兴趣的是部分写入和EINTR
。可以aio_write
(确切地说aio_error
)返回EINTR
还是部分写?
答案 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
的管道写入通道可以写入比请求更少的字节。