歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux多進程之間的文件鎖

之前對於文件的操作通常在一個進程中完成,最近需要在兩個進程中對同一個文件進行操作。故想到了文件鎖。

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會開始運行。

Copyright © Linux教程網 All Rights Reserved