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 |