我正在閱讀《Unix 程式設計環境》,但我不理解這個概念目前目錄的過程。
每個進程,都有一個目前目錄,並且所有檔案名稱都隱含地假定以該目錄的名稱開頭,除非它們直接以斜線開頭。
這是否意味著每個進程在其創建的目錄中都有一個標誌?例如,如果程式/bin/sed
是從 呼叫的/home/rene
,那麼透過呼叫 sed 建立的進程具有當前目錄/home/rene
?
答案1
概念層面
當您從 shell 啟動進程時,該進程的目前工作目錄與 shell 的目前工作目錄相同。在 shell 的上下文中,目前工作目錄是您目前「所在」的位置。
任何進程的目前工作目錄都用於解釋相對路徑。例如,如果您的 shell 的目前工作目錄是,/home/rene
並且您從 shell 運行ls ..
,則進程的目前工作目錄/home/rene
,將用於解析..
為/home
。
您可以使用下列命令查看系統上執行的所有進程的目前工作目錄lsof | grep '\scwd\s'
(請注意,您可能需要 root 身分才能查看其他使用者的進程。)這可以讓您了解目前工作目錄與系統上執行的進程。
節目等級
shell 目前的工作目錄是您分別使用 shell 內建指令pwd
和看到和修改的目錄cd
。這些命令調用諸如getcwd
和chdir
之類的系統調用,這些系統調用與 shell 的當前工作目錄一起工作。
舉bash
個例子,cd
內建函數最終運行此行:
if (chdir (nolinks ? newdir : tdir) == 0)
內建程式pwd
最終運行此行:
the_current_working_directory = getcwd (0, PATH_MAX);
shell 只是目前工作目錄使用的一個方便範例;其他程式也使用這些相同的系統呼叫。程式可以將其目前工作目錄變更為,/usr
程式使用的任何相對路徑都將從該/usr
目錄開始,
核心級
進程的當前工作目錄由核心儲存。 Linux 將其儲存在pwd
a 的成員fs_struct
所指向的fs
a 的成員中task_struct
。該pwd
成員是一個path
結構體,它指向有關掛載 ( vfsmount
) 和目錄在檔案系統 ( dentry
) 中的位置的資訊。每個進程都有一個task_struct
與之相關的進程。
chdir
和系統getcwd
呼叫修改和檢索 中的資訊pwd
。
答案2
每個進程都有一個在啟動時分配到的目前工作目錄 (CWD)。您可以執行下列操作來尋找進程的工作目錄。
運行 ps aux 找出進程的 PID:
$ pgrep cupsd
24532
找出 PID 的目前工作目錄:24532
$ sudo pwdx 24532
24532: /
因此進程(PID:24532)的 CWD 為/
。
這是另一個例子:
$ sleep 1000 &
[1] 15988
$ pwdx 15988
15988: /home/sam
這次睡眠進程(PID:15988)將其 CWD 設定為我的主目錄/home/sam
.
您也可以運行ls -l
命令:
$ sudo ls -l /proc/24532/cwd
lrwxrwxrwx 1 root root 0 Apr 30 19:18 /proc/24532/cwd -> /
-或者-
$ ls -l /proc/15988/cwd
lrwxrwxrwx 1 sam sam 0 Apr 30 19:23 /proc/15988/cwd -> /home/sam
在這裡您可以再次看到這些進程的 CWD,/
並且/home/sam
.