非阻塞文件openat()

时间:2010-08-10 20:09:02

标签: file-io linux-kernel

我想实现一个多线程,非阻塞文件打开。理想情况下,所需的解决方案是调用open()&让它立即返回,并执行诸如在open()操作实际完成时注册要调用(或处理信号或条件变量)的回调。为此,我编写了一个小的测试驱动程序,它创建多个同步线程并尝试打开同一个文件。我希望从openat()返回一个无效的文件描述符,并使用errno == EAGAIN,但是打开调用似乎总是阻塞,直到open成功完成。

对于非阻塞open(),是否有这种方法的实现?

提前致谢。

参考线程代码:

void* OpenHandler(void* args)
{

// Declarations removed

   Dir = "/SomeDir";

   if ((DirFd = open(Dir, O_RDONLY )) < 0) {
      printf("********Error opening Directory*******\n");
      return NULL;
   }


   do {

      FileFd = openat(DirFd, &FileName[DirLen], O_RDONLY | O_NONBLOCK);

      /* If open failed */
      if (FileFd == -1) {
         if (errno == EAGAIN)
            printf("Open would block\n");
         else {
            printf("Open failed\n");
            pthread_exit(NULL);
         }
      }
      else
         Opened = 1;

   } while (!Opened);

   pthread_exit(NULL);
}

1 个答案:

答案 0 :(得分:1)

open()openat() 总是一次性完全解析打开请求(通常,这不需要睡眠,但如果目录条目需要,则可以从磁盘或网络引入。)

要执行您想要的操作,您必须构建一个文件打开线程的线程池,代表您要继续工作的线程执行open(),并在打开完成时通知它。除非你在非常慢的网络文件系统上打开很多文件,否则我怀疑果汁是否值得挤压。