fcntl是計算機中的一種函數,通過fcntl可以改變已打開的文件性質,實現對指定文件描述符的各種操作。
頭文件:#include< fcntl.h>
fcntl其函數原型如下:
int fcntl(int fd, int cmd, ... /* arg */ );
其中,操作類型由cmd決定。cmd可取如下值:
- F_DUPFD:複製文件描述符
- F_DUPFD_CLOEXEC:複製文件描述符,新文件描述符被設置了close-on-exec
- F_GETFD:讀取文件描述標識
- F_SETFD:設置文件描述標識
- F_GETFL:讀取文件狀態標識
- F_SETFL:設置文件狀態標識
- F_GETLK:如果已經被加鎖,返回該鎖的數據結構。如果沒有被加鎖,將l_type設置爲F_UNLCK
- F_SETLK:給文件加上進程鎖
- F_SETLKW:給文件加上進程鎖,如果此文件之前已經被加了鎖,則一直等待鎖被釋放。
flock結構體定義了一些文件的鎖的選項,主要成員如下:
struct flock {
...
short l_type; /* Type of lock: F_RDLCK(讀鎖),
F_WRLCK(寫鎖), F_UNLCK(無鎖) */
short l_whence; /* How to interpret l_start:
SEEK_SET(相對偏移量是從文件開始測量的),
SEEK_CUR(相對偏移量從當前位置開始測量),
SEEK_END(相對偏移量從文件結尾開始測量) */
off_t l_start; /* Starting offset for lock */
off_t l_len; /* Number of bytes to lock */
pid_t l_pid; /* PID of process blocking our lock
(set by F_GETLK and F_OFD_GETLK) */
...
};
接下來看代碼:
void setlocktofile()
{
int fd = open("test.c",O_RDWR,0666); //打開文件
struct flock flk; //定義結構體
bzero(&flk,,sizeof(flk)); //清空結構體
//設置結構體參數,以下設置爲給整個文件加鎖
flk.l_type = F_WRLCK; //設置寫鎖
flk.l_whence = SEEK_SET; //起始偏移量
flk.l_start = 0; //相對偏移量
flk.l_len = 0; //設置加鎖區間,爲0表示從開始位置直到文件結束
fcntl(fd,F_SETLK,&flk); //調用fcntl函數執行加鎖操作
sleep(1); //讓系統等待一秒,模擬需要的操作
flk.l_type = F_UNLCK; //設置無鎖,即解鎖
fcntl(fd,F_SETLK,&flk); //調用函數fcntl執行解鎖操作
}