- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写一个程序,某种数据库。当我阅读 fclose(3)
手册时,我发现它调用 fflush(3)
将 FILE*
缓冲区刷新到磁盘(实际上是操作系统缓冲区,但现在没关系,我们可以随时调用 fsync(2)
)。
因为我正在编写数据库,所以很明显我想防止数据丢失。如果没有磁盘空间并且 fclose(3)
中的 fflush(3)
失败 — 我们将丢失数据,因为
using
FILE*
after an error infclose()
will cause undefined behavior
所以我考虑在 fclose(3)
之前显式使用 fflush(3)
,警告用户磁盘空间不足并调用 fflush(3)
过了一会儿。
我已经阅读了 C 标准并认为这是一个好主意。实际上,在 fflush
失败后,第二次调用将始终返回 0(无错误),但实际上什么也不做。 fsync
对我没有帮助(我认为数据可能保存在 RAM 中)。
在这种情况下如何防止数据丢失?也许有一些经验法则。
这是我的测试代码:
#include <stdio.h>
int main()
{
FILE *a = fopen("/tmp/1", "wb")
if ( !a )
perror("fopen");
if ( fwrite("test", 1, 4, a) != 4 )
perror("fwrite"); // always OK, cause data is buffered
while( fflush(a) ) // ...second call will always return 0!
{
perror("fflush"); // if there is no disk space, I will get this perror, but ...
}
if ( fclose(a) ) // always ok, because calls only close(2)
perror("fclose");
return 0;
}
最佳答案
后续 fflush() 操作成功的原因是没有(新)数据要写入磁盘。第一次 fflush() 失败;那是悲惨的历史。随后的 fflush() 没有做任何事情,所以它成功了。
如果您正在写入数据库,则必须小心每次写入 - 而不仅仅是在最后处理问题。根据您的数据的重要性,您可能需要经历各种反复来处理问题 - DBMS 很复杂是有原因的,写入失败就是其中之一。
处理该问题的一种方法是为数据预先分配空间。正如其他人所指出的,经典的 Unix 文件系统允许稀疏文件(文件中有空 block ,没有为其分配磁盘空间),因此您实际上必须在需要分配的每个页面上写入一些数据。然后,当您扩展空间时,您只需担心“磁盘已满”问题 - 并且您知道什么时候这样做,并且您可以小心地处理该故障。
在基于 Unix 的系统上,有多种系统调用可以帮助您同步磁盘上的数据,以及“打开”选项等。其中包括“O_DSYNC”和相关值。然而,如果你正在扩展一个文件,它们仍然会因为“空间不足”而导致失败,即使有花哨的同步选项。当您确实遇到该故障时,您必须等待空间可用(因为您可能要求用户告诉您它何时可用),然后再次尝试写入。
关于c - fflush 和 'no disk space left',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2215363/
我系统上的docker info命令输出如下: # docker info Containers: 0 Images: 0 Storage Driver: devicemapper ..... D
我如何捕获用户按下 ctrl + space + space? 我用这段代码成功测试了ctrl + space: RegisterHotKey(0, 1, MOD_CONTROL, VK_SPACE)
我有一个 Matlab 图,我想在论文中使用。此图包含多个 cdfplots。现在的问题是我不能使用标记,因为在情节中变得非常密集。如果我想让样本稀疏,我必须从 cdfplot 中删除一些样本,这将导
我正在尝试获取我将用于备份的服务器上所有数据库的列表。以下是我尝试打印数据库列表但出现错误的代码片段。如何解决?添加双方括号并不能解决问题。 我已经研究了一些类似的问题,但我无法弄清楚。 grep:字
我了解 new gen/old gen/perm gen 之间的区别,但我不知道“To Space”和“From Space”是什么。我看到我的“From Space”使用率达到 99.8%,而“To
我当前有一个返回时看起来像这样的字符串: //This is the url string // the-great-debate---toilet-paper-over-or-under-the-r
我太亲密了。我正在尝试编写用于Notepad++的正则表达式表达式,以用空格替换破折号,而忽略已经用前置/后置空格代替的破折号。我知道我可以用“foobarfoo”搜索/替换“-”,然后搜索“-”替换
我的 ANTLR 代码如下: LPARENTHESIS : ('('); RPARENTHESIS : (')'); fragment CHARACTER : ('a'..'z'|'0'..'9'|)
在过去的 6 个小时里,我一直在尝试在我的 webgl 应用程序中实现点击,但我找不到任何关于这个主题的足够清晰的内容。 到目前为止,我想出的是伪代码: screenSpace = mousePosi
如何使用正则表达式来测试空格或制表符,但不测试换行符? 我尝试了 \s,但我发现它也测试换行符。 我使用C# (.NET) 和 WPF ,但这应该不重要。 最佳答案 使用字符类:[\t] 关于rege
我想解析以下内容: name:name 名称以字母开头和结尾,并且可以包含字母和空格的任意组合。它们也可以是空白的。我的规则是: identifier = alnum (space* alnum)*;
有什么办法可以让 Eden 空间按比例大于 Tenured 空间吗?有 NewRatio 但它以相反的方式工作(Tenured 比 Eden 大几倍)。 我知道有 -XX:NewSize= 和 -XX
我正在编写一个程序,让人们输入他们的信息(姓名,年龄......)。对于姓名输入,我不希望他们留空,只允许字母和空格,但不能以空格开头。合适的正则表达式是什么?我尝试使用: ^[a-zA-Z\\s]*
好的,我正在制作一个程序,它也可以制作垂直线、水平线和对角线!我对我的一个没有任何意义的输出感到困惑。 所以我的伪代码是这样的: //enter a char //enter a number
当我使用 scp 从服务器复制文件时, 我错误地使用了命令 scp xxx@xxxx:xx.zip . 当我完成后,我发现该文件的名称是 .我无法解压 这是目录列表。 http://pfil
我需要一个 bat 文件来获取 Windows 系统中 C:\驱动器的总空间和可用空间(以 GB(千兆字节)为单位),并创建一个包含详细信息的文本文件。 注意:我不想使用任何外部实用程序。 最佳答案
作为预处理我的数据的一部分。我希望能够替换空格后跟数字,同时保留空格后跟一个字符。例如: Input String: '8.1.7 Sep 2000 Dec 2004 Dec 2006 Indefin
我正在编写一个 XPath 表达式,但我修复了一个奇怪的错误,但是以下两个 XPath 表达式之间有什么区别? "//td[starts-with(normalize-space()),'Posted
在 C 中,当读取文本文件时,是否有可能接受一个未知大小的整数值(假设它适合 int),因为它在数字之前和数字之后都有一个空格。例如。 363 865我想分别存储 363 和 865,因为它们有自己的
在 sys/ptrace.h 中,我看到类似这样的内容: @define PT_READ_I 1 /* read world in child's I space*/ @define PT_READ
我是一名优秀的程序员,十分优秀!