使用 freopen 与现有流来截断已打开的文件是否安全?

问题描述 投票:0回答:1

考虑一个文件,其编辑频率为每秒数十个、数百个进程。由于两个或多个进程可以竞争文件访问写入,因此需要实现一种机制,使一次只有一个进程访问文件。

据我了解,调用

fopen
(或
open
),直到
fclose
完成这项工作 - 这些函数保证只有一个进程会访问该文件。

编辑保证实现文件的示例代码如下:

FILE *f = fopen("file", "r+");
while(f == NULL) // skip file existance check for example
   f = fopen("file", "r+");
fprintf(f, "%d", 1);
fclose(f);

问题是文件需要在打开后被截断,因为需要先读取它,然后重写。如果会有两次fopen调用,显然不能保证跨进程安全。

这个答案

建议在freopen之后和

fopen
调用之前使用
fclose
函数,但是,根据Linux手册页,
freopen文档

如果路径名不是空指针,freopen() 将关闭与流关联的任何文件描述符。

目前,我看到的唯一解决方案是创建一个关联的文件,以及需要访问的文件,然后锁定它,而不是锁定所需的文件(尽管它肯定也被锁定),在此期间,需要的文件将被锁定阅读、关闭、截断、写入、关闭。

这样的解决方案至少能保证安全吗?还有更好的解决方案吗?

我还尝试在用
fopen

模式调用

w
后,用
fopen
模式调用新的
r+
,然后关闭它,它返回新指针,然后我尝试用两个指针
fprintf
,但是得到了分段错误,可能使用原始指针。我认为第二个
fopen
调用刚刚关闭了流。
    

c linux fopen race-condition
1个回答
0
投票
freopen

fopen
的所有内容,因为它们与您的问题无关。如果您
freopen行为感兴趣(这可能是一个有趣的话题),请考虑提出一个单独的问题。

每个进程都是解析器的一个实例。它们都将数据存储到不同的文件中。但是有一个文件,仅包含每个解析器存储了多少项的信息,仅考虑一个数组字符串,并且每个进程(解析器的实例)将值更新到特定的数组位置

太棒了。实现数据一致性最简单的方法是使用锁定。标准 C 中没有文件锁定,因此请使用操作系统机制 - 在本例中为 Linux 或 POSIX。

我会这样做:如果解析器写入或读取文件,首先它是文件,对其进行修改或读取,然后将其解开以供其他进程使用。阅读

flock

,还有

flock
命令行实用程序。每个进程都可能对文件进行了预先
man 2 flock
编辑,以防止
man 3 flock
open()
或减少开销。
    

© www.soinside.com 2019 - 2024. All rights reserved.