濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Linux中文件執(zhí)行中的鎖定怪現(xiàn)象解釋

Linux中文件執(zhí)行中的鎖定怪現(xiàn)象解釋

熱門(mén)標(biāo)簽:開(kāi)封400電話辦理價(jià)格 凱立德劇院地圖標(biāo)注 天津人工電銷(xiāo)機(jī)器人費(fèi)用 哪個(gè)地圖標(biāo)注更清晰 曲阜地圖標(biāo)注app 漳州外呼系統(tǒng)怎么樣 內(nèi)蒙古電信外呼系統(tǒng) 地圖標(biāo)注小區(qū)項(xiàng)目入駐 4s店如何在百度地圖標(biāo)注
本來(lái)今天不準(zhǔn)備開(kāi)電腦了,太困了,想睡覺(jué),然而一哥們兒短信都發(fā)過(guò)來(lái)了,要問(wèn)個(gè)問(wèn)題,于是還是打開(kāi)了電腦,沒(méi)想到是一個(gè)很有代表性的問(wèn)題,順便也牽扯了前些天我的工作中的一個(gè)bug,值得記錄下來(lái)。問(wèn)題如下:

linux下,一個(gè)可執(zhí)行文件exe1正在執(zhí)行中,rm –f可以將其刪除,mv可以將其移除,mv $other exe1也可以將其替換,但是cp $other exe1則顯示文件忙,求解。

這實(shí)際上并不是一個(gè)真正的問(wèn)題,因?yàn)橹灰愕幕A(chǔ)知識(shí)扎實(shí),這個(gè)問(wèn)題顯然很簡(jiǎn)單,原因只有一個(gè),那就是linux文件基于引用計(jì)數(shù)?,F(xiàn)在問(wèn)題是這些個(gè)命令如何來(lái)操作一個(gè)文件的引用計(jì)數(shù)。下面的討論都是基于獨(dú)占打開(kāi)的模式。

如果一個(gè)文件已經(jīng)被打開(kāi),那么它的引用計(jì)數(shù)會(huì)增加1,如果調(diào)用了rm,實(shí)際上底層只是unlink了一下,也就是說(shuō)將它的引用計(jì)數(shù)減少1,這樣雖然你在界面上(命令行或者GUI)看不到它了,但是它被打開(kāi)時(shí)的計(jì)數(shù)還在,只有當(dāng)它被關(guān)閉的時(shí)候,引用計(jì)數(shù)變?yōu)?,才徹底刪除它。

再說(shuō)mv命令,它實(shí)際上只是一個(gè)源文件的rename而已,如果mv的目標(biāo)本來(lái)就存在,那么在目標(biāo)上執(zhí)行一個(gè)類(lèi)似rm的效果,也就是unlink一下,結(jié)合引用計(jì)數(shù)的理論,目標(biāo)文件如果已經(jīng)被打開(kāi),那么當(dāng)關(guān)閉的時(shí)候?qū)⒉粡?fù)存在,如果本來(lái)就沒(méi)有被打開(kāi),那么mv的時(shí)候,目標(biāo)直接被刪除,因?yàn)閡nlink之后,它的引用計(jì)數(shù)變成了0。

最后看一下cp命令,cp的話并不觸動(dòng)源文件和目標(biāo)文件元數(shù)據(jù)本身(時(shí)間戳除外),它只是打開(kāi)源文件和目標(biāo)文件,在源文件上執(zhí)行read,然后將結(jié)果write到目標(biāo)文件,實(shí)質(zhì)上是一個(gè)IO操作,對(duì)于可執(zhí)行文件,是獨(dú)占打開(kāi)的,并不允許寫(xiě)入,因此會(huì)出錯(cuò)。

這里就不再列出內(nèi)核源碼了,可以自行參考系統(tǒng)調(diào)用的實(shí)現(xiàn)而加深理解,不過(guò)最好別干巴巴的看,還是結(jié)合strace以及objdump比較好,要知道是怎么以及什么時(shí)候調(diào)用的,以及調(diào)用參數(shù)是什么,否則就和八股文沒(méi)區(qū)別了。那么這和我工作中的bug有什么關(guān)系呢?這個(gè)bug源于OpenVPN的日志記錄,并且配置了日志回滾,回滾配置文件關(guān)鍵字段如下:

size 4M

missingok

rotate 9

compress

delaycompress

create 644 xx xx



結(jié)果當(dāng)日志回滾成了vpn.log.1之后,這個(gè)vpn.log.1依然繼續(xù)被寫(xiě)入。這個(gè)原因正是rename造成的。在logrotate的man頁(yè)面中,有一個(gè)copytruncate配置,其含義就是不進(jìn)行rename,而只是copy,然后將原來(lái)的文件truncate,加入這個(gè)就可以了。

千萬(wàn)不要小看這些很簡(jiǎn)單的命令,真正理解的人并不多,即使真正的理解,出現(xiàn)問(wèn)題,能真正對(duì)應(yīng)到原理也不多,很簡(jiǎn)單的東西如果能徹底做到透徹的理解并且活用,再往深入學(xué)習(xí)才是有意義的。

標(biāo)簽:武漢 開(kāi)封 黔南 南陽(yáng) 莆田 綿陽(yáng) 陽(yáng)泉 南京

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux中文件執(zhí)行中的鎖定怪現(xiàn)象解釋》,本文關(guān)鍵詞  Linux,中,文件,執(zhí)行,中的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux中文件執(zhí)行中的鎖定怪現(xiàn)象解釋》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Linux中文件執(zhí)行中的鎖定怪現(xiàn)象解釋的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    安国市| 随州市| 安康市| 泰兴市| 平武县| 凤翔县| 洪泽县| 中卫市| 蒙自县| 富平县| 江山市| 甘肃省| 巴彦淖尔市| 抚顺市| 牟定县| 咸丰县| 桓仁| 宾川县| 精河县| 太白县| 泰安市| 绿春县| 博罗县| 大同市| 龙泉市| 汉寿县| 汕头市| 巴彦县| 荣昌县| 乌鲁木齐县| 凉山| 宁津县| 延长县| 天柱县| 宁南县| 肥乡县| 铁力市| 类乌齐县| 永兴县| 砚山县| 尤溪县|