안녕하세요. 이번 시간에는 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"를 찾아 봅시다.

없습니다. 그렇기 때문에 파일이 없다는 오류를 뱉을 수 밖에 없겠습니다.
'OS > 리눅스' 카테고리의 다른 글
리눅스 다중 명령어 && || ; 에 대해 알아봅시다 (0) | 2022.10.31 |
---|---|
우분투 서버 현재 시간을 date 명령어를 이용해서 출력해 봅시다. (0) | 2022.10.09 |
리눅스 proc의 cwd에 대해 알아봅시다. (2) | 2022.09.19 |
리눅스 crontab 명령어를 알아보고 간단하게 사용해 봅시다. (0) | 2022.09.16 |
리눅스 which 명령어로 명령어 위치를 찾아봅시다. (0) | 2022.09.09 |
최근댓글