【问题标题】:non-blocking file openat()非阻塞文件 openat()
【发布时间】:2010-08-10 20:09:01
【问题描述】:

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

【问题讨论】:

    标签: file-io linux-kernel


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 2021-12-26
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多