각 프로세스에 현재 디렉토리가 있다는 것은 무엇을 의미합니까? Programming Environment”를 읽고

“Unix Programming Environment”를 읽고 있지만 현재 프로세스 디렉토리 개념을 이해하지 못합니다 .

각 프로세스에는 현재 directory 가 있으며 모든 파일 이름은 슬래시로 직접 시작하지 않는 한 해당 디렉토리의 이름으로 암시 적으로 간주됩니다.

모든 프로세스가 작성된 디렉토리에 사인이 있음을 의미합니까? 예를 들어,에서 프로그램 /bin/sed을 호출 한 경우 /home/renesed를 호출하여 작성된 프로세스에는 현재 디렉토리가 /home/rene있습니까?



답변

개념적 수준

쉘에서 프로세스를 시작할 때 프로세스의 현재 작업 디렉토리는 쉘의 현재 작업 디렉토리와 동일합니다. 쉘의 맥락에서 현재 작업 디렉토리는 현재 “위치”입니다.

프로세스의 현재 작업 디렉토리는 상대 경로를 해석하는 데 사용됩니다. 예를 들어, 쉘의 현재 작업 디렉토리가 쉘에서 /home/rene실행 ls ..된 경우 프로세스의 현재 작업 디렉토리 /home/rene는로 해결 ..하는 데 사용 됩니다 /home.

시스템에서 실행중인 모든 프로세스의 현재 작업 디렉토리를 볼 수 있습니다 lsof | grep '\scwd\s'(다른 사용자의 프로세스를 보려면 루트 여야합니다). 그러면 현재 작업 디렉토리가 시스템에서 실행중인 프로세스

프로그램 레벨

쉘의 현재 작업 디렉토리는 쉘 내장 pwdcd각각 에서보고 수정하는 디렉토리 입니다. 이 명령은 시스템 등의 전화 통화 getcwdchdir쉘의 현재 작업 디렉토리와 그 일을.

사용 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관련 프로세스가 있습니다.

chdirgetcwd시스템 호출을 수정하고 정보를 검색 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.

참고 문헌


답변