【发布时间】:2013-01-06 17:23:53
【问题描述】:
我想经常将数据附加到本地文件系统上的文件中。我想在不阻塞太久的情况下做到这一点,并且不创建任何工作线程。在 Linux 内核 2.6.18 上。
似乎 Linux 上 glibc 的 POSIX AIO 实现创建了一个用户空间线程池并阻塞了这些线程。这很酷,但我可以轻松地剥离我自己的专用文件阻塞线程。
据我了解,Linux 内核 AIO 实现当前在追加时会阻塞。追加是我唯一想做的事情。
- http://code.google.com/p/kernel/wiki/AIOUserGuide
- https://groups.google.com/forum/#!msg/linux.kernel/rFOD6mR2n30/13VDXRTmBCgJ
我正在考虑使用 O_NONBLOCK 打开文件,然后在 EWOULDBLOCK 处进行一种懒惰的写入,然后再尝试写入。像这样的:
open(pathname, O_CREAT | O_APPEND | O_NONBLOCK);- 调用
write(),检查错误EAGAIN | EWOULDBLOCK - 如果
EAGAIN | EWOULDBLOCK,则只需保存要写入的数据,稍后再尝试write()。
这是个好主意吗?这有什么实际优势吗?如果我是唯一一个对该文件具有打开文件描述符的人,并且我尝试了write() 和EWOULDBLOCK,那么以后EWOULDBLOCK 的可能性会降低吗?它会不会EWOULDBLOCK?如果我write() 而不是EWOULDBLOCK,这是否意味着write() 会迅速返回?
换句话说,在 Linux 2.6.18 上,在什么情况下,write() 到本地文件会以EWOULDBLOCK 失败?
【问题讨论】:
-
“什么情况...” - 对于文件可能没有。
write(2)的 Linux 手册页指出 EWOULDBLOCK 只会为引用 socket 的文件描述符返回。 -
@sawdust 哦,我在阅读手册页时错过了这一点。这就是答案。如果您发布它,我会将其标记为答案。
标签: linux asynchronous io linux-kernel filesystems