我目前正在構建一個自定義 shell,它可以處理一些內部和外部命令及其選項。這些內部命令之一是pwd. 從pwd 的手冊頁中,我知道pwd -L即使它包含符號鏈接,它也會輸出當前作業目錄。
現在為了實作這一點,我想知道 C 中有哪些功能可以在不決議符號鏈接的情況下提供作業目錄。
作業系統:GNU/Linux
PS:getcwd()給出實際路徑并決議符號鏈接。(如果我在某處錯了,請糾正我)。
uj5u.com熱心網友回復:
該pwd命令有 2 種不同的模式:
pwd -L顯示邏輯當前作業目錄。pwd -P顯示當前的物理作業目錄(所有符號鏈接都已決議)。
如果未指定任何選項,則假定使用 -L 選項。
pwd -P使用函式:它從行程的當前目錄getcwd()決議鏈。..
從檢索其 inode 和設備號的當前目錄開始,它打開父目錄opendir("..")并列舉條目,直到找到具有相同 inode 和設備號的條目。此條目是當前目錄名稱的最后一個組成部分。如果沒有找到這樣的條目,則getcwd()失敗并設定errno為ENOENT。
該程序繼續在下一個父目錄上進行,直到到達根目錄。
這是非常低效的。pwd -L,這是默認設定,使用不同的方法:shell 維護一個環境變數,其中包含 shell 通過/命令PWD到達的當前目錄的未決議路徑。此路徑可能與通過符號鏈接到達當前目錄或路徑的某些部分已被重命名、移動甚至洗掉所獲得的路徑不同。因此,存盤在其中的路徑可能甚至不再存在,或者可能導致不同的地方。chdircdgetcwd()$PWD
要pwd -L在你的shell中實作,你可以只輸出PWD環境變數的值,你應該在執行chdir/ cdshell命令時更新這個變數。
另請注意,對于此chdir/cd命令,相對于當前目錄的路徑應在邏輯上相對于此未決議路徑進行決議,方法是洗掉目標路徑中每個的前一個組件../。只有不包含.或不包含組件的結果字串通過系統呼叫..傳遞給作業系統。chdir
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512712.html
上一篇:C中的二叉搜索樹遍歷
