歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux基礎知識

關於Linux系統文件鎖的幾個知識要點

文件鎖是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()前後進程還是一個。

Copyright © Linux教程網 All Rights Reserved