學(xué)習(xí)心得:Linux系統(tǒng)文件鎖
在我們應(yīng)用電腦時,會遇到很多問題,Linux作為電腦操作系統(tǒng)中的主流,你了解Linux系統(tǒng)么?本文為你詳細(xì)介紹Linux系統(tǒng)文件鎖,為你在學(xué)習(xí)Linux系統(tǒng)文件鎖時起一定的作用。文件鎖是Linux上最常用的進(jìn)程間同步機(jī)制之一,相比sysv的信號量,文件鎖更容易使用(sysv信號量的麻煩之處在于它的key獲取機(jī)制)。
APUE對文件鎖做了詳盡的描述,其中需要注意的有以下幾點,原文可參見APUE2的14.3節(jié):
1、文件鎖(file_lock)與文件(確切的說是文件的inode)及進(jìn)程捆綁,Linux實現(xiàn)中文件的file_lock結(jié)構(gòu)掛在該文件對應(yīng)的inode結(jié)構(gòu)中,而file_lock結(jié)構(gòu)中包含了該鎖所屬進(jìn)程的pid。這種實現(xiàn)方式造成了兩種后果:
a.進(jìn)程退出時,屬于該進(jìn)程的所有文件鎖被釋放。
b.關(guān)閉加鎖進(jìn)程所屬的任何一個指向加鎖文件的fd或file時,鎖被釋放。這是由于file_lock結(jié)構(gòu)選擇掛在inode上而不是fd或file(內(nèi)核結(jié)構(gòu),fd的下一站),所以無法具體區(qū)分文件鎖對應(yīng)的fd或file上。這點需要特別注意,APUE上列出了兩個例子,***個對應(yīng)fd關(guān)閉,第二個對應(yīng)file關(guān)閉,這兩種情形都會導(dǎo)致鎖釋放:
fd1 = open(pathname, ...);
read_lock(fd1, ...);
fd2 = dup(fd1);
close(fd2);
fd1 = open(pathname, ...);
read_lock(fd1, ...);
fd2 = open(pathname, ...)
close(fd2);
APUE中有一個FreeBSD的文件鎖實現(xiàn)圖可以幫助理解以上內(nèi)容,該圖對Linux也是適用的。
2、fork()后子進(jìn)程不繼承父進(jìn)程的鎖,這個很容易理解,鎖就是被進(jìn)程用來執(zhí)行互斥等任務(wù)的,如果承就亂了。
3、exec()可以繼承鎖,取決于exec()后加鎖fd是否被關(guān)閉(close-on-exec),這是因為exec()前后進(jìn)程還是一個。
希望Linux系統(tǒng)文件鎖的知識要點對你有所幫助。
【編輯推薦】