我的应用程序通过保险丝连续写入文件。而且,只要文件中没有可用空间,我的应用程序就应该等到可用空间为止。 因此,基本上我的完整系统如下所示: 顶层: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事件。我已将其屏蔽以进行确认。但是它变得畅通无阻。
真的不知道这是怎么回事。
答案 0 :(得分:0)
不支持在设备上有可用空间时自动解除阻止的机制。您将必须定期重试。