"Unix 프로그래밍 환경"을 읽고 있지만 개념을 이해하지 못합니다.현재 디렉터리의 과정.
모든 프로세스에는현재 디렉터리, 모든 파일 이름은 슬래시로 직접 시작하지 않는 한 암시적으로 해당 디렉터리의 이름으로 시작하는 것으로 가정됩니다.
이것은 모든 프로세스가 생성된 디렉토리에 플래그를 가지고 있다는 것을 의미합니까? 예를 들어, 프로그램이 ? /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는 이를 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: /
따라서 프로세스의 CWD(PID: 24532)는 입니다 /
.
또 다른 예는 다음과 같습니다.
$ 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