<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

    Linux中的兩種文件鎖——協(xié)同鎖與強(qiáng)制鎖

     Linux文件鎖的示例

      為了理解文件鎖是如何工作的,我們建立程序文件file_lock.c:

    #include <stdio.h>
    #include <fcntl.h>
      
    int main(int argc, char **argv) {
      if (argc > 1) {
        int fd = open(argv[1], O_WRONLY);
        if(fd == -1) {
          printf("Unable to open the file\n");
          exit(1);
        }
        static struct flock lock;
      
        lock.l_type = F_WRLCK;
        lock.l_start = 0;
        lock.l_whence = SEEK_SET;
        lock.l_len = 0;
        lock.l_pid = getpid();
      
        int ret = fcntl(fd, F_SETLKW, &lock);
        printf("Return value of fcntl:%d\n",ret);
        if(ret==0) {
          while (1) {
            scanf("%c", NULL);
          }
        }
      }
    }

      用gcc編譯此程序:

    # cc -o file_lock file_lock.c

      使用mount命令帶“mand”參數(shù)來重新掛載根文件系統(tǒng),如下所示。這將在文件系統(tǒng)級(jí)別使能強(qiáng)制鎖功能。

      注意:你必須切換到root用戶才能執(zhí)行下面的命令。

    # mount -oremount,mand /

      在可執(zhí)行的(file_lock所在的)目錄中創(chuàng)建兩個(gè)名為“advisory.txt”和“mandatory.txt”的文件。對(duì)于“mandatory.txt”使能Set-Group-ID,同時(shí)不使能Group-Execute-Bit,如下所示:

    # touch advisory.txt
    # touch mandatory.txt
    # chmod g+s,g-x mandatory.txt

      測(cè)試協(xié)同鎖:執(zhí)行示例程序,以“advisory.txt”作為參數(shù)。

    # ./file_lock advisory.txt

      此程序?qū)⒌却脩舻妮斎搿牧硪粋€(gè)終端或控制臺(tái),嘗試輸入以下命令行:

    # ls >>advisory.txt

      在上面的例子中,ls命令會(huì)將其輸出寫入到advisory.txt文件中。即使我們獲得了一個(gè)寫入鎖,仍然會(huì)有一些進(jìn)程(非合作)能夠往文件里寫入數(shù)據(jù)。這就是所謂的“協(xié)同”鎖。

      測(cè)試強(qiáng)制鎖:再次執(zhí)行示例程序,以“mandatory.txt”作為參數(shù)。

    # ./file_lock mandatory.txt

      從另一個(gè)終端或控制臺(tái),嘗試輸入以下命令行:

    # ls >>mandatory.txt

      在上面的例子中,ls命令在將其輸出寫入到mandatory.txt文件之前,會(huì)等待文件鎖被刪除。雖然它仍然是一個(gè)非合作進(jìn)程,但強(qiáng)制鎖起了作用。

     文件鎖是一種文件讀寫機(jī)制,在任何特定的時(shí)間只允許一個(gè)進(jìn)程訪問一個(gè)文件。利用這種機(jī)制能夠使讀寫單個(gè)文件的過程變得更安全。

      在這篇文章中,我們將探討Linux中不同類型的文件鎖,并通過示例程序來理解它們之間的不同之處。

      我們將采取以下的例子來解釋為什么需要使用文件鎖。

      1、進(jìn)程“A”打開和讀取一個(gè)文件,此文件包含賬戶相關(guān)的一些信息。

      2、進(jìn)程“B”也打開了這個(gè)文件,并讀取了文件中的信息。

      3、現(xiàn)在,進(jìn)程“A”更改了其副本中的一條余額記錄,并將其寫入文件。

      4、此時(shí),進(jìn)程“B”并不知道上次讀取的文件已經(jīng)被更改,它還保存著原始的文件副本。然后,進(jìn)程“B”更改了“A”操作的那條相同的記錄,并將記錄寫入文件。

      5、此時(shí),文件中將只保存了進(jìn)程“B”更改過的記錄。

      為了避免這種事情發(fā)生,就要使用文件鎖來確保操作的“序列化”。

      以下是Linux系統(tǒng)中兩種常用的文件鎖:

      1、協(xié)同鎖

      2、強(qiáng)制鎖

      1、協(xié)同鎖

      協(xié)同鎖要求參與操作的進(jìn)程之間協(xié)同合作。假設(shè)進(jìn)程“A”獲得一個(gè)WRITE鎖,并開始向文件中寫入內(nèi)容;此時(shí),進(jìn)程“B”并沒有試圖獲取一個(gè)鎖,它仍然可以打開文件并向文件中寫入內(nèi)容。在此過程中,進(jìn)程“B”就是一個(gè)非合作進(jìn)程。如果進(jìn)程“B”試圖獲取一個(gè)鎖,那么整個(gè)過程就是一個(gè)合作的過程,從而可以保證操作的“序列化”。

      只有當(dāng)參與操作的進(jìn)程是協(xié)同合作的時(shí)候,協(xié)同鎖才能發(fā)揮作用。協(xié)同鎖有時(shí)也被稱為“非強(qiáng)制”鎖。

      2、強(qiáng)制鎖

      強(qiáng)制鎖不需要參與操作的進(jìn)程之間保持協(xié)同合作。它利用內(nèi)核來查檢每個(gè)打開、讀取、寫入操作,從而保證在調(diào)用這些操作時(shí)不違反文件上的鎖規(guī)則。關(guān)于強(qiáng)制鎖的更多信息,可以在kernal.org上找到。

      為了使能Linux中的強(qiáng)制鎖功能,你需要在文件系統(tǒng)級(jí)別上打開它,同時(shí)在單個(gè)文件上打開它。其步驟是:

      1、掛載文件系統(tǒng)時(shí)使用“-omand”參數(shù)。

      2、對(duì)于要打開強(qiáng)制鎖功能的文件lock_file,必須打開set-group-ID位,關(guān)閉group-execute位。(選擇此方法的原因是,當(dāng)你關(guān)閉group-execute時(shí),設(shè)置set-group-ID就沒有實(shí)際的意義了)

    posted on 2012-05-23 09:32 順其自然EVO 閱讀(4098) 評(píng)論(0)  編輯  收藏 所屬分類: linux

    <2012年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 羞羞漫画页面免费入口欢迎你| 国产免费直播在线观看视频| 色欲aⅴ亚洲情无码AV| 亚洲人成网站在线播放影院在线| 免费精品国产自产拍观看| 1000部羞羞禁止免费观看视频| 国产精品无码免费专区午夜| 国产精品亚洲精品爽爽| 亚洲免费在线观看视频| 亚洲一区AV无码少妇电影☆| 日本免费人成视频播放 | 亚洲AV日韩精品久久久久久久| 好爽好紧好大的免费视频国产| 黄在线观看www免费看| 99爱在线观看免费完整版| h在线看免费视频网站男男| 亚洲成a∨人片在无码2023| 亚洲粉嫩美白在线| 亚洲色图古典武侠| 亚洲狠狠综合久久| 亚洲av综合avav中文| 中文字幕人成人乱码亚洲电影 | 亚洲一本到无码av中文字幕| 亚洲男人av香蕉爽爽爽爽| 亚洲国产成人久久综合一区77| 毛片免费全部免费观看| 91手机看片国产永久免费| 99爱在线精品视频免费观看9| 久爱免费观看在线网站| 性无码免费一区二区三区在线 | 久久精品亚洲综合| 亚洲国产精品无码久久久不卡 | 大地资源网高清在线观看免费 | 亚洲Aⅴ无码专区在线观看q| 日韩亚洲一区二区三区| 国产亚洲综合久久系列| 久久久久亚洲精品无码系列| 亚洲av永久无码制服河南实里| 久久综合九九亚洲一区| 337p欧洲亚洲大胆艺术| 亚洲一区无码中文字幕乱码|