안녕하세요. 이번 시간에는 chdir과 getcwd 함수에 대해 간단하게 알아보겠습니다. 전자는 current working directory를 바꾸고, 후자는 current working directory를 얻어오는 역할을 합니다. 둘 다 unistd.h를 include 해야 합니다.

 


 먼저 chdir을 봅시다. path를 하나 받는데요. 절대 경로와 상대 경로 둘 다 받습니다. 이것이 무슨 역할을 할까요?

 

 

 calling process의 현재 working directory를 PATH로 바꿉니다. 성공하면 0을, 그렇지 않으면 -1을 리턴합니다. 이 함수가 어떤 역할을 하는지는 밑에 예제를 보면서 후술하겠습니다.

 

 

 getcwd입니다. current working directory를 얻어오는 함수는 3개가 있습니다. getcwd, getwd, get_current_dir_name.

 

 

 이 중 getcwd는 current working directory의 절대 경로를 얻어오게 됩니다. 그리고 그 결과를 length가 size인 buf에 저장합니다.

 


 어렵지 않으니까, 예제를 보겠습니다.

 

 먼저, getcwd로 현재 path를 얻어와요. 다음에, chdir로 프로세스의 작업 디렉토리를 /home/chokw/test로 바꿔버리는데요. 그 다음에, 다시 getcwd로 프로세스의 작업 디렉토리를 출력하게 됩니다.

 

 

 해당 프로그램의 실행 결과는 위와 같습니다. 문제는 그 이후에 fopen("1.txt", "r")이 오류를 안 뱉고 제대로 수행되었느냐는 것인데요. 사실, working directory가 바뀐 후에 "1.txt"를 찾았기 때문에 제대로 수행되지 않았다는 것을 짐작할 수 있습니다. 혹시 모르니까 확인을 해 볼까요?

 

 

 다른 세션으로 pstree -p를 입력해 봅시다. 그러면 1이라는 이름을 가진 프로세스의 pid가 334임을 확인할 수 있어요. 그러면, pid가 334인 프로세스의 정보들을 보기 위해서는 /proc/334로 접근해야 겠지요.

 

 

 cwd에 대한 정보만 봅시다. 그러면 /home/chokw/test가 current working directory로 잡혀있음을 알 수 있는데요.

 

 

 openat의 2번째 인자가 상대 경로로 잡혀 있고, 1번째 인자가 AT_FDCWD로 잡혀 있기 때문에, 현재 working directory를 기준으로 "1.txt"를 찾게 됩니다. 그런데, /home/chokw/test에서 "1.txt"를 찾아 봅시다.

 

 

 없습니다. 그렇기 때문에 파일이 없다는 오류를 뱉을 수 밖에 없겠습니다.