неблокируемый файл openat () - PullRequest
0 голосов
/ 11 августа 2010

Я хотел бы реализовать многопоточный неблокирующий открытый файл. В идеале желаемым решением было бы сделать вызов open () и заставить его немедленно вернуться, и сделать что-то вроде регистрации обратного вызова для вызова (или обработки сигнала, или условной переменной), когда операция open () фактически завершена. , Для этого я написал небольшой тестовый драйвер, который создает несколько потоков одновременно и пытается открыть один и тот же файл. Я бы надеялся, что возвращаемое из openat () возвращение будет неверным файловым дескриптором с ошибкой == 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);
}

1 Ответ

1 голос
/ 11 августа 2010

open() и openat() всегда полностью разрешают открытый запрос за один раз (обычно это не требует сна, но это возможно, если записи каталога необходимо перенести с диска или по сети).

Чтобы сделать то, что вы хотите, вам нужно будет создать пул потоков, открывающих файлы, которые выполняют open() от имени потока, который вы хотите продолжить работать, и уведомляют его, когда открытие завершено. Если вы не открываете много файлов на очень медленных сетевых файловых системах, я сомневаюсь, что сок того стоит.

...