c - 选择在写入时阻止接收 ENOSPC
问题描述
我的应用程序通过 fuse 不断写入文件。每当文件中没有可用空间时,我的应用程序应该等到空间可用。所以,基本上我的完整系统如下: 顶层: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# - 在 ASP.NET Core 中通过单击按钮更改属性值
- mysql - MySQL:将值拆分为多行,在 MySQL 8 上可以,但在 MySQL 5.7 上不起作用
- apache-kafka - Apache Kafka 在并行向代理发送多条消息时如何维护秩序?
- flutter - 在颤振中设置 SliverAppbar 的最小高度?
- terraform - Terraform RDS 参数组更改等待重启
- asp.net - 隐藏按钮标签后面的CouponCode,并在点击按钮时显示在模型中
- excel - 如何获取 VLOOKUP 计数并总结查找结果
- c# - ASP.NET Core 3.1 InProcess 托管应用程序在启动时出现异常后未重新启动
- visual-studio - C# .NET Core 3.1 代码可以长时间使用 Visual Studio 执行,但发布的单个文件可执行文件会消耗大量内存
- javascript - 如果用户在字段中输入错误信息,则防止在字段中清除信息