首页 > 解决方案 > 如何在 C 中读取文件时防止任何其他进程写入文件?

问题描述

背景

在我的 C 程序中,我正在逐行读取文件。

FILE *file = fopen("config.txt", "r");

if (file)
{
    char *line;
    size_t length;
    size_t read;
    int test_case_number = 0;

    while ((read = getline(&line, &length, file)) != -1)
    {
        printf("%s", line);
    }
}
else
{
    fputs("The provided <PATH_TO_CONFIG FILE> does not exist.\n\n");
    exit(1);
}

问题

但是,当我阅读此文件时,我想防止任何其他进程在读取该文件config.txt时对其进行写入。我怎样才能做到这一点?

标签: cmultithreading

解决方案


在 Linux 中,您可以使用flock()(由我关注):

对打开的文件应用或删除建议锁。

LOCK_EX放置一个排他锁。在给定时间,只有一个进程可以为给定文件持有独占锁。

但是,您需要使用open(), 而不是fopen().

带有抽象示例的问题:flock():删除没有竞争条件的锁定文件?或者检查这个例子

重要提示:正如@JonathanLeffler 评论的那样“注意术语“咨询锁”——这意味着如果写入过程不测试锁,它将能够写入。在类似 POSIX 的系统上,您可以使用flock()lockf()fcntl()锁定文件描述符通过fileno(fp)“。


推荐阅读