반응형
fchdir(2)
#include <unistd.h>
int fchdir(int fd);
현재 작업 디렉토리를 open을 통해서 열려진 file descriptor가 가르키는 directory로 변경합니다.
fchdir(2) 함수는 chdir(2)에 비하여 거의 사용하지 않습니다.
대부분 directory를 변경하려면 디렉토리 정보가 있어야 chdir를 할 수 있으며,
fchdir(2)도 마찬가지로 디렉토리 정보를 알아야 open(2)으로 fd를 생성할 수 있습니다.
그렇지만 대량처리를 할 때에 디렉토리를 옮겨가면서 작업을 하다가 수시로 원래의 디렉토리로 돌아와야 할 때에 즉, 현재 디렉토리를 저장해두고 다른 디렉토리로 이동해서 작업한 후에 저장된 현재 디렉토리로 빈번히 돌아와야 할 경우에는 유용합니다. 즉, 특정 디렉토리로 자주 가야하는 경우에 chdir(2)보다 fchdir(2)가 빠르게 동작합니다.
chdir(2)는 디렉토리명을 넘기면 OS가 inode를 찾아서 디렉토리로 이동합니다.
fchdir(2)는 open(2)으로 fd를 열 때에는 디렉토리명을 OS가 inode를 찾아서 디렉토리를 open합니다.
fchdir(2)는 fd에 연결된 inode를 바로 찾아가서 작업디렉토리를 변경합니다.
sample 소스코드를 참조하세요.
파라미터
fd
- open(2) 함수를 통하여 열려진 directory에 대한 file descriptor
RETURN
0
- 프로세스의 작업디렉토리가 정상적으로 변경되었습니다.
-1
- 오류가 발생하였으며, 기존의 작업디렉토리가 유지됩니다. 상세 오류 내용은 errno에 저장됩니다.
EACCES : 열려진 fd가 가리키는 directory에 search permission이 없음.
EBADF : fd가 유효한 file descriptor가 아님.
활용 예제
Sample
#include <unistd.h>
#include <sts/types.h>
......
char path[1024];
char dir[1024];
int fd;
// 현재디렉토리 정보를 얻습니다.
if(getcwd(path, 1024) == NULL) {
return -1;
}
// 현재 디렉토리로 빨리 이동할 수 있도록 fd를 생성합니다.
// fd는 close하지 않고 계속 유지합니다.
if((fd = open(path, O_RDONLY)) == -1) {
fprintf(stderr, "directory open error: %s\n", strerror(errno));
return -1;
}
......
while(1) {
......
// 새로운 작업 디렉토리로 이동하여 작업을 합니다.
chdir(dir);
......
// 최초 작업 디렉토리로 빠르게 이동합니다.
fchdir(fd);
}
......
see also : Directory 정보 조회 및 관리 Library
반응형
'C언어 header > unistd.h' 카테고리의 다른 글
getuid(2) - 현재 process의 real user id 얻기 (0) | 2019.10.11 |
---|---|
getcwd(3) - 현재 작업 경로를 얻음 (0) | 2019.10.04 |
chdir(2) - 현재 작업 디렉토리 변경함 (0) | 2019.10.04 |
rmdir(2) - directory 삭제하기 (0) | 2019.10.04 |
write(2) - 파일에 데이터 쓰기 (0) | 2019.10.04 |