每個行程都有一個目前目錄是什麼意思?

每個行程都有一個目前目錄是什麼意思?

我正在閱讀《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。這些命令調用諸如getcwdchdir之類的系統調用,這些系統調用與 shell 的當前工作目錄一起工作。

bash個例子,cd內建函數最終運行此行:

if (chdir (nolinks ? newdir : tdir) == 0)

內建程式pwd最終運行此行:

the_current_working_directory = getcwd (0, PATH_MAX);

shell 只是目前工作目錄使用的一個方便範例;其他程式也使用這些相同的系統呼叫。程式可以將其目前工作目錄變更為,/usr程式使用的任何相對路徑都將從該/usr目錄開始,

核心級

進程的當前工作目錄由核心儲存。 Linux 將其儲存在pwda 的成員fs_struct所指向的fsa 的成員中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.

參考

相關內容