參考文章:
在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...