选择在写入时阻止接收 ENOSPC

问题描述 投票:0回答:1

我的应用程序正在通过熔断器不断写入文件。每当文件中没有可用空间时,我的应用程序应该等待,直到空间可用。 所以,基本上我的完整系统如下: 顶层:Application_1 中间层:libfuse 下层:Application_2

现在,Application_1 不断地通过 libfuse 对 Application_2 中可用的文件调用 write。因此,在某些情况下,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 fuse posix-select
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.