|簡體中文

比思論壇

 找回密碼
 按這成為會員
搜索



查看: 380|回復: 0
打印 上一主題 下一主題

Linux文件锁的几个要点

[複製鏈接]

86

主題

3

好友

542

積分

中學生

Rank: 3Rank: 3

  • TA的每日心情
    開心
    2024-5-9 21:05
  • 簽到天數: 1593 天

    [LV.Master]伴壇終老

    推廣值
    0
    貢獻值
    0
    金錢
    7167
    威望
    542
    主題
    86
    樓主
    發表於 2014-11-13 23:12:13
    文件锁是Linux上最常用的进程间同步机制之一,相比sysv的信号量,文件锁更容易使用(sysv信号量的麻烦之处在于它的key获取机制)。
       
        APUE对文件锁做了详尽的描述,其中需要注意的有以下几点,原文可参见APUE2的14.3节:
        1,文件锁(file_lock)与文件(确切的说是文件的inode)及进程捆绑,Linux实现中文件的file_lock结构挂在该文件对应的inode结构中,而file_lock结构中包含了该锁所属进程的pid。这种实现方式造成了两种后果:
            a, 进程退出时,属于该进程的所有文件锁被释放。
            b, 关闭加锁进程所属的任何一个指向加锁文件的fd或file时,锁被释放。这是由于file_lock结构选择挂
    在inode上而不是fd或file(内核结构,fd的下一站),所以无法具体区分文件锁对应的fd或file上。这点需要特别注意,APUE上列出了两个例子,第一个对应fd关闭,第二个对应file关闭,这两种情形都会导致锁释放:
                fd1 = open(pathname, ...);
                read_lock(fd1, ...);
                fd2 = dup(fd1);
                close(fd2);
       
                fd1 = open(pathname, ...);
                read_lock(fd1, ...);
                fd2 = open(pathname, ...)
                close(fd2);
           APUE中有一个FreeBSD的文件锁实现图可以帮助理解以上内容,该图对Linux也是适用的。

        2,fork()后子进程不继承父进程的锁,这个很容易理解,锁就是被进程用来执行互斥等任务的,如果承就乱了。
        3,exec()可以继承锁,取决于exec()后加锁fd是否被关闭(close-on-exec),这是因为exec()前后进程还是
    一个。
    重要聲明:本論壇是以即時上載留言的方式運作,比思論壇對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們比思論壇有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

    手機版| 廣告聯繫

    GMT+8, 2024-5-23 18:33 , Processed in 0.013716 second(s), 17 queries , Gzip On, Memcache On.

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc.

    回頂部