2010-08-10 79 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(),並在打開完成時通知它。除非你在非常緩慢的網絡文件系統上打開大量文件,否則我懷疑果汁是否值得擠壓。