flock() - Unix、Linux系統呼叫
廣告
名稱
flock - 對開啟的檔案應用或移除建議鎖
概要
#include <sys/file.h>
int flock(int fd, int operation);
|
描述
對由fd指定的檔案應用或移除建議鎖。引數operation是以下之一:
標籤 | 描述 |
LOCK_SH | 設定共享鎖。多個程序可以在給定時間內對給定檔案持有共享鎖。 |
LOCK_EX | 設定獨佔鎖。在給定時間內,只有一個程序可以對給定檔案持有獨佔鎖。 |
LOCK_UN | 移除此程序持有的現有鎖。
|
如果另一個程序持有不相容的鎖,則對flock()的呼叫可能會阻塞。要發出非阻塞請求,請將LOCK_NB(透過OR)與上述任何操作一起使用。
單個檔案不能同時擁有共享鎖和獨佔鎖。 由flock()建立的鎖與開啟的檔案表條目相關聯。這意味著重複的檔案描述符(例如,由fork(2)或dup(2)建立)引用相同的鎖,並且可以使用這些描述符中的任何一個來修改或釋放此鎖。此外,鎖透過對這些重複描述符中的任何一個進行顯式LOCK_UN操作,或者當所有此類描述符都已關閉時釋放。
如果一個程序使用open(2)(或類似方法)獲取同一個檔案的多個描述符,則這些描述符由flock()獨立處理。嘗試使用這些檔案描述符之一鎖定檔案可能會被呼叫程序已透過另一個描述符設定的鎖拒絕。
一個程序只能在一個檔案上持有某種型別的鎖(共享鎖或獨佔鎖)。對已鎖定檔案的後續flock()呼叫會將現有鎖轉換為新的鎖定模式。
由flock()建立的鎖在execve(2)中保留。
無論以何種模式開啟檔案,都可以對檔案設定共享鎖或獨佔鎖。
返回值
成功時,返回零。出錯時,返回-1,並適當地設定errno。
錯誤
錯誤程式碼 | 描述 |
EBADF |
fd不是開啟的檔案描述符。 |
EINTR | 在等待獲取鎖時,呼叫因處理程式捕獲的訊號傳遞而中斷。 |
EINVAL |
operation無效。 |
ENOLCK | 核心記憶體不足,無法分配鎖記錄。 |
EWOULDBLOCK | 檔案已鎖定且已選擇LOCK_NB標誌。 |
符合標準4.4BSD(flock(2)呼叫首次出現在4.2BSD中)。大多數Unix上都出現flock(2)的版本,可能使用fcntl(2)實現。註釋
flock(2)不會透過NFS鎖定檔案。請改用fcntl(2):在足夠新的Linux版本和支援鎖定的伺服器上,它可以工作。
從核心2.0開始,flock(2)本身作為系統呼叫實現,而不是在GNU C庫中作為對fcntl(2)的呼叫來模擬。這產生了真正的BSD語義:由flock(2)和fcntl(2)設定的鎖的型別之間沒有互動,並且flock(2)不檢測死鎖。
flock(2)只設置建議鎖;如果對檔案具有合適的許可權,程序可以自由地忽略flock(2)的使用並在檔案上執行I/O。
關於派生程序和dup(2),flock(2)和fcntl(2)鎖具有不同的語義。在使用fcntl()實現flock()的系統上,flock()的語義將與本手冊頁中描述的不同。
轉換鎖(從共享到獨佔,反之亦然)不能保證是原子的:首先移除現有鎖,然後建立新的鎖。在這兩個步驟之間,另一個程序的掛起鎖請求可能會被授予,結果是轉換阻塞或在指定LOCK_NB時失敗。(這是原始的BSD行為,並且在許多其他實現中發生。)
另見
廣告
|