File io 非阻塞文件openat()

File io 非阻塞文件openat(),file-io,linux-kernel,File Io,Linux Kernel,我想实现一个多线程、非阻塞的文件打开。理想情况下,理想的解决方案是调用open()&让它立即返回,并在open()操作实际完成时注册要调用的回调(或处理信号或条件变量)。为此,我编写了一个小的测试驱动程序,它创建多个并发线程并尝试打开同一个文件。我本来希望openat()返回的是一个无效的文件描述符,带有errno==EAGAIN,但是open调用似乎总是阻塞,直到open成功完成 对于非阻塞open(),是否有这种方法的实现 提前谢谢 参考线程代码: void* OpenHandler(voi

我想实现一个多线程、非阻塞的文件打开。理想情况下,理想的解决方案是调用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);
}
void*OpenHandler(void*args)
{
//删除声明
Dir=“/SomeDir”;
如果((DirFd=open(Dir,orduonly))<0){
printf(“*******打开目录时出错*********\n”);
返回NULL;
}
做{
FileFd=openat(DirFd,&FileName[DirLen],O_RDONLY | O_NONBLOCK);
/*如果打开失败*/
如果(FileFd==-1){
if(errno==EAGAIN)
printf(“打开将阻止\n”);
否则{
printf(“打开失败\n”);
pthread_exit(NULL);
}
}
其他的
开放=1;
}而(!打开);
pthread_exit(NULL);
}
open()
openat()
总是一次性完全解析打开请求(通常,这不需要休眠,但如果需要从磁盘或通过网络引入目录条目,则可以)

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