什么时候write()到文件返回EWOULDBLOCK?

时间:2013-01-23 09:23:57

标签: linux asynchronous io linux-kernel filesystems

我想将数据经常附加到本地文件系统上的文件中。我想这样做而不会阻塞太长时间,并且不需要任何工作线程。在Linux内核2.6.18上。

似乎Linux上的glibc的POSIX AIO实现使用户空间线程池并阻止这些线程。这很酷,但我可以轻松地分离出我自己特殊的专用文件阻塞线程。

我的理解是Linux Kernel AIO实现目前阻止追加。追加是我唯一想做的事情。

我正在考虑使用O_NONBLOCK打开文件,然后进行一种惰性写入,如果它EWOULDBLOCK,则稍后再次尝试写入。像这样:

  1. open(pathname, O_CREAT | O_APPEND | O_NONBLOCK);
  2. 致电write(),检查错误EAGAIN | EWOULDBLOCK
  3. 如果EAGAIN | EWOULDBLOCK,则只需保存要写入的数据,稍后再次尝试write()
  4. 这是个好主意吗?这有什么实际优势吗?如果我是唯一一个对该文件具有开放文件描述符的人,并且我尝试了write()并且EWOULDBLOCK,那么以后EWOULDBLOCK是否更不可能?会不会EWOULDBLOCK?如果我write()而不是EWOULDBLOCK,这是否意味着write()将迅速返回?

    换句话说,在Linux 2.6.18上,write()本地文件的EWOULDBLOCK究竟会在什么情况下({1}}失效?

2 个答案:

答案 0 :(得分:3)

我不确定本地文件系统,但我很确定在尝试写入已挂载文件系统(例如nfs)上的文件时可以获得EWOULDBLOCK。这里的问题是,通常你不知道它是否真的是“本地”硬盘,除非你每次创建/打开文件时都要仔细检查。如何检查这当然是系统依赖的。

即使系统创建了一些额外的线程来进行实际的写操作,这个线程也会有一个缓冲区(不会是无限的),所以如果写得足够快,你就可以得到EWOULDBLOCK。

答案 1 :(得分:2)

  

在...什么情况下...将使用EWOULDBLOCK

将write()写入本地文件失败

也许没有文件的情况。 Linux man page for write(2)表示仅为引用套接字的文件描述符返回EWOULDBLOCK。

  

EAGAIN或EWOULDBLOCK
      文件描述符fd引用套接字并且已被标记为非阻塞(O_NONBLOCK),并且写入将阻塞。 POSIX.1-2001允许在这种情况下返回错误,并且不要求这些常量具有相同的值,因此便携式应用程序应检查这两种可能性。

显然这种行为与套接字使用记录锁的事实有关,而一个简单的文件则不然。