我的应用程序正在通过熔断器不断写入文件。每当文件中没有可用空间时,我的应用程序应该等待,直到空间可用。 所以,基本上我的完整系统如下: 顶层: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 事件。我已阻止该消息以进行确认。但它正在解锁。
真的不知道这是怎么发生的。
不支持在设备上有可用空间时自动解锁的机制。您必须定期重试。