2010-08-10 107 views
0

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

是否有这种方法的非阻塞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

open()openat()总是完全解决一个镜头(通常情况下,这并不需要睡眠开放性的要求,但它可以,如果目录条目需要提请从磁盘或通过网络进入)。

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