首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >aio_write误差

aio_write误差
EN

Stack Overflow用户
提问于 2015-07-08 11:19:53
回答 1查看 241关注 0票数 1

我正在将一个write重写为aio_write,这样我就可以处理超时问题(而且我不想麻烦于select)。我从手册页面中无法理解的一件事是,aio_write如何失败。

对于write,我最感兴趣的是部分写和EINTRaio_write (准确地说是aio_error)可以返回EINTR或部分写入吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-08 11:37:46

我从手册页面中无法理解的一件事是,aio_write如何失败。

aio_write(3)本身很少失败,只有当您给它糟糕的数据或者系统没有资源的时候。

另一方面,aio_error(3)是用来检查排队操作(或者可能已经完成)的状态的。

因此,是的,aio_error(3)可以在与write(2)返回它的条件相同的情况下返回它:如果在写入启动之前捕获了一个信号,并且信号处理程序返回(并且信号处理程序没有在struct sigactionsa_flags字段中使用SA_RESTART标志设置,否则syscall将自动重新启动,您将不会看到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的管道写入通道可能写入的字节比请求的要少。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31291136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档