Мое приложение постоянно записывает в файл через предохранитель. И когда в файле нет свободного места, мое приложение должно подождать, пока освободится место.
Итак, в основном моя полная система выглядит следующим образом:
Верхний слой: 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. Я заблокировал это для подтверждения. Но он разблокируется.
На самом деле не знаю, как это происходит.