반응형

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

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,