【发布时间】:2021-02-23 09:44:30
【问题描述】:
我对fprintf() 的工作原理有些怀疑。我读到fprintf() 不能保证对它正在写入的文件执行原子附加操作。
这在实践中意味着什么?
考虑以下简单情况,例如:
在同一个文件夹中,我有相同代码的不同副本(下面的代码)同时运行并将值打印到一个公共文件(Data.txt)中,例如:\
#define N 10000000
int main(){
FILE* fp_Data;
fp_Data=fopen("Data.txt", "a");
srand48(time(NULL));
int i;
double u;
for(i=0; i<N; i++){
u = drand48();
fprintf(fp_Data, "%f\n", u);
}
fclose(fp_Data);
}
会不会出现问题(覆盖数据/丢失数据)?
[编辑]
正如 Damien 所指出的,关于这个问题有一个类似的问题(Is fprintf() thread safe?)
在那个问题中,它讨论的是同一进程的不同线程,而不是指向同一个 FILE* 的独立进程。
在这种情况下,对于 POSIX 标准(这是我应该在任何带有 unix SO 的 PC 上考虑的标准?)保证线程安全,这意味着我不会冒被覆盖/丢失数据问题的风险。我现在的疑问是:
指向同一个 FILE* 的独立进程也是如此吗?
【问题讨论】:
-
这能回答你的问题吗? Is fprintf() thread safe?
-
从我读到的他说的是同一进程的不同线程,而不是指向同一个文件*的独立进程。无论如何,只是为了确保理解答案,在他的情况下(
fprintf()来自同一进程的不同线程的调用),POSIX 标准(这是我应该在带有 unix SO 的 PC 上考虑的标准?)保证线程 -安全性,这意味着我不会冒被覆盖/丢失数据问题的风险。对吗? -
这也是我的理解。请注意,我不是该领域的专家。但是,我提到的帖子似乎相当肯定和明确。
-
"同时运行不同的代码并将值打印到一个公共文件中," --> 发布用于打开文件的代码——尤其是模式。
-
chux - 恢复莫妮卡,我添加了一个具体而简单的案例来更好地解释我的疑问
标签: c append printf buffer atomic