我想经常将数据附加到本地文件系统上的文件中。我想在不阻塞太久的情况下做到这一点,并且不创建任何工作线程。在 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 打开文件,然后在 if it 处进行一种惰性写入EWOULDBLOCK
,然后稍后再尝试写入。像这样的东西:
open(pathname, O_CREAT | O_APPEND | O_NONBLOCK);
- 调用
write()
,检查错误EAGAIN | EWOULDBLOCK
- 如果
EAGAIN | EWOULDBLOCK
,则只需保存要写入的数据并稍后再试write()
。
这是一个好主意吗?这有什么实际优势吗?如果我是唯一一个对该文件具有打开文件描述符的人,并且我尝试 a write()
and it EWOULDBLOCK
,那么以后的可能性会降低EWOULDBLOCK
吗?会EWOULDBLOCK
吗?如果我write()
和它没有EWOULDBLOCK
,这是否意味着write()
会迅速返回?
换句话说,在 Linux 2.6.18 上,在什么情况下(如果有的话)write()
本地文件会失败?EWOULDBLOCK