我想将数据经常附加到本地文件系统上的文件中。我想这样做而不会阻塞太长时间,并且不需要任何工作线程。在Linux内核2.6.18上。
似乎Linux上的glibc的POSIX AIO实现使用户空间线程池并阻止这些线程。这很酷,但我可以轻松地分离出我自己特殊的专用文件阻塞线程。
我的理解是Linux Kernel AIO实现目前阻止追加。追加是我唯一想做的事情。
我正在考虑使用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
究竟会在什么情况下({1}}失效?
答案 0 :(得分:3)
我不确定本地文件系统,但我很确定在尝试写入已挂载文件系统(例如nfs)上的文件时可以获得EWOULDBLOCK。这里的问题是,通常你不知道它是否真的是“本地”硬盘,除非你每次创建/打开文件时都要仔细检查。如何检查这当然是系统依赖的。
即使系统创建了一些额外的线程来进行实际的写操作,这个线程也会有一个缓冲区(不会是无限的),所以如果写得足够快,你就可以得到EWOULDBLOCK。
答案 1 :(得分:2)
在...什么情况下...将使用EWOULDBLOCK
将write()写入本地文件失败
也许没有文件的情况。 Linux man page for write(2)表示仅为引用套接字的文件描述符返回EWOULDBLOCK。
EAGAIN或EWOULDBLOCK
文件描述符fd引用套接字并且已被标记为非阻塞(O_NONBLOCK),并且写入将阻塞。 POSIX.1-2001允许在这种情况下返回错误,并且不要求这些常量具有相同的值,因此便携式应用程序应检查这两种可能性。
显然这种行为与套接字使用记录锁的事实有关,而一个简单的文件则不然。