본문 바로가기

Programming/Linux_Platform

[linux] openat / open 의 차이점

출처 : http://pinocc.tistory.com/140




[linux] openat / open 의 차이점


지금은 확실히 개념이 들어오진 않는다.
일단 스크랩 후 좀 더 자새히...

open

SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);

       int creat(const char *pathname, mode_t mode);

openat

SYNOPSIS
       #include <fcntl.h>

       int openat(int dirfd, const char *pathname, int flags);
       int openat(int dirfd, const char *pathname, int flags, mode_t mode);

* pathname 이 상대경로인 경우에 dirfd 를 기준으로 상대경로를 찾는다. (open 과 다른점)

  pathname 이 상대경로이고 dirfd 가 AT_FDCWD 라는 특수 값인 경우에는 open 과 동일하게 cwd (current working directory) 로부터 상대경로를 찾는다.

위 내용을 보면 openat 시스템 콜에 dirfd 가 추가된 것을 알 수 있다.

매뉴얼을 보면 open 뿐 아니라 다른 모든 -at 이 붙은 시스템콜을 지원하는 이유는 두가지 이다.


1. -at 이 붙은 시스템 콜을 사용하여 race condition 을 줄인다. race condition 은 주어진 pathname 의 path 중 일부가 변경됨과 동시에 open 이 호출되는 경우에 발생한다.

2. 어플리케이션이 관리하는 fd 를 통해서 thread 별 'current working directory' 를 구현할 수 있다. (/proc/self/fd/dirfd 에 기반하여 트릭을 써서 per-thread cwd 를 구현할 수 있긴 하지만, 비효율적이다)





실 사용예





static void do_coldboot(DIR *d, int lvl)

{

    struct dirent *de;

    int dfd, fd;


    dfd = dirfd(d);


    fd = openat(dfd, "uevent", O_WRONLY);

    if(fd >= 0) {

        write(fd, "add\n", 4);

        close(fd);

    }


    while((de = readdir(d))) {

        DIR *d2;


        if (de->d_name[0] == '.')

            continue;


        if (de->d_type != DT_DIR && lvl > 0)

            continue;


        fd = openat(dfd, de->d_name, O_RDONLY | O_DIRECTORY);

        if(fd < 0)

            continue;


        d2 = fdopendir(fd);

        if(d2 == 0)

            close(fd);

        else {

            do_coldboot(d2, lvl + 1);

            closedir(d2);

        }

    }

} 



'Programming > Linux_Platform' 카테고리의 다른 글

kill parent and child process sametime  (0) 2016.02.04
TEMP_FAILURE_RETRY  (0) 2015.12.01
Android init.rc 분석  (0) 2015.10.26
fstab & partition images  (0) 2015.10.19
linux command : stat, fstat, lstat  (0) 2015.10.19