본문 바로가기
IT 기술/프로그래밍관련

[linux] openat / open 의 차이점

by 땅뚱 2012. 12. 28.

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 를 구현할 수 있긴 하지만, 비효율적이다)


'IT 기술 > 프로그래밍관련' 카테고리의 다른 글

[bash] script debugging  (0) 2013.10.11
[bash] 5th - Trap Statement  (0) 2013.08.01
[bash] 4th - 명령행 옵션과 유형 변수  (0) 2012.09.26
[bash] 3rd - 흐름제어  (0) 2012.08.27
[bash] 2nd - 기본 쉘 프로그래밍  (0) 2012.08.10