Linux C下 fcntl() 函數與 flock 結構體 實現文件的加解鎖

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執行解鎖操作
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章