我的应用程序通过保险丝连续写入文件。而且,只要文件中没有可用空间,我的应用程序就应该等到可用空间为止。
因此,基本上我的完整系统如下所示:
顶层: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事件。我已将其屏蔽以进行确认。但是它变得畅通无阻。

真的不知道这是怎么回事。

最佳答案

当设备上有可用空间时,没有受支持的机制来自动解除阻塞。您将必须定期重试。

关于c - 选择以在写入时接收ENOSPC时阻止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55715670/

10-10 17:12