簡體   English   中英

在 C 中讀取文件時,如何防止任何其他進程寫入文件?

[英]How do I prevent any other process from writing to a file while reading from it in 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 我怎樣才能做到這一點?

在 Linux 中,你可以使用flock() (我的重點):

對打開的文件應用或刪除咨詢鎖定。

LOCK_EX放置一個排他鎖 在給定時間,只有一個進程可以持有給定文件的排它鎖。

但是,您需要使用open()而不是fopen()打開文件。

帶有抽象示例的問題: flock():在沒有競爭條件的情況下刪除鎖定的文件? 或者檢查這個 例子

重要提示:正如@JonathanLeffler 評論的“注意術語“建議鎖”——這意味着如果寫入過程不測試鎖,它將能夠寫入。在類似 POSIX 的系統上,您可以使用flock()lockf()fcntl()通過fileno(fp)鎖定文件描述符“。

如果您必須“防御”自己的流程或“表現良好”的流程,那么您需要使用flock

   fp = fopen(fileName, fileMode);
   if (fp != NULL) {
       flock(fileno(fp), LOCK_EX);
       ...
       fclose(fp); fp = NULL;
   }

但是這些鎖只是建議性的,也就是說,任何其他進程都可以選擇忽略它們 或者懶得檢查。 我剛剛嘗試創建一個文件,打開它並用 LOCK_EX 鎖定,然后休眠 60 秒。 在那段時間里,另一個進程可以自由地對文件做任何它想做的事情(Linux、Ubuntu 18.04-LTS)。

但是,如果您需要強制鎖定,這並不是在所有平台上都可用的,因為內核必須合作。 您將在此處找到有關如何使用 Linux 中有限的強制鎖支持的描述和示例。

另一方面,在 Windows 中這是自動的:

Windows 默認為自動強制文件鎖定。 UNIX 缺省為手動協作文件鎖定。 在這兩種情況下,默認值都可以被覆蓋,但在這兩種情況下,它們通常都不會。 來源)。

一種解決方法是暫時將正在處理的文件重命名為唯一名稱,可能會創建一個使用舊名稱代替的空文件,然后在完成后將其重命名; 或者如上復制文件,留一份供其他程序閱讀。 寫入拒絕也可以通過更改文件權限來實現。 這些解決方案需要處理一些邊緣情況,例如您的進程崩潰或機器在將事情恢復原狀之前掛起的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM