리눅스 proc의 cwd에 대해 알아봅시다.

OS/리눅스 2022. 9. 19. 01:39

 안녕하세요. 이번 시간에는 proc/{pid} 안에 있는 cwd에 대해서 간단하게 알아보겠습니다. 요약하면 프로세스의 현재 working directory 정도가 되겠습니다.

 


 먼저 pstree -p로 현재 실행되고 있는 프로세스들의 tree를 확인해 봅시다. 이 중에, bash가 눈에 보이네요. pid가 12라는 의미인데요. /proc/12로 가 보면 현재 실행되고 있는 bash에 대해 여러 정보들이 저장되어 있습니다.

 

 

 여러가지 파일들이 보이는데요. 이 중에 cwd를 보겠습니다.

 

 

 ls -ail | grep cwd를 입력하면, 프로세스의 현재 working directory를 볼 수 있어요. 12번 프로세스는 /proc/12가 현재 working directory인가 보군요.

 


 이제 간단한 c++ 프로그램을 만들어 봅시다. 이 파일을 1.cpp로 저장하고 실행파일 1로 컴파일을 해 보겠습니다. 그 다음에, 해당 프로그램을 제 홈 디렉토리에서 실행한 후에, 다른 세션으로 pstree -p를 입력해 보겠습니다.

 

 

 1이 보이는군요. 옆에 있는 괄호는 154번 pid를 가지는 프로세스라는 의미입니다.

 

 

 해당 프로세스의 cwd를 보면, /home/chokw로 잡혀 있어요.

 


 그러면 프로세스의 current working directory가 왜 중요할까요? 몇몇 sys call들은 상대 경로가 주어지고 특정 상태를 넘겨주었을 때, current working directory를 기반으로 작동하기 때문입니다. 대표적으로 openat 같은 것들입니다. /home/cho에 1.txt를 생성해 보겠습니다. 그리고, 같은 위치에 1.cpp를 생성합니다.

 

 

 1.cpp입니다. "1.txt"를 "r" 옵션으로 엽니다. 1.cpp를 컴파일 해서 1이라는 이름을 가진 실행파일을 생성해 보겠습니다. 그리고 /home 에서 chokw/1을 실행시켜 봅시다.

 

 요렇게요. strace를 볼까요? fopen이 호출되었으니, 내부 시스템 콜을 호출하기는 할 텐데요.

 

 

 AT_FDCWD가 켜져 있고, 2번째 경로가 "1.txt"로 주어져 있어요. 상대 경로로 주어져 있네요? 그러면, current working directory 기반으로 작동하게 됩니다.

 

 

 그런데 /home/cho 디렉토리에서 실행시킨 1은 openat에 아무런 에러가 없습니다. 3이라는 것이 떨어집니다. 이는 파일이 있어서 파일 디스크립터가 성공적으로 생성되었다는 의미인데요. 이 둘의 차이는 무엇일까요?

 

 

 1이라는 이름을 가진 실행파일이 2개나 띄워져 있네요. 각각 pid가 403, 397입니다. 이 둘의 cwd를 볼까요?

 

 

 하나는 /home을 보고 있고, 다른 하나는 /home/chokw를 보고 있네요. 실제 1.txt는 /home/chokw에 있기 때문에 /home에서 실행시킨 cho/1은 1.txt를 못 보고 파일이 없다는 에러를 떨구게 된 셈입니다. 그러면, 이 process의 current directory를 바꿀 방법은 없는 걸까요? 이건 다음에 이야기 해 보도록 하겠습니다.