lockf

lockf()函式允許將檔案區域用作信號量(監視鎖),或用於控制對鎖定進程的訪問(強制模式記錄鎖定)。試圖訪問已鎖定資源的其他進程將返回錯誤或進入休眠狀態,直到資源解除鎖定為止。當關閉檔案時,將釋放進程的所有鎖定,即使進程仍然有打開的檔案。當進程終止時,將釋放進程保留的所有鎖定。

函式聲明

/* 'lockf' is a simpler interface to the locking facilities of 'fcntl'. LEN is always relative to the current file position. The CMD argument is one of the following. This function is a cancellation point and therefore not marked with __THROW. */

#include <unistd.h>

int lockf(int fd, int cmd, off_t len);

①fd 是打開檔案的檔案描述符。

為通過此函式調用建立鎖定,檔案描述符必須使用只寫許可權(O_WRONLY)或讀寫許可權(O_RDWR)打開。如果調用進程是具有PRIV_LOCKRDONLY 許可權的組的成員,它也可以使用lockf()來鎖定使用唯讀許可權(O_RDONLY)打開的檔案。

②cmd 是指定要採取的操作的控制值,允許的值在中定義。

如下所示:

# define F_ULOCK 0 //解鎖

# define F_LOCK 1 //互斥鎖定區域

# define F_TLOCK 2 //測試互斥鎖定區域

# define F_TEST 3 //測試區域

F_ULOCK 請求可以完全或部分釋放由進程控制的一個或多個鎖定區域。如果區域未完全釋放,剩餘的區域仍將被進程鎖定。如果該表已滿,將會返回[EDEADLK]錯誤,並且不會釋放請求的區域。

使用 F_LOCK 或 F_TLOCK 鎖定的區域可以完全或部分包含同一個進程以前鎖定的區域,或被同一個進程以前鎖定的區域包含。此時,這些區域將會合併為一個區域。如果請求要求將新元素添加到活動鎖定表中,但該表已滿,則會返回一個錯誤,並且不會鎖定新區域。

F_LOCK 和 F_TLOCK 請求僅在採取的操作上有所差異(如果資源不可用)。如果區域已被其他進程鎖定,F_LOCK 將使調用進程進入休眠狀態,直到該資源可用,而 F_TLOCK 則會返回[EACCES]錯誤。

F_TEST 用於檢測在指定的區域中是否存在其他進程的鎖定。如果該區域被鎖定,lockf()將返回 -1,否則返回0;在這種情況下,errno 設定為[EACCES]。F_LOCK 和 F_TLOCK 都用於鎖定檔案的某個區域(如果該區域可用)。F_ULOCK 用於刪除檔案區域的鎖定。

③len是要鎖定或解鎖的連續位元組數。

要鎖定的資源從檔案中當前偏移量開始,對於正 len 將向前擴展,對於負 len 則向後擴展(直到但不包括當前偏移量的前面的位元組數)。如果 len 為零,則鎖定從當前偏移量到檔案結尾的區域(即從當前偏移量到現有或任何將來的檔案結束標誌)。要鎖定一個區域,不需要將該區域分配到檔案中,因為這樣的鎖定可以在檔案結束標誌之後存在。

使用 S_ENFMT 檔案模式的常規檔案(未設定組執行位)將啟用強制策略。啟用強制策略後,如果清除了 O_NDELAY,訪問鎖定區域的讀取和寫入將進入休眠狀態,直到整個區域可用為止,但是如果設定了O_NDELAY,將會返回−1並設定 errno。由其他系統函式(如 exec())訪問的檔案不受強制策略的影響。

返回值

此函式調用成功後,將返回值 0,否則返回−1,並且設定 errno 以表示該錯誤。 由於當檔案的某部分被其他進程鎖定後,變數 errno 將會設定為[EAGAIN]而不是[EACCES],因此可移植應用程式應對這兩個值進行預計和測試。例如:

if (lockf(fd, F_TLOCK, siz) == -1) //測試鎖定

if ((errno == EAGAIN) || (errno == EACCES))

…….

else if ...

/* check for other errors*/

相關詞條

熱門詞條

聯絡我們