출처 : 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 |