"유닉스 프로그래밍 환경"을 읽고 있지만 개념을 이해하지 못합니다.현재 디렉터리프로세스의.
각 프로세스에는현재 디렉터리, 모든 파일 이름은 슬래시로 직접 시작하지 않는 한 암시적으로 해당 디렉터리의 이름으로 시작하는 것으로 가정됩니다.
모든 프로세스에는 해당 프로세스가 생성된 디렉터리에 대한 표시가 있다는 의미입니까? 예를 들어 프로그램이 /bin/sed
에서 호출된 경우 /home/rene
sed를 호출하여 생성된 프로세스는 현재 디렉터리를 /home/rene
?
답변1
개념적 수준
셸에서 프로세스를 시작하면 프로세스의 현재 작업 디렉터리는 셸의 현재 작업 디렉터리와 동일합니다. 쉘의 맥락에서 현재 작업 디렉토리는 현재 "있는" 위치입니다.
모든 프로세스의 현재 작업 디렉터리는 상대 경로를 해석하는 데 사용됩니다. 예를 들어, 셸의 현재 작업 디렉터리가 이고 셸에서 /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
디렉토리에서 시작됩니다.
커널 수준
프로세스의 현재 작업 디렉터리는 커널에 의해 저장됩니다. Linux는 이를 a 멤버 가 가리키는 a pwd
멤버 에 저장합니다 . 멤버 는 마운트( ) 및 파일 시스템의 디렉터리 위치( )에 대한 정보를 가리키는 구조체 입니다 . 각 프로세스 에는 연관된 프로세스가 있습니다.fs_struct
fs
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