[英]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.