考虑一个文件,其编辑频率为每秒数十个、数百个进程。由于两个或多个进程可以竞争文件访问写入,因此需要实现一种机制,使一次只有一个进程访问文件。
据我了解,调用
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
调用刚刚关闭了流。freopen
和
fopen
的所有内容,因为它们与您的问题无关。如果您仅对
freopen
行为感兴趣(这可能是一个有趣的话题),请考虑提出一个单独的问题。
每个进程都是解析器的一个实例。它们都将数据存储到不同的文件中。但是有一个文件,仅包含每个解析器存储了多少项的信息,仅考虑一个数组字符串,并且每个进程(解析器的实例)将值更新到特定的数组位置太棒了。实现数据一致性最简单的方法是使用锁定。标准 C 中没有文件锁定,因此请使用操作系统机制 - 在本例中为 Linux 或 POSIX。
我会这样做:如果解析器写入或读取文件,首先它是文件,对其进行修改或读取,然后将其解开以供其他进程使用。阅读
flock
,还有
flock
命令行实用程序。每个进程都可能对文件进行了预先 man 2 flock
编辑,以防止 man 3 flock
或 open()
或减少开销。