複製鏈接
請複製以下鏈接發送給好友

lockf

鎖定
lockf( )函數允許將文件區域用作信號量(監視鎖),或用於控制對鎖定進程的訪問(強制模式記錄鎖定)。試圖訪問已鎖定資源的其他進程將返回錯誤或進入休眠狀態,直到資源解除鎖定為止。當關閉文件時,將釋放進程的所有鎖定,即使進程仍然有打開的文件。當進程終止時,將釋放進程保留的所有鎖定。
外文名
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( ))訪問的文件不受強制策略的影響。

lockf返回值

函數調用成功後,將返回值 0,否則返回−1,並且設置 errno 以表示該錯誤。 由於當文件的某部分被其他進程鎖定後,變量 errno 將會設置為[EAGAIN]而不是[EACCES],因此可移植應用程序應對這兩個值進行預計和測試。例如:
if (lockf(fd, F_TLOCK, siz) == -1) //測試鎖定
if ((errno == EAGAIN) || (errno == EACCES))
…….
else if ...
/* check for other errors*/