linux多進程之間的檔案鎖__linux

來源:互聯網
上載者:User
之前對於檔案的操作通常在一個進程中完成,最近需要在兩個進程中對同一個檔案進行操作。故想到了檔案鎖。 linux下可以使用flock()函數對檔案進行加鎖解鎖等操作。簡單介紹下flock()函數:        表標頭檔  #include

   定義函數  int flock(int fd,int operation);

   函數說明  flock()會依參數operation所指定的方式對參數fd所指的檔案做各種鎖定或解除鎖定的動作。此函數只能鎖定整個檔案,無法鎖定檔案的某一地區。

   參數  operation有下列四種情況:

   LOCK_SH 建立共用鎖定定。多個進程可同時對同一個檔案作共用鎖定定。

  LOCK_EX 建立互斥鎖定。一個檔案同時只有一個互斥鎖定。

  LOCK_UN 解除檔案鎖定狀態。

   LOCK_NB 無法建立鎖定時,此操作可不被阻斷,馬上返回進程。通常與LOCK_SH或LOCK_EX 做OR(|)組合。

   單一檔案無法同時建立共用鎖定定和互斥鎖定,而當使用dup()或fork()時檔案描述詞不會繼承此種鎖定。

   傳回值  返回0表示成功,若有錯誤則返回-1,錯誤碼存於errno。

為了更好的移植性,對於檔案的開啟與關閉我選擇了fopen和fclose的組合,但flock的第一個參數要求的是int類型的檔案描述符。這裡對fopen返回的FILE類型的檔案指標進行轉換,轉換為int型的檔案描述符 (假設open函數返回的檔案描述符為fd,而fopen返回的檔案指標為*fp,則fd等價於fp->_fileno).


下面為兩個進程的執行個體:

 

#include

#include

#include

#include


int main(void)

{

    FILE *fp = NULL;

    int i = 20; 

    

    if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //開啟檔案

        printf("file open error!\n");

    if (flock(fp->_fileno, LOCK_EX) != 0) //給該檔案加鎖

        printf("file lock by others\n");

    while(1) //進入迴圈,加鎖時間為20秒,列印倒計時

    {   

        printf("%d\n", i--);

        sleep(1);

        if (i == 0)

            break;

    }   

    fclose(fp); //20秒後退出,關閉檔案

    flock(fp->_fileno, LOCK_UN); //檔案解鎖

    return 0;

 

}


 

#include

#include

#include

#include


int main(void)

{

    FILE *fp = NULL;

    int i = 0;

    

    if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //開啟檔案

        printf("file open error!\n");

    flock(fp->_fileno, LOCK_EX); //檔案加鎖

    while(1) //進入迴圈

    {   

        printf("%d\n", i++);

        sleep(1);

    }   

    fclose(fp); //關閉檔案

    flock(fp->_fileno, LOCK_UN); //釋放檔案鎖

    return 0;

 

}
首先運行file1.c,緊接著運行file2.c(運行file1.c後20秒內要運行file2.c否則看不到現象) 現象是:file1.c執行起來以後,開始倒計時。此時運行file2.c會阻塞在加鎖處。當file1.c運行20秒後關閉檔案,並釋放檔案鎖後,file2.c會開始運行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.