Выберите, чтобы заблокировать получение ENOSPC во время записи - PullRequest
0 голосов
/ 16 апреля 2019

Мое приложение постоянно записывает в файл через предохранитель. И когда в файле нет свободного места, мое приложение должно подождать, пока освободится место. Итак, в основном моя полная система выглядит следующим образом: Верхний слой: Application_1 Средний уровень: libfuse Нижний уровень: Application_2

Теперь Application_1 постоянно вызывает запись в файл, который доступен в Application_2 через libfuse. Таким образом, в определенном случае Application_2 не может разместить данные и возвращает ENOSPC в Application_1. При получении ENOSPC Application_1 должен ждать в файле FD для получения POLLOUT. И после получения ВЫВОДА в файл он должен возобновить запись ().

Для этого я использую API SELECT () для ожидания file_fd для получения POLLOUT. Следовательно, на ENOSPC я делаю следующее:

           fd_set fdSetWrite;
           FD_ZERO(&fdSetWrite);
           FD_SET(fd_write, &fdSetWrite);
           if (-1 == select(fd_write + 1, NULL, &fdSetWrite,NULL,0))
           {
              printf("\n\t\t error select ");
              close(fd_write);
              exit(0);
           }
           else
              printf("Select is unblocked\n");

           if (FD_ISSET(fd_write, &fdSetWrite))
           {
              printf("Write FD is Set");
           }

Но я вижу, что select () немедленно разблокируется. Application_2 здесь не устанавливает событие POLLOUT. Я заблокировал это для подтверждения. Но он разблокируется.

На самом деле не знаю, как это происходит.

1 Ответ

0 голосов
/ 16 апреля 2019

Не поддерживается механизм автоматической разблокировки при наличии свободного места на устройстве. Вам придется периодически повторять попытку.

...