2010-08-10 11 views
0

Je voudrais implémenter un fichier multithread, non-bloquant ouvert. Idéalement, la solution désirée serait de faire un appel à open() & pour le renvoyer immédiatement, et faire quelque chose comme enregistrer un rappel à appeler (ou gérer un signal, ou une variable conditionnelle) quand l'opération open() est réellement terminée . À cette fin, j'ai écrit un petit pilote de test qui crée plusieurs threads simultanés et essaie d'ouvrir le même fichier. J'aurais espéré que le retour de openat() soit un descripteur de fichier invalide, avec errno == EAGAIN, mais l'appel ouvert semble toujours bloquer jusqu'à ce que l'ouverture se termine avec succès.fichier non-bloquant openat()

Existe-t-il une implémentation de cette approche pour un open() non bloquant?

Merci d'avance.

Référence Code Sujet:

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); 
} 

Répondre

1

open() et openat()toujours résoudre complètement la demande d'ouverture d'un seul coup (normalement, il n'a pas besoin de dormir, mais il peut si les entrées du répertoire doivent être mis à partir du disque ou sur le réseau). Pour faire ce que vous voulez, vous devrez créer un pool de threads d'ouverture de fichiers, qui exécute le open() au nom du thread que vous voulez continuer à travailler et le notifier lorsque l'ouverture est terminée. Sauf si vous ouvrez beaucoup de fichiers sur des systèmes de fichiers réseau très lents, je doute que le jus vaille la peine.