“Unix Programming Environment”를 읽고 있지만 현재 프로세스 디렉토리 개념을 이해하지 못합니다 .
각 프로세스에는 현재 directory 가 있으며 모든 파일 이름은 슬래시로 직접 시작하지 않는 한 해당 디렉토리의 이름으로 암시 적으로 간주됩니다.
모든 프로세스가 작성된 디렉토리에 사인이 있음을 의미합니까? 예를 들어,에서 프로그램 /bin/sed
을 호출 한 경우 /home/rene
sed를 호출하여 작성된 프로세스에는 현재 디렉토리가 /home/rene
있습니까?
답변
개념적 수준
쉘에서 프로세스를 시작할 때 프로세스의 현재 작업 디렉토리는 쉘의 현재 작업 디렉토리와 동일합니다. 쉘의 맥락에서 현재 작업 디렉토리는 현재 “위치”입니다.
프로세스의 현재 작업 디렉토리는 상대 경로를 해석하는 데 사용됩니다. 예를 들어, 쉘의 현재 작업 디렉토리가 쉘에서 /home/rene
실행 ls ..
된 경우 프로세스의 현재 작업 디렉토리 /home/rene
는로 해결 ..
하는 데 사용 됩니다 /home
.
시스템에서 실행중인 모든 프로세스의 현재 작업 디렉토리를 볼 수 있습니다 lsof | grep '\scwd\s'
(다른 사용자의 프로세스를 보려면 루트 여야합니다). 그러면 현재 작업 디렉토리가 시스템에서 실행중인 프로세스
프로그램 레벨
쉘의 현재 작업 디렉토리는 쉘 내장 pwd
및 cd
각각 에서보고 수정하는 디렉토리 입니다. 이 명령은 시스템 등의 전화 통화 getcwd
및 chdir
쉘의 현재 작업 디렉토리와 그 일을.
사용 bash
예를 들어,이 cd
내장 결국이 줄을 실행합니다 :
if (chdir (nolinks ? newdir : tdir) == 0)
그리고는 pwd
내장 결국이 줄을 실행합니다 :
the_current_working_directory = getcwd (0, PATH_MAX);
쉘은 현재 작업 디렉토리 사용의 편리한 예일뿐입니다. 이러한 동일한 시스템 호출은 다른 프로그램에서도 사용됩니다. 프로그램은 현재 작업 디렉토리를 변경할 수 /usr
있으며 프로그램이 사용하는 상대 경로는 /usr
디렉토리 에서 시작합니다 .
커널 레벨
프로세스의 현재 작업 디렉토리는 커널에 의해 저장됩니다. 리눅스는 그것을 저장 pwd
(A)의 멤버 fs_struct
에 의해 지적 fs
(A)의 멤버 task_struct
. pwd
회원이입니다 path
산에 대한 정보를 가리키는 구조체 ( vfsmount
파일 시스템에서) 및 디렉토리의 위치 ( dentry
). 각 프로세스에는 task_struct
관련 프로세스가 있습니다.
chdir
및 getcwd
시스템 호출을 수정하고 정보를 검색 pwd
.
답변
모든 프로세스에는 시작할 때 할당 된 현재 작업 디렉토리 (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
.