[英]Preventing opening file twice from different processes
經過研究后,我仍然不確定是否有API允許您專門打開文件,這意味着任何其他進程都無法訪問該文件。 請有人能給我一個涵蓋該主題的良好參考/指南/說明/手冊嗎?
非常感謝!
編輯:咨詢鎖定足夠好。
進程之間有三種主要的文件鎖定系統:
一些類Unix系統可能沒有flock()
; 例如,它們可能具有lockf()
,或者它們可能僅具有fcntl()
鎖定(盡管大多數將同時具有lockf()
和fcntl()
而許多也將具有flock()
)。 當前版本的POSIX要求fcntl()
鎖定和lockf()
鎖定用於文件級進程間鎖定。 (POSIX還定義了flockfile()
, funlockfile()
和ftrylockfile()
,它們用於控制應用程序中線程之間的鎖定)。
AFAIK,您可以使用fcntl()
鎖定來實現lockf()
和flock()
fcntl()
鎖定。
請注意,鎖定功能適用於文件描述符或文件流。 每個程序都可以打開文件,但是隨后將應用咨詢性鎖定調用以檢查它是否具有對該文件的獨占訪問權。
請注意,某些系統支持強制性文件鎖定(通過在未設置相應的組執行位的情況下在文件上設置setgid位來表示-例如2644模式)。 但是,Mac OS X不支持強制鎖定(已測試10.10 Yosemite,但以前的版本也有此限制)。 POSIX不需要強制鎖定支持。 它是在SVR4系統上提供的。
為了防止從多個進程讀取文件,所有進程都必須實現相同的鎖定機制。
一種方法是使用flock
機制,但並不是到處都有。 從flock(2)
聯機幫助頁:
CONFORMING TO
4.4BSD (the flock() call first appeared in 4.2BSD).
A version of flock(), possibly implemented in terms of fcntl(2),
appears on most UNIX systems.
另一種方法是使用鎖文件 -與原始文件一起顯示鎖處於活動狀態的文件。 C11在fopen
為模式指定了一個修飾符x
,以確保始終創建文件且如果文件已經存在則不打開:
FILE * f = fopen("filename.lock", "wx");
if (!f) {
// File already exists!
return 0;
}
// Do stuff
fclose(f);
remove("filename.lock");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.