选择写入时阻止接收ENOSPC

时间:2019-04-16 19:51:10

标签: c select fuse

我的应用程序通过保险丝连续写入文件。而且,只要文件中没有可用空间,我的应用程序就应该等到可用空间为止。 因此,基本上我的完整系统如下所示: 顶层:Application_1 中间层:libfuse 下层:Application_2

现在,Application_1不断调用通过libfuse在Application_2中可用的文件上的写入。因此,在某些情况下,Application_2无法容纳数据,并将ENOSPC返回给Application_1。收到ENOSPC Application_1后,必须等待文件FD接收POLLOUT。并且在收到文件上的POLLOUT时,必须恢复write()。

为此,我正在使用SELECT()api等待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 :(得分:0)

不支持在设备上有可用空间时自动解除阻止的机制。您将必须定期重试。