linux下cp,mv對執行中的程式公升級的問題

2021-09-02 18:57:34 字數 1442 閱讀 8749

參考文章:

在linux下,所有的結構都是以檔案形式存在的。不管是目錄還是網路 socket 。每個檔案在系統底層關聯乙個具體的檔案結構,關聯的key 就是 inode。

目錄也是乙個特殊的檔案,不過目錄本身儲存的內容是檔名和inode資訊的對映。

以下3個結構是為加強理解,模擬的3個結構體,可以描述檔案,inode,目錄之間的關係。

/*每個檔案都對映乙個 inode, 包括目錄也是一種檔案*/

struct inode

inode;

/** * 目錄本身也是乙個檔案,也具有inode 資訊,

* 同時目錄的內容存的是,當前目錄下各個檔案的檔名和inode 的對映關係, 也就是 dentry

* 有了 dentry 就可以根據檔名找到檔案對應的 inode

* */

struct dir

//dentry 映**檔名和 inode 的關係

struct dentry

dentry;

通過以上的多級對映, dentry 以及 dentry中儲存的檔名 和 inode,就完整的描述了乙個檔案。

cp test1 test2

首先 test1 的檔名和inode 都不會變

要給 test2 生產 dentry 和 inode 資訊,檔名已經有了,現在需要乙個 inodenumber

/**

* 生成檔案a的inode number

* 如果 a檔案已存在,則返回 inode number

* 若不存在,則返回乙個沒有用過的新的 inode_number

* */

get_inode_number

(file a)

將test1 對應的inode 的資訊,覆蓋到test2 所對應的inode 資訊中。如果test2 是正在執行的程式,此時的 cp 是失敗的,因為作業系統引用了 test2 的檔案映像,相當於給 inode 加了一把鎖,inode 所指向的檔案資訊是不可以隨意改變的。

mv test1 test2

test1 不用管

要給 test2 生產 dentry 和 inode 資訊,檔名已經有了, 現在需要乙個 inodenumber。由於是 mv 操作,原來 test1 的 inode 肯定是不需要了,那麼直接用 test1 的inode 作為 test2 的 inode 即可

如果test2 是正在執行的程式,此時的 mv 是成功的,因為改變 test2 的inode 資訊只需要改變 dentry即可,不需要改變inode 本身的資訊。

所以執行與否不影響 mv 操作的進行,但是執行之後,需要重啟程式,因為作業系統記憶體中的程式依然是指向 test2 原先的 inode

重啟之後,原來test2的 inode 節點就會被**。

linux裡的cp mv命令詳解

cp 複製檔案或目錄 命令引數 a archive 此引數的效果和同時指定 dpr 引數相同 b backup 刪除 覆蓋目的檔案先備份,備份的檔案或目錄亦建立為符號鏈結,並指向原始檔或目錄鏈結的原始檔或目錄。假如沒有加上這個引數,在複製過程中若遇到符號鏈結,則會直接複製原始檔或目錄 f force...

Linux下的執行命令

vbird www command options parameter1 parameter2 說明 1 一行命令中第乙個輸入的部分絕對是 命令 command 或 可執行檔案 2 command為命令的名稱,例如變換路徑的命令為cd等。例如 h 有時候會使用引數的完整全名,則引數前帶有 符號,例如...

Linux下shell script的執行方式彙編

假設存在shell scripts檔案為 home myscripts helloworld.sh,現列舉如下的執行方式 一 直接命令執行 1 絕對路徑 home myscripts helloworld.sh 2 相對路徑 假設當前工作目錄為 home myscripts,則執行方式為.hello...