gpt4 book ai didi

c - aio_write 的错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:12 26 4
gpt4 key购买 nike

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

对于write,我最感兴趣的是部分写入和EINTRaio_write(准确地说是aio_error)是否可以返回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) 可以在 write(2) 返回它的相同条件下返回 EINTR:如果信号在写入开始之前被捕获,信号处理程序返回(并且信号处理程序未使用 struct sigaction 的 sa_flags 字段中的 SA_RESTART 标志设置,否则系统调用将自动重新启动,您将看不到 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 的管道写入 channel 可能写入的字节数少于请求的字节数。

关于c - aio_write 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31291136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com