open(2) - wariua/manpages-ko GitHub Wiki
open, openat, creat - ํ์ผ์ ์ด๊ณ ๋์ ๋ฐ๋ผ ์์ฑํ๊ธฐ
#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);
int openat(int dirfd, const char *pathname, int flags);
int openat(int dirfd, const char *pathname, int flags, mode_t mode);
glibc ๊ธฐ๋ฅ ํ์ธ ๋งคํฌ๋ก ์๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):
-
openat()
: -
- glibc 2.10๋ถํฐ:
_POSIX_C_SOURCE >= 200809L
- glibc 2.10 ์ :
_ATFILE_SOURCE
open()
์์คํ
ํธ์ถ์ pathname
์ ์ง์ ํ ํ์ผ์ ์ฐ๋ค. ์ง์ ํ ํ์ผ์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ์ ํ์ ์ผ๋ก (flags
์ O_CREAT
์ ์ง์ ํ ๊ฒฝ์ฐ) open()
์์ ์์ฑํ ์๋ ์๋ค.
open()
์ ๋ฐํ ๊ฐ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ด๋ค. ์ด๋ ์์ ์์ ์๋ ์ ์์ด๋ฉฐ ์ดํ์ ์์คํ
ํธ์ถ๋ค(read(2)
, write(2)
, lseek(2), fcntl(2) ๋ฑ)์์ ๊ทธ ์ด๋ฆฐ ํ์ผ์ ๊ฐ๋ฆฌํค๋ ๋ฐ ์ด๋ค. ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด ํ๋ก์ธ์ค์์ ํ์ฌ ์ด๋ ค ์์ง ์์ ๊ฐ์ฅ ๋ฎ์ ๋ฒํธ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ execve(2)๋ฅผ ๊ฑฐ์น ๋ ๊ณ์ ์ด๋ ค ์๋๋ก ์ค์ ๋ผ ์๋ค. (์ฆ fcntl(2)์์ ์ค๋ช
ํ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ํ๋๊ทธ FD_CLOEXEC
๊ฐ ์ฒ์์๋ ๋นํ์ฑํ๋ผ ์๋ค.) ์๋์์ ์ค๋ช
ํ๋ O_CLOEXEC
ํ๋๊ทธ๋ฅผ ์จ์ ์ด ๊ธฐ๋ณธ ์ค์ ์ ๋ฐ๊ฟ ์ ์๋ค. ํ์ผ ์คํ์
์ ํ์ผ ์์์ ์ผ๋ก ์ค์ ๋ผ ์๋ค. (lseek(2) ์ฐธ๊ณ .)
open()
ํธ์ถ์ ์๋ก์ด ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ(open file description)์ ๋ง๋ ๋ค. ์ด๋ ์์คํ
์ ์ญ ์ด๋ฆฐ ํ์ผ ํ
์ด๋ธ์ ํญ๋ชฉ์ด๋ค. ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์์๋ ํ์ผ ์คํ์
๊ณผ ํ์ผ ์ํ ํ๋๊ทธ(์๋ ์ฐธ๊ณ )๋ฅผ ๊ธฐ๋กํ๋ค. ํ์ผ ๋์คํฌ๋ฆฝํฐ(file descriptor)๋ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ๋ํ ์ฐธ์กฐ์ด๋ค. ์ด ์ฐธ์กฐ๋ pathname
์ด ์ดํ ์ ๊ฑฐ๋๊ฑฐ๋ ๋ค๋ฅธ ํ์ผ์ ๊ฐ๋ฆฌํค๊ฒ ๋ฐ๋๋๋ผ๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค. ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ๋ํ ๋ ์์ธํ ๋ด์ฉ์ NOTES๋ฅผ ๋ณด๋ผ.
์ธ์ flags
์๋ ์ ๊ทผ ๋ชจ๋ O_RDONLY
, O_WRONLY
, O_RDWR
์ค ํ๋๊ฐ ํฌํจ๋ผ์ผ ํ๋ค. ๊ฐ๊ฐ ํ์ผ์ ์ฝ๊ธฐ ์ ์ฉ, ์ฐ๊ธฐ ์ ์ฉ, ์ฝ๊ธฐ/์ฐ๊ธฐ๋ก ์ด๋๋ก ์์ฒญํ๋ค.
flags
์ ์ถ๊ฐ๋ก ํ์ผ ์์ฑ ํ๋๊ทธ์ ํ์ผ ์ํ ํ๋๊ทธ๋ฅผ 0๊ฐ ์ด์ ๋นํธ OR ํ ์ ์๋ค. ํ์ผ ์์ฑ ํ๋๊ทธ๋ O_CLOEXEC
, O_CREAT
, O_DIRECTORY
, O_EXCL
, O_NOCTTY
, O_NOFOLLOW
, O_TMPFILE
, O_TRUNC
์ด๋ค. ํ์ผ ์ํ ํ๋๊ทธ๋ ์๋ ๋์ด๋ ํ๋๊ทธ๋ค ์ค ๋๋จธ์ง ์ ๋ถ์ด๋ค. ์ด ๋ ํ๋๊ทธ ์ข
๋ฅ์ ์ฐจ์ด๋ ํ์ผ ์์ฑ ํ๋๊ทธ๊ฐ ์ด๊ธฐ ๋์ ์์ฒด์ ๋์ ๋ฐฉ์์ ์ํฅ์ ์ฃผ๋ ๋ฐ๋ฉด ํ์ผ ์ํ ํ๋๊ทธ๋ ์ด์ด์ง๋ I/O ๋์๋ค์ ๋์ ๋ฐฉ์์ ์ํฅ์ ์ค๋ค๋ ์ ์ด๋ค. ํ์ผ ์ํ ํ๋๊ทธ๋ ์ฝ์ด ์ฌ ์ ์์ผ๋ฉฐ (์ผ๋ถ ๊ฒฝ์ฐ์) ๋ณ๊ฒฝํ ์ ์๋ค. ์์ธํ ๋ด์ฉ์ fcntl(2) ์ฐธ๊ณ .
ํ์ผ ์์ฑ ํ๋๊ทธ ๋ฐ ํ์ผ ์ํ ํ๋๊ทธ์ ๋ํ ์ ์ฒด ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ๋ค.
O_APPEND
-
ํ์ผ์ ๋ง๋ถ์ด๊ธฐ ๋ชจ๋๋ก ์ฐ๋ค.
write(2)
์ ๋ง๋ค ํ์ผ ์คํ์ ์[[lseek(2)]]์ผ๋ก ํ๋ฏ ํ์ผ ๋์ผ๋ก ์ฎ๊ธด๋ค. ๊ทธ ํ์ผ ์คํ์ ๋ณ๊ฒฝ๊ณผ ์ฐ๊ธฐ ๋์์ ํ ๊ฐ์ ์์์ ๋จ๊ณ๋ก ์ํ๋๋ค.
์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ถ์ด๋ ๊ฒฝ์ฐ NFS ํ์ผ ์์คํ ์์์
O_APPEND
๋ฅผ ํด๋ ํ์ผ ๋ด์ฉ์ ์ค๋ฅ๊ฐ ์๊ธธ ์ ์๋ค. ํ์ผ์ ๋ง๋ถ์ด๊ธฐ ๋์์ NFS์์ ์ง์ํ์ง ์์์ ํด๋ผ์ด์ธํธ ์ปค๋์์ ๊ทธ๊ฑธ ๋ชจ์ฌํด์ผ ํ๋๋ฐ, ๊ฒฝ์ ์กฐ๊ฑด ์์ด ํ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. O_ASYNC
- ์๊ทธ๋ ์ฃผ๋ I/O๋ฅผ ์ผ ๋ค. ์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ์
๋ ฅ์ด๋ ์ถ๋ ฅ์ด ๊ฐ๋ฅํด์ง๋ฉด ์๊ทธ๋(๊ธฐ๋ณธ์
SIGIO
์ด๋ fcntl(2)๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ)์ ์์ฑํ๋ค. ์ด ๊ธฐ๋ฅ์ ํฐ๋ฏธ๋, ์ ์ฌ ํฐ๋ฏธ๋, ์์ผ, ๊ทธ๋ฆฌ๊ณ (๋ฆฌ๋ ์ค 2.6๋ถํฐ) ํ์ดํ ๋ฐ FIFO์ ๋ํด์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์์ธํ ๋ด์ฉ์ fcntl(2)์ ๋ณด๋ผ. ์๋ BUGS๋ ์ฐธ๊ณ . -
O_CLOEXEC
(๋ฆฌ๋ ์ค 2.6.23๋ถํฐ) -
์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ 'exec์์ ๋ซ๊ธฐ' ํ๋๊ทธ๋ฅผ ์ผ ๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ํ๋ก๊ทธ๋จ์์ ๋ฐ๋ก fcntl(2)
F_SETFD
๋์์ผ๋กFD_CLOEXEC
ํ๋๊ทธ๋ฅผ ์ค์ ํ์ง ์์๋ ๋๋ค.์ฐธ๊ณ ๋ก ์ผ๋ถ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์๋ ์ด ํ๋๊ทธ ์ฌ์ฉ์ด ํ์์ ์ด๋ค. ํ ์ค๋ ๋๊ฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ด์ด์ fcntl(2)๋ก 'exec์์ ๋ซ๊ธฐ' ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ ค๋๋ฐ ๋์์ ๋ค๋ฅธ ์ค๋ ๋์์ fork(2)์ execve(2)๋ฅผ ํ๋ ๊ฒฝ์ฐ์์ ๋ณ๋์ fcntl(2)
F_SETFD
๋์์ผ๋กFD_CLOEXEC
ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ ๋ฐฉ์์ ๊ฒฝ์ ์กฐ๊ฑด์ ํผํ๋ ๋ฐ ์ถฉ๋ถ์น ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฒฝ์์ผ๋ก ์ธํด ์คํ ์์์ ๋ฐ๋ผ์open()
์ด ๋ฐํํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ fork(2)๋ก ์๊ธด ์์ ํ๋ก์ธ์ค์์ ์คํํ๋ ํ๋ก๊ทธ๋จ์๊ฒ ์๋์น ์๊ฒ ๋์ถ๋ ์ ์๋ค. (์์น์ ์ผ๋ก ์ด๋ฐ ์ข ๋ฅ์ ๊ฒฝ์์ 'exec์์ ๋ซ๊ธฐ' ํ๋๊ทธ๋ฅผ ์ค์ ํด์ผ ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์์ฑํ๋ ๋ชจ๋ ์์คํ ํธ์ถ์์ ๊ฐ๋ฅํ๋ฉฐ, ๊ทธ๋์ ์ฌ๋ฌ ๋ฆฌ๋ ์ค ์์คํ ํธ์ถ์์O_CLOEXEC
ํ๋๊ทธ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ ์ด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ค.) O_CREAT
-
pathname
์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๊ทธ ๊ฒฝ๋ก๋ช ์ผ๋ก ์ ๊ท ํ์ผ์ ๋ง๋ ๋ค.์ ํ์ผ์ ์์ ์(์ฌ์ฉ์ ID)๋ ํ๋ก์ธ์ค์ ์คํจ ์ฌ์ฉ์ ID๋ก ์ค์ ํ๋ค.
์ ํ์ผ์ ๊ทธ๋ฃน ์์ (๊ทธ๋ฃน ID)๋ ํ๋ก์ธ์ค์ ์คํจ ๊ทธ๋ฃน ID(์์คํ V ๋ฐฉ์)๋ ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ ๊ทธ๋ฃน ID(BSD ๋ฐฉ์) ์ค ํ๋๋ก ์ค์ ํ๋ค. ๋ฆฌ๋ ์ค์์๋ ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ set-group-ID ๋ชจ๋ ๋นํธ๊ฐ ์ค์ ๋ผ ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋์์ด ๋ค๋ฅด๋ค. ๊ทธ ๋นํธ๊ฐ ์ค์ ๋ผ ์์ผ๋ฉด BSD ๋ฐฉ์์ ๋ฐ๋ฅด๊ณ , ์๋๋ฉด ์์คํ V ๋ฐฉ์์ ์ ์ฉํ๋ค. ์ผ๋ถ ํ์ผ ์์คํ ์์๋ (mount(8)์์ ์ค๋ช ํ๋) ๋ง์ดํธ ์ต์
bsdgroups
๋ฐsysvgroups
์ ๋ฐ๋ผ์๋ ๋์์ด ๋ฌ๋ผ์ง๋ค.mode
์ธ์๋ ์ ํ์ผ ์์ฑ ์ ์ ์ฉํ ํ์ผ ๋ชจ๋ ๋นํธ๋ฅผ ๋ํ๋ธ๋ค.flags
์O_CREAT
์ด๋O_TMPFILE
๋ฅผ ์ง์ ํ ๋๋ ์ด ์ธ์๋ฅผ ์ ๊ณตํด์ผ ํ๋ค.O_CREAT
๊ณผO_TMPFILE
์ด๋ ์ชฝ๋ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ์๋mode
๊ฐ ๋ฌด์๋๋ค. ์คํจ ๋ชจ๋๋ ํ๋ก์ธ์ค์umask
๋ฅผ ์ผ๋ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํด ๋ณ๊ฒฝํ ๊ฐ์ด๋ค. ์ฆ ๊ธฐ๋ณธ ACL์ด ์๋ ๊ฒฝ์ฐ ์์ฑ ํ์ผ์ ๋ชจ๋๋(mode & ~umask)
์ด๋ค. ์ฐธ๊ณ ๋ก ์ด ๋ชจ๋๋ ์๋ก ์์ฑ๋๋ ํ์ผ์ ํฅํ ์ ๊ทผ์๋ง ์ ์ฉ๋๋ค. ์ฆ ์ฝ๊ธฐ ์ ์ฉ ํ์ผ์ ์์ฑํ๊ฒ ๋ผ ์๋open()
ํธ์ถ์ด ์ฝ๊ธฐ/์ฐ๊ธฐ ๊ฐ๋ฅํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๋ ๊ฒ๋ ์ถฉ๋ถํ ๊ฐ๋ฅํ๋ค.mode
๋ฅผ ์ํ ๋ค์ ์์ ์ฌ๋ณผ๋ค์ด ์ ๊ณต๋๋ค.S_IRWXU
00700 ์ฌ์ฉ์(ํ์ผ ์์ ์)๊ฐ ์ฝ๊ธฐ, ์ฐ๊ธฐ, ์คํ ๊ถํ์ ๊ฐ์ง S_IRUSR
00400 ์ฌ์ฉ์๊ฐ ์ฝ๊ธฐ ๊ถํ์ ๊ฐ์ง S_IWUSR
00200 ์ฌ์ฉ์๊ฐ ์ฐ๊ธฐ ๊ถํ์ ๊ฐ์ง S_IXUSR
00100 ์ฌ์ฉ์๊ฐ ์คํ ๊ถํ์ ๊ฐ์ง S_IRWXG
00070 ๊ทธ๋ฃน์ด ์ฝ๊ธฐ, ์ฐ๊ธฐ, ์คํ ๊ถํ์ ๊ฐ์ง S_IRGRP
00040 ๊ทธ๋ฃน์ด ์ฝ๊ธฐ ๊ถํ์ ๊ฐ์ง S_IWGRP
00020 ๊ทธ๋ฃน์ด ์ฐ๊ธฐ ๊ถํ์ ๊ฐ์ง S_IXGRP
00010 ๊ทธ๋ฃน์ด ์คํ ๊ถํ์ ๊ฐ์ง S_IRWXO
00007 ๊ธฐํ๊ฐ ์ฝ๊ธฐ, ์ฐ๊ธฐ, ์คํ ๊ถํ์ ๊ฐ์ง S_IROTH
00004 ๊ธฐํ๊ฐ ์ฝ๊ธฐ ๊ถํ์ ๊ฐ์ง S_IWOTH
00002 ๊ธฐํ๊ฐ ์ฐ๊ธฐ ๊ถํ์ ๊ฐ์ง S_IXOTH
00001 ๊ธฐํ๊ฐ ์คํ ๊ถํ์ ๊ฐ์ง POSIX์ ๋ฐ๋ฅด๋ฉด
mode
์ ์ค์ ๋ ๋ค๋ฅธ ๋นํธ๋ค์ ํจ๊ณผ๋ ๋ช ์ธ๋์ด ์์ง ์๋ค. ๋ฆฌ๋ ์ค์์๋mode
์์ ๋ค์ ๋นํธ๋ค๋ ๋ฐ๋๋ค.S_ISUID
0004000 set-user-ID ๋นํธ S_ISGID
0002000 set-group-ID ๋นํธ (inode(7) ์ฐธ๊ณ ) S_ISVTX
0001000 ์คํฐํค ๋นํธ (inode(7) ์ฐธ๊ณ ) -
O_DIRECT
(๋ฆฌ๋ ์ค 2.4.10๋ถํฐ) -
์ด ํ์ผ์ ๋ํ I/O์์ ์บ์ ํจ๊ณผ๋ฅผ ์ต์ํํ๋ ค ๋ ธ๋ ฅํ๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ๊ทธ๋ ๊ฒ ํ๋ฉด ์ฑ๋ฅ์ด ๋จ์ด์ง์ง๋ง ์์ฉ์์ ์์ฒด ์บ์ฑ์ ํ๋ ๊ฒฝ์ฐ์ฒ๋ผ ํน์ํ ์ํฉ์์๋ ์ธ๋ชจ๊ฐ ์๋ค. ์ฌ์ฉ์ ๊ณต๊ฐ ๋ฒํผ์ ์ง์ ํ์ผ I/O๊ฐ ์ด๋ค์ง๋ค.
O_DIRECT
ํ๋๊ทธ ๊ทธ ์์ฒด์์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์ ์กํ๋ ค๋ ๋ ธ๋ ฅ์ ํ๊ธฐ๋ ํ์ง๋ง ๋ฐ์ดํฐ์ ๊ด๋ จ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋O_SYNC
ํ๋๊ทธ์ ๋ณด์ฅ์ ํด ์ฃผ์ง๋ ์๋๋ค. ๋๊ธฐ์ I/O๋ฅผ ๋ณด์ฅํ๋ ค๋ฉดO_DIRECT
์ ๋ํดO_SYNC
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ์ถ๊ฐ ์ค๋ช ์ ์๋ NOTES๋ฅผ ๋ณด๋ผ.๋ธ๋ก ์ฅ์น์ ๋ํ ๋น์ทํ (ํ์ง๋ง ๊ตฌ์์ด ๋) ์ธํฐํ์ด์ค๋ฅผ
raw(8)
์์ ์ค๋ช ํ๋ค. O_DIRECTORY
-
pathname
์ด ๋๋ ํฐ๋ฆฌ๊ฐ ์๋๋ฉด ์ด๊ธฐ๊ฐ ์คํจํ๋๋ก ํ๋ค. ์ด ํ๋๊ทธ๋ ์ปค๋ ๋ฒ์ 2.1.126์์ ์ถ๊ฐ๋ ๊ฒ์ธ๋ฐ, FIFO ๋ด์ง ํ ์ดํ ์ฅ์น์์ opendir(3)์ ํธ์ถํ ๋์ ์๋น์ค ๊ฑฐ๋ถ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด์์๋ค. O_DSYNC
-
ํ์ผ์์์ ์ฐ๊ธฐ ๋์์ด ๋๊ธฐ I/O ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์๋ฃ ์๊ฑด์ ๋ฐ๋ผ ์๋ฃ๋๊ฒ ํ๋ค.
write(2)
(๋๋ ๋น์ทํ ํจ์)๊ฐ ๋ฐํํ๋ ์์ ์ ์ถ๋ ฅ ๋ฐ์ดํฐ๊ฐ, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ํ์ํ ํ์ผ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๊ทธ๊ฒ๊น์ง ๊ธฐ๋ฐ ํ๋์จ์ด๋ก ์ ์ก๋ผ ์๋ค. (์ฆ ๊ฐwrite(2)
๋ค์ fdatasync(2) ํธ์ถ์ ๋ถ์ธ ๊ฒ๊ณผ ๊ฐ๋ค.) ์๋ NOTES๋ฅผ ๋ณด๋ผ. O_EXCL
-
์ด ํธ์ถ์์ ๊ผญ ํ์ผ์ ๋ง๋ค๋๋ก ํ๋ค. ์ด ํ๋๊ทธ๊ฐ
O_CREAT
์ ํจ๊ป ์ง์ ๋ผ ์๋๋ฐpathname
์ด ์ด๋ฏธ ์กด์ฌํ๋ฉดopen()
์ดEEXIST
์ค๋ฅ๋ก ์คํจํ๋ค.๊ทธ ๋ ํ๋๊ทธ๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ์๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ์ง ์๋๋ค.
pathname
์ด ์ฌ๋ณผ๋ฆญ ๋งํฌ์ด๋ฉด ๊ทธ๊ฒ ์ด๋๋ฅผ ๊ฐ๋ฆฌํค๋์ง์ ์๊ด์์ดopen()
์ด ์คํจํ๋ค.์ผ๋ฐ์ ์ผ๋ก
O_CREAT
์์ด ์ฌ์ฉ ์O_EXCL
์ ๋์ ๋ฐฉ์์ ๊ท์ ๋ผ ์์ง ์๋ค. ์ฌ๊ธฐ์ ํ ๊ฐ์ง ์์ธ๊ฐ ์๋๋ฐ, ๋ฆฌ๋ ์ค 2.6 ๋ฐ ์ดํ์์๋pathname
์ด ๋ธ๋ก ์ฅ์น๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐO_EXCL
์O_CREAT
์์ด ์ธ ์ ์๋ค. ๊ทธ ๋ธ๋ก ์ฅ์น๋ฅผ ์์คํ ์์ ์ฌ์ฉ ์ค์ด๋ฉด (๊ฐ๋ น ๋ง์ดํธ ๋ผ ์์ผ๋ฉด)open()
์ดEBUSY
์ค๋ฅ๋ก ์คํจํ๋ค.NFS์ธ ๊ฒฝ์ฐ, ์ปค๋ 2.6 ๋ด์ง ์ดํ์์ NFSv3 ๋ด์ง ์ดํ ๋ฒ์ ์ ์ธ ๋๋ง
O_EXCL
์ ์ง์ํ๋ค. ๋ฝํน ์์ ์ํ์ ์์ด ์ด์ ์์กดํ๋ ํ๋ก๊ทธ๋จ์ด ์๋ค๋ฉดO_EXCL
์ ์ง์ํ์ง ์๋ NFS ํ๊ฒฝ์์ ๊ฒฝ์ ์กฐ๊ฑด์ด ์๊ฒ ๋๋ค. ๋ฝ ํ์ผ์ ์ด์ฉํด ์์์ ํ์ผ ๋ฝํน์ ์ํํ๊ณ ์ถ์๋ฐ NFS์O_EXCL
์ง์์ ์์งํ๋ ๊ฑด ํผํ๊ณ ์ถ์ ์ด์ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์์๋ ๊ฐ์ ํ์ผ ์์คํ ์์ (๊ฐ๋ น ํธ์คํธ๋ช ๊ณผ PID๋ฅผ ํฉ์ณ์) ์ ์ผํ ํ์ผ์ ๋ง๋ค๊ณ link(2)๋ฅผ ์ฌ์ฉํด ๊ทธ ๋ฝ ํ์ผ์ ๋ํ ๋งํฌ๋ฅผ ๋ง๋ค ์ ์๋ค. link(2)๊ฐ 0์ ๋ฐํํ๋ค๋ฉด ๋ฝ์ด ์ฑ๊ณตํ ๊ฒ์ด๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๊ทธ ์ ์ผํ ํ์ผ์ stat(2)์ ํด์ ๋งํฌ ์นด์ดํธ๊ฐ 2๋ก ์ฌ๋ผ๊ฐ๋์ง ํ์ธํ๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ทธ ๊ฒฝ์ฐ ์ญ์ ๋ฝ์ด ์ฑ๊ณตํ ๊ฒ์ด๋ค. O_LARGEFILE
- (LFS)
off_t
๋ก ํฌ๊ธฐ๋ฅผ ํํํ ์ ์๋ (ํ์ง๋งoff64_t
๋ก๋ ํ ์ ์๋) ํ์ผ์ ์ฌ๋ ๊ฒ์ ํ์ฉํ๋ค. ์ด ์ ์๋ฅผ ์ธ ์ ์์ผ๋ ค๋ฉด (์ด๋ค ํค๋ ํ์ผ๋ ํฌํจ์ํค๊ธฐ ์ ์)_LARGEFILE64_SOURCE
๋งคํฌ๋ก๊ฐ ์ ์๋ผ ์์ด์ผ ํ๋ค. ํ์ง๋ง 32๋นํธ ์์คํ ์์ ํฐ ํ์ผ์ ์ ๊ทผํ๋ ๋ฐ๋์งํ ๋ฐฉ๋ฒ์ (O_LARGEFILE
์ ์ฐ๋ ๊ฒ ์๋๋ผ) ๊ธฐ๋ฅ ํ์ธ ๋งคํฌ๋ก_FILE_OFFSET_BITS
๋ฅผ 64๋ก ์ค์ ํ๋ ๊ฒ์ด๋ค. (feature_test_macros(7) ์ฐธ๊ณ .) -
O_NOATIME
(๋ฆฌ๋ ์ค 2.6.8๋ถํฐ) -
ํ์ผ์
read(2)
ํ ๋ ํ์ผ ์ต๊ทผ ์ ๊ทผ ์๊ฐ(์์ด๋ ธ๋์st_atime
)์ ๊ฐฑ์ ํ์ง ์๋๋ค.๋ค์ ์ค ํ ์กฐ๊ฑด์ด๋ผ๋ ์ฐธ์ธ ๊ฒฝ์ฐ์๋ง ์ด ํ๋๊ทธ๋ฅผ ์ธ ์ ์๋ค.
-
ํ๋ก์ธ์ค์ ์คํจ UID๊ฐ ํ์ผ์ ์์ ์ UID์ ์ผ์นํ๋ค.
-
ํธ์ถ ํ๋ก์ธ์ค๊ฐ ์๊ธฐ ์ฌ์ฉ์ ๋ค์์คํ์ด์ค์์
CAP_FOWNER
์ญ๋ฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ทธ ๋ค์์คํ์ด์ค์ ํ์ผ ์์ ์ UID์ ๋งคํ์ด ์๋ค.
์ด ํ๋๊ทธ๋ ์ฌ์ฉ ์ ๋์คํฌ ํ๋๋์ ํฌ๊ฒ ๋จ์ด๋จ๋ฆด ์ ์๋ ์์ธ ํ๋ก๊ทธ๋จ์ด๋ ๋ฐฑ์ ํ๋ก๊ทธ๋จ์์ ์ฐ๊ธฐ ์ํ ๊ฒ์ด๋ค. ๋ชจ๋ ํ์ผ ์์คํ ์์ ์ด ํ๋๊ทธ๊ฐ ํจ๊ณผ๊ฐ ์์ง๋ ์์ ์๋ ์๋ค. ํ ์๋ก ์๋ฒ์์ ์ ๊ทผ ์๊ฐ์ ์ ์งํ๋ NFS๊ฐ ์๋ค.
-
O_NOCTTY
-
pathname
์ด ํฐ๋ฏธ๋ ์ฅ์น(tty(4) ์ฐธ๊ณ )๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ์ ํ๋ก์ธ์ค์ ์ ์ด ํฐ๋ฏธ๋์ด ์๋๋ผ๋ ๊ทธ ์ฅ์น๊ฐ ํ๋ก์ธ์ค์ ์ ์ด ํฐ๋ฏธ๋์ด ๋์ง ์๊ฒ ํ๋ค. O_NOFOLLOW
-
pathname
์ด ์ฌ๋ณผ๋ฆญ ๋งํฌ์ด๋ฉด ์ด๊ธฐ๊ฐELOOP
์ค๋ฅ๋ก ์คํจํ๋ค. ๊ฒฝ๋ก๋ช ์์ชฝ ๋ถ๋ถ์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ ์ฌ์ ํ ๋ฐ๋ผ๊ฐ๋ค. (์ฐธ๊ณ ๋ก ์ด ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์๋ELOOP
์ค๋ฅ๋ ๊ฒฝ๋ก๋ช ์ ๋๋ถ ๊ตฌ์ฑ ํญ๋ชฉ๋ค์ ํด์ํ๋ ๊ณผ์ ์์ ๋๋ฌด ๋ง์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ฐ๊ฒฌํด์ ์ด๊ธฐ๊ฐ ์คํจํ๋ ๊ฒฝ์ฐ์ ๊ตฌ๋ณ์ด ๋ถ๊ฐ๋ฅํ๋ค.)์ด ํ๋๊ทธ๋ FreeBSD ํ์ฅ์ด๋ฉฐ ๋ฆฌ๋ ์ค์๋ ๋ฒ์ 2.1.126์ ์ถ๊ฐ๋์๋ค. ๊ทธ ๋ค POSIX.1-2008์์ ํ์คํ๋์๋ค.
์๋์
O_PATH
๋ ์ฐธ๊ณ . -
O_NONBLOCK
๋๋O_NDELAY
-
๊ฐ๋ฅํ ๊ฒฝ์ฐ ํ์ผ์ ๋ ผ๋ธ๋กํน ๋ชจ๋๋ก ์ฐ๋ค. ๊ทธ
open()
๋์์ด๋ ๋ฐํ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋ํ ์ดํ์ ์ด๋ค I/O ๋์์์๋ ํธ์ถ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐํ์ง ์๊ฒ ๋๋ค.์ฐธ๊ณ ๋ก ์ด ํ๋๊ทธ ์ค์ ์ poll(2), select(2), epoll(7) ๋ฑ์ ๋์์๋ ์๋ฌด ์ํฅ๋ ์ฃผ์ง ์๋๋ค. ๊ทธ ์ธํฐํ์ด์ค๋ค์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ "์ค๋น" ์ํ์ธ์ง๋ฅผ, ์ฆ
O_NONBLOCK
ํ๋๊ทธ๊ฐ ์ค์ ์ ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์ํํ๋ I/O ๋์์ด ๋ธ๋ก ํ ๊ฒ์ธ์ง๋ฅผ ํธ์ถ์์๊ฒ ์๋ ค์ค ๋ฟ์ด๋ค.์ฐธ๊ณ ๋ก ์ ๊ท ํ์ผ๊ณผ ๋ธ๋ก ์ฅ์น์ ๋ํด์ ์ด ํ๋๊ทธ๊ฐ ํจ๊ณผ๊ฐ ์๋ค. ์ฆ
O_NONBLOCK
์ด ์ค์ ๋ผ ์๋์ง์ ๊ด๊ณ์์ด ์ฅ์น ํ๋์ด ํ์ํ ๋๋ I/O ๋์์ด (์ ์) ๋ธ๋ก ํ๊ฒ ๋๋ค. ๊ฒฐ๊ตญ์๋O_NONBLOCK
๋์ ๋ฐฉ์์ด ๊ตฌํ๋ ์๋ ์์ผ๋ฏ๋ก ์์ฉ์์๋ ์ ๊ท ํ์ผ ๋ฐ ๋ธ๋ก ์ฅ์น์ ์ด ํ๋๊ทธ ์ง์ ์ ๋ธ๋กํน ๋์์ ํ์ ํ์ง ์๋ ๊ฒ ์ข๋ค.FIFO(์ด๋ฆ ์๋ ํ์ดํ) ์ฒ๋ฆฌ์ ๋ํด์ fifo(7)๋ฅผ ๋ณด๋ผ. ๊ฐ์ ์ ํ์ผ ๋ฝ ๋ฐ ํ์ผ ๋ฆฌ์ค์ ๊ด๋ จํ
O_NONBLOCK
์ ํจ๊ณผ์ ๋ํ ์ค๋ช ์ fcntl(2)์ ๋ณด๋ผ. -
O_PATH
(๋ฆฌ๋ ์ค 2.6.39๋ถํฐ) -
ํ์ผ ์์คํ ํธ๋ฆฌ ๋ด ์์น๋ฅผ ๋ํ๋ด๋ ๊ฒ๊ณผ ์์ํ๊ฒ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์์ค์์๋ง ์ด๋ค์ง๋ ๋์์ ์ํํ๋ ๋ ์ฉ๋์ ์ธ ์ ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ป๋๋ค. ํ์ผ ์์ฒด๋ฅผ ์ด์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ํ์ผ ๋์๋ค(๊ฐ๋ น
read(2)
,write(2)
, fchmod(2), fchown(2), fgetxattr(2),ioctl(2)
, mmap(2))์EBADF
์ค๋ฅ๋ก ์คํจํ๋ค.๊ฒฐ๊ณผ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋ค์ ๋์์ ์ํํ ์ ์๋ค.
-
fchdir(2), ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ (๋ฆฌ๋ ์ค 3.5๋ถํฐ)
-
fstat(2) (๋ฆฌ๋ ์ค 3.6๋ถํฐ)
-
fstatfs(2) (๋ฆฌ๋ ์ค 3.12๋ถํฐ)
-
ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ณต์ (dup(2), fcntl(2)
F_DUPFD
๋ฑ) -
ํ์ผ ๋์คํฌ๋ฆฝํฐ ํ๋๊ทธ ์ป๊ธฐ ๋ฐ ์ค์ ํ๊ธฐ (fcntl(2)์
F_GETFD
๋ฐF_SETFD
) -
fcntl(2)
F_GETFL
๋์์ผ๋ก ์ด๋ฆฐ ํ์ผ ์ํ ํ๋๊ทธ ์ป๊ธฐ. ๋ฐํ๋๋ ํ๋๊ทธ์O_PATH
๋นํธ๊ฐ ํฌํจ๋ผ ์๊ฒ ๋๋ค. -
ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ
openat()
๋ฐ ๊ธฐํ "*at()" ์์คํ ํธ์ถ์dirfd
์ธ์๋ก ์ ๋ฌํ๊ธฐ. ํ์ผ์ด ๋๋ ํฐ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ์๋AT_EMPTY_PATH
๋ก (๋๋AT_SYMLINK_FOLLOW
๋ก procfs๋ฅผ ํตํด) linkat(2) ํ๋ ๊ฒ๋ ํฌํจ๋๋ค. -
ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ ๋์ค ๋๋ฉ์ธ ์์ผ์ ํตํด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ก ๋ณด๋ด๊ธฐ. (unix(7)์
SCM_RIGHTS
์ฐธ๊ณ )
flags
์O_PATH
๊ฐ ์ง์ ๋ผ ์์ ์O_CLOEXEC
,O_DIRECTORY
,O_NOFOLLOW
์ธ์ ํ๋๊ทธ ๋นํธ๋ค์ ๋ฌด์ํ๋ค.O_PATH
ํ๋๊ทธ๋ก ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ด ๋๋ ๊ฐ์ฒด ์์ฒด์ ๋ํ ์ด๋ค ๊ถํ๋ ํ์์น ์๋ค. (ํ์ง๋ง ๊ฒฝ๋ก ์ ๋๋ถ ๋๋ ํฐ๋ฆฌ๋ค์ ๋ํ ์คํ ๊ถํ์ ํ์ํ๋ค.) ์ดํ์ ๋์์ ๋ฐ๋ผ ์ ์ ํ ํ์ผ ๊ถํ ๊ฒ์ฌ๊ฐ ์ด๋ค์ง ์ ์๋ค. (๊ฐ๋ น fchdir(2)์์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ธ์๊ฐ ๊ฐ๋ฆฌํค๋ ๋๋ ํฐ๋ฆฌ์ ๋ํ ์คํ ๊ถํ์ด ํ์ํ๋ค.) ๋ฐ๋ฉด ํ์ผ ์์คํ ๊ฐ์ฒด๋ฅผO_RDONLY
๋ก ์ด์ด์ ์ฐธ์กฐ๋ฅผ ์ป์ผ๋ ค๋ฉด ๊ทธ ๊ฐ์ฒด์ ๋ํ ์ฝ๊ธฐ ๊ถํ์ด ํธ์ถ์์๊ฒ ์์ด์ผ ํ๋ค. ์ดํ์ ๋์(๊ฐ๋ น fchdir(2), fstat(2))์์ ๊ทธ ๊ฐ์ฒด์ ๋ํ ์ฝ๊ธฐ ๊ถํ์ด ํ์ํ์ง ์๋๋ผ๋ ๊ทธ๋ ๋ค.pathname
์ด ์ฌ๋ณผ๋ฆญ ๋งํฌ์ด๊ณO_NOFOLLOW
ํ๋๊ทธ๊ฐ ํจ๊ป ์ง์ ๋ผ ์๋ ๊ฒฝ์ฐ์๋ ๊ทธ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๋ค. ์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ fchownat(2), fstatat(2), linkat(2), readlinkat(2)์dirfd
์ธ์์ ๋น ๊ฒฝ๋ก๋ช ๊ณผ ํจ๊ป ์ธ ์ ์์ผ๋ฉฐ, ๊ทธ๋ฌ๋ฉด ํธ์ถ์ด ๊ทธ ์ฌ๋ณผ๋ฆญ ๋งํฌ์ ๋ํด์ ๋์ํ๋ค.pathname
์ด automount ์ง์ ์ ๊ฐ๋ฆฌํค๋๋ฐ ์์ง ์๋์ ์ ํด์ ๊ฑฐ๊ธฐ ๋ค๋ฅธ ํ์ผ ์์คํ ์ด ๋ง์ดํธ ๋ผ ์์ง ์์ ๊ฒฝ์ฐ์๋ ๋ง์ดํธ๋ฅผ ์๋์ํค์ง ์์ผ๋ฉด์ ๊ทธ automount ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ฌ๋ฉด fstatfs(2)๋ฅผ ์ฌ์ฉํด ๊ทธ๊ฒ ์ค์ ๋ก ์๋ ์ ํ automount ์ง์ ์ธ์ง (.f_type == AUTOFS_SUPER_MAGIC
) ์์๋ผ ์ ์๋ค.์ ๊ท ํ์ผ์ ์์ด
O_PATH
์ ์ฉ๋ ํ ๊ฐ์ง๋ POSIX.1์O_EXEC
์ ๋๋ฑํ ๊ธฐ๋ฅ์ฑ์ ์ ๊ณตํ๋ ๊ฒ์ด๋ค. ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ํตํด ์คํ ๊ถํ์ ์์ง๋ง ์ฝ๊ธฐ ๊ถํ์ ์๋ ํ์ผ์ ์ด์ด์ ๊ทธ ํ์ผ์ ์คํํ ์ ์๋ค.char buf[PATH_MAX]; fd = open("some_prog", O_PATH); snprintf(buf, PATH_MAX, "/proc/self/fd/%d", fd); execl(buf, "some_prog", (char *) NULL);
O_PATH
ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ fexecve(3) ์ธ์๋ก ์ค ์๋ ์๋ค. O_SYNC
-
ํ์ผ์์์ ์ฐ๊ธฐ ๋์์ด (
O_DSYNC
์์ ์ ๊ณตํ๋ ๋๊ธฐ I/O ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์๋ฃ๊ฐ ์๋๋ผ) ๋๊ธฐ I/O ํ์ผ ๋ฌด๊ฒฐ์ฑ ์๋ฃ ์๊ฑด์ ๋ฐ๋ผ ์๋ฃ๋๊ฒ ํ๋ค.write(2)
(๋๋ ๋น์ทํ ํจ์)๊ฐ ๋ฐํํ๋ ์์ ์ ์ถ๋ ฅ ๋ฐ์ดํฐ์ ๊ด๋ จ ํ์ผ ๋ฉํ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ฐ ํ๋์จ์ด๋ก ์ ์ก๋ผ ์๋ค. (์ฆ ๊ฐwrite(2)
๋ค์ fsync(2) ํธ์ถ์ ๋ถ์ธ ๊ฒ๊ณผ ๊ฐ๋ค.) ์๋ NOTES๋ฅผ ๋ณด๋ผ. -
O_TMPFILE
(๋ฆฌ๋ ์ค 3.11๋ถํฐ) -
์ด๋ฆ ์๋ ์์ ์ ๊ท ํ์ผ์ ๋ง๋ ๋ค.
pathname
์ธ์๊ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํ๋ฉฐ ๊ทธ ๋๋ ํฐ๋ฆฌ์ ํ์ผ ์์คํ ๋ด์ ์ด๋ฆ ์๋ ์์ด๋ ธ๋๊ฐ ์๊ธฐ๊ฒ ๋๋ค. ๊ทธ๋ ๊ฒ ์๊ธด ํ์ผ์ ์จ๋ฃ์ ๋ด์ฉ์ ๊ทธ ํ์ผ์ ์ด๋ฆ์ ์ฃผ์ง ์๋ ํ ๋ง์ง๋ง ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ซํ ๋ ์ฌ๋ผ์ง๊ฒ ๋๋ค.O_TMPFILE
์O_RDWR
๋O_WRONLY
์ ํจ๊ป ์ง์ ํด์ผ ํ๋ฉฐ, ์ ํ์ ์ผ๋กO_EXCL
๊ณผ ํจ๊ป ์ง์ ํ ์ ์๋ค.O_EXCL
์ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ์๋ ๋ค์ ์ฝ๋์ฒ๋ผ linkat(2)์ผ๋ก ๊ทธ ์์ ํ์ผ์ ํ์ผ ์์คํ ๋ด๋ก ๋งํฌ ํด์ ์์ ํ์ผ๋ก ๋ง๋ค ์ ์๋ค.char path[PATH_MAX]; fd = open("/path/to/dir", O_TMPFILE | O_RDWR, S_ISUSR | S_IWUSR); /* 'fd'์์ ํ์ผ I/O... */ snprintf(path, PATH_MAX, "/proc/self/fd/%d", fd); linkat(AT_FDCWD, path, AT_FDCWD, "/path/for/file", AT_SYMLINK_FOLLOW);
์ด ๊ฒฝ์ฐ
open()
์mode
์ธ์๊ฐO_CREAT
์์์ฒ๋ผ ํ์ผ ๊ถํ ๋ชจ๋๋ฅผ ๊ฒฐ์ ํ๋ค.O_TMPFILE
๊ณผO_EXCL
์ ํจ๊ป ์ง์ ํ๋ฉด ์ ๋ฐฉ์์ผ๋ก ์์ ํ์ผ์ ํ์ผ ์์คํ ๋ด๋ก ๋งํฌ ํ์ง ๋ชปํ๊ฒ ํ๋ค. (์ฐธ๊ณ ๋ก ์ด ๊ฒฝ์ฐ์์O_EXCL
์ ์๋ฏธ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ์์O_EXCL
์ ์๋ฏธ์ ๋ค๋ฅด๋ค.)O_TMPFILE
์ ์ฃผ๋ ์ฉ๋๊ฐ ๋ ๊ฐ์ง๊ฐ ์๋ค.-
ํฅ์๋ tmpfile(3) ๊ธฐ๋ฅ์ฑ: (1) ๋ซํ ๋ ์๋์ผ๋ก ์ญ์ ๋๊ณ (2) ์ด๋ค ๊ฒฝ๋ก๋ช ์ ํตํด์๋ ์ ๋ ๋๋ฌํ ์ ์์ผ๋ฉฐ (3) ์ฌ๋ณผ๋ฆญ ๋งํฌ ๊ณต๊ฒฉ ๋์์ด ์๋๋ฉฐ (4) ํธ์ถ์๊ฐ ์ ์ผํ ์ด๋ฆ์ ๋ง๋ค์ด ๋ผ ํ์๊ฐ ์๋ ์์ ํ์ผ์ ๊ฒฝ์ ์๋ ๋ฐฉ์์ผ๋ก ์์ฑํ๋ค.
-
์ฒ์์๋ ์ ๋ณด์ด๋ ํ์ผ์ ๋ง๋ค๊ณ ์ ๋ฐ์ดํฐ๋ฅผ ์ฑ์ฐ๊ณ ์ ์ ํ ํ์ผ ์์คํ ์์ฑ์ ๊ฐ๋๋ก ์กฐ์ (fchown(2), fchmod(2), fsetxattr(2) ๋ฑ)ํ ๋ค์์ (์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ linkat(2)์ ์จ์) ์์ ํ ์ํ๋ก ํ์ผ ์์คํ ๋ด๋ก ์์์ ์ผ๋ก ๋งํฌ ํ๊ธฐ.
O_TMPFILE
์๋ ๊ธฐ๋ฐ ํ์ผ ์์คํ ์ ์ง์์ด ํ์ํ๋ค. ๋ฆฌ๋ ์ค ํ์ผ ์์คํ ๋ค ์ค ์ผ๋ถ๋ง ์ง์์ ์ ๊ณตํ๋ค. ์ต์ด ๊ตฌํ์์๋ ext2, ext3, ext4, UDF, Minix, shmem ํ์ผ ์์คํ ์์ ์ง์์ ์ ๊ณตํ๋ค. ์ด์ด์ XFS (๋ฆฌ๋ ์ค 3.15), Btrfs (๋ฆฌ๋ ์ค 3.16), F2FS (๋ฆฌ๋ ์ค 3.16), ubifs (๋ฆฌ๋ ์ค 4.9) ํ์ผ ์์คํ ์ง์์ด ์ถ๊ฐ๋์๋ค. -
O_TRUNC
- ํ์ผ์ด ์ด๋ฏธ ์กด์ฌํ๊ณ ์ ๊ท ํ์ผ์ด๋ฉฐ ์ ๊ทผ ๋ชจ๋์์ ์ฐ๊ธฐ๋ฅผ ํ์ฉ(์ฆ
O_RDWR
๋O_WRONLY
)ํ๋ฉด ํ์ผ์ ๊ธธ์ด 0์ผ๋ก ์๋ผ๋ธ๋ค. ํ์ผ์ด FIFO๋ ํฐ๋ฏธ๋ ์ฅ์น ํ์ผ์ด๋ฉดO_TRUNC
ํ๋๊ทธ๋ฅผ ๋ฌด์ํ๋ค. ๊ทธ ์ธ ๊ฒฝ์ฐ์O_TRUNC
์ ํจ๊ณผ๋ ๋ช ์ธ๋ผ ์์ง ์๋ค.
creat()
ํธ์ถ์ flags
๋ฅผ O_CREAT|O_WRONLY|O_TRUNC
๋ก ํด์ open()
์ ํธ์ถํ๋ ๊ฒ๊ณผ ๋๋ฑํ๋ค.
openat()
์์คํ
ํธ์ถ์ ์ฌ๊ธฐ ์ค๋ช
ํ๋ ์ฐจ์ด์ ์ ๋นผ๋ฉด open()
๊ณผ ๋๊ฐ์ด ๋์ํ๋ค.
pathname
์ ์ค ๊ฒฝ๋ก๋ช
์ด ์๋ ๊ฒฝ๋ก์ด๋ฉด (์๋ ๊ฒฝ๋ก๋ช
์ ๋ํด open()
์์ ํ๋ฏ ํธ์ถ ํ๋ก์ธ์ค์ ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ๊ฒ ์๋๋ผ) ํ์ผ ๋์คํฌ๋ฆฝํฐ dirfd
๊ฐ ๊ฐ๋ฆฌํค๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ช
์ ํด์ํ๋ค.
pathname
์ด ์๋ ๊ฒฝ๋ก์ด๊ณ dirfd
๊ฐ ํน์ ๊ฐ AT_FDCWD
์ด๋ฉด (open()
์ฒ๋ผ) ํธ์ถ ํ๋ก์ธ์ค์ ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก pathname
์ ํด์ํ๋ค.
pathname
์ด ์ ๋ ๊ฒฝ๋ก์ด๋ฉด dirfd
๋ฅผ ๋ฌด์ํ๋ค.
open()
, openat()
, creat()
์ ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด -1์ ๋ฐํํ๋ค. (๊ทธ ๊ฒฝ์ฐ errno
๋ฅผ ์ ์ ํ ์ค์ ํ๋ค.)
open()
, openat()
, creat()
์ด ๋ค์ ์ค๋ฅ๋ก ์คํจํ ์ ์๋ค.
EACCES
- ํ์ผ์ ์์ฒญํ ์ ๊ทผ ๋ฐฉ์์ด ํ์ฉ๋์ง ์๊ฑฐ๋,
pathname
๊ฒฝ๋ก ์ ๋๋ถ์ ํ ๋๋ ํฐ๋ฆฌ์ ๋ํด ํ์ ๊ถํ์ด ๊ฑฐ๋ถ๋์๊ฑฐ๋, ํ์ผ์ด ์์ง ์กด์ฌํ์ง ์๊ณ ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ ๋ํ ์ฐ๊ธฐ ์ ๊ทผ์ด ํ์ฉ๋์ง ์๋๋ค. (path_resolution(7)๋ ์ฐธ๊ณ .) EDQUOT
-
O_CREAT
๋ฅผ ์ง์ ํ ๊ฒฝ์ฐ์์ ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉฐ ๊ทธ ํ์ผ ์์คํ ์์์ ์ฌ์ฉ์์ ๋์คํฌ ๋ธ๋ก ๋ด์ง ์์ด๋ ธ๋ ์ฟผํฐ๊ฐ ๊ณ ๊ฐ๋์๋ค. EEXIST
-
pathname
์ด ์ด๋ฏธ ์กด์ฌํ๋๋ฐO_CREAT
์O_EXCL
์ ์ผ๋ค. EFAULT
-
pathname
์ด ์ ๊ทผ ๊ฐ๋ฅํ ์ฃผ์ ๊ณต๊ฐ ๋ฐ์ ๊ฐ๋ฆฌํจ๋ค. EFBIG
-
EOVERFLOW
๋ฅผ ๋ณด๋ผ. EINTR
- ๋๋ฆฐ ์ฅ์น(๊ฐ๋ น FIFO. fifo(7) ์ฐธ๊ณ ) ์ด๊ธฐ๊ฐ ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ๋ธ๋ก๋ผ ์๋ ๋์ ํธ์ถ์ด ์๊ทธ๋ ์ธํฐ๋ฝํธ์ ์ํด ์ค๋จ๋์๋ค. signal(7) ์ฐธ๊ณ .
EINVAL
- ํ์ผ ์์คํ
์์
O_DIRECT
ํ๋๊ทธ๋ฅผ ์ง์ํ์ง ์๋๋ค. ์ถ๊ฐ ์ ๋ณด๋ NOTES ์ฐธ๊ณ . EINVAL
-
flags
์ ์ ํจํ์ง ์์ ๊ฐ. EINVAL
-
flags
์O_TMPFILE
์ ์ง์ ํ๋๋ฐO_WRONLY
๋O_RDWR
์ด๋ ๊ฒ๋ ์ง์ ํ์ง ์์๋ค. EINVAL
-
flags
์O_CREAT
์ ์ง์ ํ๋๋ฐ ์ ํ์ผpathname
์ ๋ง์ง๋ง ๋ถ๋ถ("basename")์ด ์ ํจํ์ง ์๋ค. (๊ฐ๋ น ๊ธฐ๋ฐ ํ์ผ ์์คํ ์์ ํ์ฉํ์ง ์๋ ๋ฌธ์๋ฅผ ๋ด๊ณ ์๋ค.) EISDIR
-
pathname
์ด ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋๋ฐ ์์ฒญํ ์ ๊ทผ ๋ฐฉ์์ ์ฐ๊ธฐ๊ฐ ์๋ฐ๋๋ค. (์ฆO_WRONLY
๋O_RDWR
๋ฅผ ์ค์ ํ๋ค.) EISDIR
-
pathname
์ด ๊ธฐ์กด ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐflags
์O_TMPFILE
์O_WRONLY
๋O_RDWR
์ ํจ๊ป ์ง์ ํ๋๋ฐ ์ด ์ปค๋ ๋ฒ์ ์์O_TMPFILE
๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๋๋ค. ELOOP
-
pathname
์ ํด์ํ๋ ๋์ ๋๋ฌด ๋ง์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ง๋ฌ๋ค. ELOOP
-
pathname
์ด ์ฌ๋ณผ๋ฆญ ๋งํฌ์ธ๋ฐflags
์O_NOFOLLOW
๋ฅผ ์ง์ ํ๊ณO_PATH
๋ ์ง์ ํ์ง ์์๋ค. EMFILE
- ์ด๋ฆฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๊ฐ์์ ๋ํ ํ๋ก์ธ์ค๋ณ ์ ํ์ ๋๋ฌํ๋ค. (getrlimit(2)์
RLIMIT_NOFILE
์ค๋ช ์ฐธ๊ณ .) ENAMETOOLONG
-
pathname
์ด ๋๋ฌด ๊ธธ๋ค. ENFILE
- ์ด๋ฆฐ ํ์ผ ์ด๊ฐ์์ ๋ํ ์์คํ ์ ์ญ ์ ํ์ ๋๋ฌํ๋ค.
ENODEV
-
pathname
์ด ์ฅ์น ํน์ ํ์ผ์ ๊ฐ๋ฆฌํค๋๋ฐ ๋์ํ๋ ์ฅ์น๊ฐ ์กด์ฌํ์ง ์๋๋ค. (์ด๋ ๋ฆฌ๋ ์ค ์ปค๋ ๋ฒ๊ทธ์ด๋ค. ์ด ๊ฒฝ์ฐ์ENXIO
๋ฅผ ๋ฐํํด์ผ ํ๋ค.) ENOENT
-
O_CREAT
์ ์ค์ ํ์ง ์์๊ณ ์ง๋ช ํ ํ์ผ์ด ์กด์ฌํ์ง ์๋๋ค. ENOENT
-
pathname
์ ์ด๋ ๋๋ ํฐ๋ฆฌ ์์๊ฐ ์กด์ฌํ์ง ์๊ฑฐ๋ ๊นจ์ง ์ฌ๋ณผ๋ฆญ ๋งํฌ์ด๋ค. ENOENT
-
pathname
์ด ์กด์ฌํ์ง ์๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ,flags
์O_TMPFILE
์O_WRONLY
๋O_RDWR
์ ํจ๊ป ์ง์ ํ๋๋ฐ ์ด ์ปค๋ ๋ฒ์ ์์O_TMPFILE
๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๋๋ค. ENOMEM
- ์ง๋ช ํ ํ์ผ์ด FIFO์ธ๋ฐ ํ์ดํ์ฉ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋ํ ์ฌ์ฉ์๋ณ ๊ฒฝ์ฑ ์ ํ์ ๋๋ฌํ๊ณ ํธ์ถ์์๊ฒ ํน๊ถ์ด ์์ด์ FIFO ๋ฒํผ๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์๋ค. pipe(7) ์ฐธ๊ณ .
ENOMEM
- ์ฌ์ฉ ๊ฐ๋ฅํ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ์ง ์๋ค.
ENOSPC
-
pathname
์ ์์ฑํด์ผ ํ๋๋ฐpathname
์ ๋ด์ ์ฅ์น์ ์ ํ์ผ์ ์ํ ๊ณต๊ฐ์ด ์๋ค. ENOTDIR
-
pathname
์์ ๋๋ ํฐ๋ฆฌ๋ก ์ฐ์ธ ์์๊ฐ ์ค์ ๋ก๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์๋๊ฑฐ๋,O_DIRECTORY
๋ฅผ ์ง์ ํ๋๋ฐpathname
์ด ๋๋ ํฐ๋ฆฌ๊ฐ ์๋๋ค. ENXIO
-
O_NONBLOCK | O_WRONLY
๋ฅผ ์ค์ ํ๊ณ ์ง๋ช ํ ํ์ผ์ด FIFO์ธ๋ฐ ๊ทธ FIFO๋ฅผ ์ฝ๊ธฐ์ฉ์ผ๋ก ์ด๊ณ ์๋ ํ๋ก์ธ์ค๊ฐ ์๋ค. ENXIO
- ํ์ผ์ด ์ฅ์น ํน์ ํ์ผ์ธ๋ฐ ๋์ํ๋ ์ฅ์น๊ฐ ์กด์ฌํ์ง ์๋๋ค.
ENXIO
- ํ์ผ์ด ์ ๋์ค ๋๋ฉ์ธ ์์ผ์ด๋ค.
EOPNOTSUPP
-
pathname
์ ๋ด๊ณ ์๋ ํ์ผ ์์คํ ์์O_TMPFILE
์ ์ง์ํ์ง ์๋๋ค. EOVERFLOW
-
pathname
์ด ์ด๊ธฐ์ ๋๋ฌด ํฐ ์ ๊ท ํ์ผ์ ๊ฐ๋ฆฌํค๊ณ ์๋ค. ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ 32๋นํธ ํ๋ซํผ์์-D_FILE_OFFSET_BITS=64
์์ด ์ปดํ์ผ ํ ์์ฉ์ด ํฌ๊ธฐ๊ฐ(1<<31)-1
๋ฐ์ดํธ๋ฅผ ๋๋ ํ์ผ์ ์ด๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ์ด๋ค. ์์O_LARGEFILE
๋ ๋ณด๋ผ. POSIX.1์ ๋ช ์ธ๋ ์ค๋ฅ์ธ๋ฐ, ๋ฆฌ๋ ์ค ์ปค๋ 2.6.24 ์ ์์ ์ด ๊ฒฝ์ฐ์EFBIG
์ค๋ฅ๋ฅผ ๋ด๋์๋ค. EPERM
-
O_NOATIME
ํ๋๊ทธ๋ฅผ ์ง์ ํ์ง๋ง ํธ์ถ์์ ์คํจ ์ฌ์ฉ์ ID๊ฐ ํ์ผ์ ์์ ์์ ์ผ์นํ์ง ์์ผ๋ฉฐ ํธ์ถ์์๊ฒ ํน๊ถ์ด ์๋ค. EPERM
- ํ์ผ ๋ด์ธ ๋๋ฌธ์ ๋์์ด ๋งํ๋ค. fcntl(2) ์ฐธ๊ณ .
EROFS
-
pathname
์ด ์ฝ๊ธฐ ์ ์ฉ ํ์ผ ์์คํ ์์ ํ์ผ์ ๊ฐ๋ฆฌํค๋๋ฐ ์ฐ๊ธฐ ์ ๊ทผ์ ์์ฒญํ๋ค. ETXTBSY
-
pathname
์ด ํ์ฌ ์คํ ์ค์ธ ์คํ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๋ฆฌํค๋๋ฐ ์ฐ๊ธฐ ์ ๊ทผ์ ์์ฒญํ๋ค. ETXTBSY
-
pathname
์ด ํ์ฌ ์ค์ ํ์ผ๋ก ์ฌ์ฉ ์ค์ธ ํ์ผ์ ๊ฐ๋ฆฌํค๋๋ฐO_TRUNC
ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ค. ETXTBSY
-
pathname
์ด ํ์ฌ ์ปค๋์์ (๊ฐ๋ น ๋ชจ๋/ํ์จ์ด ์ ์ฌ๋ฅผ ์ํด) ์ฝ๋ ์ค์ธ ํ์ผ์ ๊ฐ๋ฆฌํค๋๋ฐ ์ฐ๊ธฐ ์ ๊ทผ์ ์์ฒญํ๋ค. EWOULDBLOCK
-
O_NONBLOCK
ํ๋๊ทธ๋ฅผ ์ง์ ํ๋๋ฐ ํ์ผ์ ํธํ ๋ถ๊ฐ๋ฅํ ๋ฆฌ์ค๊ฐ ์กํ ์๋ค. (fcntl(2) ์ฐธ๊ณ .)
openat()
์์ ์ถ๊ฐ๋ก ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
EBADF
-
dirfd
๊ฐ ์ ํจํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์๋๋ค. ENOTDIR
-
pathname
์ด ์๋ ๊ฒฝ๋ก๋ช ์ด๊ณdirfd
๊ฐ ๋๋ ํฐ๋ฆฌ ์๋ ํ์ผ์ ๊ฐ๋ฆฌํค๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ด๋ค.
๋ฆฌ๋
์ค ์ปค๋ 2.6.16์์ openat()
์ด ์ถ๊ฐ๋์๋ค. glibc ๋ฒ์ 2.4์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์์ด ์ถ๊ฐ๋์๋ค.
open()
, creat()
: SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.
openat()
: POSIX.1-2008.
O_DIRECT
, O_NOATIME
, O_PATH
, O_TMPFILE
ํ๋๊ทธ๋ ๋ฆฌ๋
์ค ์ ์ฉ์ด๋ค. ๊ทธ ์ ์๋ฅผ ์ด์ฉํ ์ ์์ผ๋ ค๋ฉด _GNU_SOURCE
๋ฅผ ์ ์ํด์ผ ํ๋ค.
O_CLOEXEC
, O_DIRECTORY
, O_NOFOLLOW
ํ๋๊ทธ๋ POSIX.1-2001์๋ ๋ช
์ธ๋ผ ์์ง ์๊ณ POSIX-1.2008์๋ ๋ช
์ธ๋ผ ์๋ค. glibc 2.12๋ถํฐ 200809L๊ณผ ๊ฐ๊ฑฐ๋ ๊ทธ๋ณด๋ค ํฐ ๊ฐ์ผ๋ก _POSIX_C_SOURCE
๋ฅผ ์ ์ํ๊ฑฐ๋ 700๊ณผ ๊ฐ๊ฑฐ๋ ๊ทธ๋ณด๋ค ํฐ ๊ฐ์ผ๋ก _XOPEN_SOURCE
๋ฅผ ์ ์ํ๋ฉด ๊ทธ ์ ์๋ค์ ์ด์ฉํ ์ ์๋ค.
feature_test_macros(7)์์ ์ง์ ํ๋ฏ _POSIX_C_SOURCE
, _XOPEN_SOURCE
, _GNU_SOURCE
๊ฐ์ ๊ธฐ๋ฅ ํ์ธ ๋งคํฌ๋ก๋ ์ด๋ค ํค๋ ํ์ผ๋ ํฌํจ์ํค๊ธฐ ์ ์ ์ ์๋ผ ์์ด์ผ ํ๋ค.
๋ฆฌ๋
์ค์์๋ ํ์ผ์ ์ด๊ณ ์ถ์ง๋ง ๊ผญ ์ฝ๊ธฐ๋ ์ฐ๊ธฐ๋ฅผ ํ๋ ค๋ ๊ฑด ์๋ ๊ฒฝ์ฐ์ O_NONBLOCK
ํ๋๊ทธ๋ฅผ ์ธ ๋๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด ์ฅ์น๋ฅผ ์ด์ด์ ioctl(2)
์ ์ธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ป๋ ๋ฐ ์ธ ์ ์๋ค.
O_RDONLY | O_TRUNC
์ (๊ท์ ๋ผ ์์ง ์์) ํจ๊ณผ๋ ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. ๋ง์ ์์คํ
์์๋ ํ์ผ์ด ์ค์ ์๋ฆฐ๋ค.
์ฐธ๊ณ ๋ก open()
์ผ๋ก ์ฅ์น ํน์ ํ์ผ์ ์ด ์๋ ์์ง๋ง creat()
์ผ๋ก ๋ง๋ค ์๋ ์๋ค. mknod(2)๋ฅผ ์จ์ผ ํ๋ค.
ํ์ผ์ด ์๋ก ์์ฑ๋๋ ๊ฒฝ์ฐ ๊ทธ st_atime
, st_ctime
, st_mtime
ํ๋(๊ฐ๊ธฐ ์ต๊ทผ ์ ๊ทผ ์๊ฐ, ์ต๊ทผ ์ํ ๋ณ๊ฒฝ, ์ต๊ทผ ์์ ์๊ฐ. stat(2) ์ฐธ๊ณ )๊ฐ ํ์ฌ ์๊ฐ์ผ๋ก ์ค์ ๋๊ณ ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ st_ctime
๋ฐ st_mtime
ํ๋๋ ๊ทธ๋ ๊ฒ ์ค์ ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์ O_TRUNC
ํ๋๊ทธ ๋๋ฌธ์ ํ์ผ์ด ์์ ๋๋ฉด ๊ทธ st_ctime
๋ฐ st_mtime
ํ๋๊ฐ ํ์ฌ ์๊ฐ์ผ๋ก ์ค์ ๋๋ค.
/proc/[pid]/fd
๋๋ ํฐ๋ฆฌ์ ํ์ผ๋ค์ PID๊ฐ pid
์ธ ํ๋ก์ธ์ค์ ์ด๋ฆฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ๋ณด์ฌ ์ค๋ค. /proc/[pid]/fdinfo
๋๋ ํฐ๋ฆฌ์ ํ์ผ๋ค์ ๊ทธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ๋ํด ์ถ๊ฐ ์ ๋ณด๋ฅผ ๋ณด์ฌ ์ค๋ค. ๋ ๋๋ ํฐ๋ฆฌ์ ๋ํ ๋ ์์ธํ ๋ด์ฉ์ proc(5)์ ๋ณด๋ผ.
๋ฆฌ๋
์ค ํค๋ ํ์ผ <asm/fcntl.h>
์๋ O_ASYNC
๊ฐ ์ ์๋ผ ์์ง ์๋ค. ๋์ (BSD์์ ์ ๋ํ) ๊ฐ์ ์๋ฏธ์ FASYNC
๊ฐ ์ ์๋ผ ์๋ค.
์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ(open file description)์ POSIX์์ ์์คํ
์ ์ญ ์ด๋ฆฐ ํ์ผ ํ
์ด๋ธ์ ํญ๋ชฉ๋ค์ ๋ํ๋ด๋ ๋ฐ ์ฐ๋ ์ฉ์ด๋ค. ๋ค๋ฅธ ๋งฅ๋ฝ์์๋ ์ด ๊ฐ์ฒด๋ฅผ "์ด๋ฆฐ ํ์ผ ๊ฐ์ฒด", "ํ์ผ ํธ๋ค", "์ด๋ฆฐ ํ์ผ ํ
์ด๋ธ ํญ๋ชฉ", (์ปค๋ ๊ฐ๋ฐ์ ์ฉ์ด๋ก) struct file
๋ฑ์ผ๋ก ๋ค์ํ๊ฒ ๋ถ๋ฅธ๋ค.
ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ (dup(2) ๋ฑ์ผ๋ก) ๋ณต์ ํ ๋ ์ฌ๋ณธ์ ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๊ฐ์ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋ฉฐ, ๋ฐ๋ผ์ ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ํ์ผ ์คํ์
๊ณผ ํ์ผ ์ํ ํ๋๊ทธ๋ฅผ ๊ณต์ ํ๋ค. ๊ทธ๋ฐ ๊ณต์ ๊ฐ ํ๋ก์ธ์ค ์ฌ์ด์์๋ ์ด๋ค์ง ์ ์๋ค. [[fork(2)]]๋ฅผ ํตํด ์์ฑ๋ ์์ ํ๋ก์ธ์ค๋ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค์ ์ฌ๋ณธ์ ๋ฌผ๋ ค๋ฐ์ผ๋ฉฐ ๊ทธ ์ฌ๋ณธ์ ๊ฐ์ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ๊ฐ๋ฆฌํจ๋ค.
๊ฐ ํ์ผ open()
๋ง๋ค ์ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ๋ง๋ ๋ค. ์ฆ ํ ํ์ผ ๋
ธ๋์ ๋์ํ๋ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ด ์ฌ๋ฟ ์์ ์ ์๋ค.
๋ฆฌ๋
์ค์์ kcmp(2) KCMP_FILE
๋์์ ์ฌ์ฉํด (๋์ผ ํ๋ก์ธ์ค์ ๋๋ ๋ค๋ฅธ ๋ ํ๋ก์ธ์ค์) ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๊ฐ์ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ์ ๊ฐ๋ฆฌํค๋์ง ํ์ธํ ์ ์๋ค.
POSIX.1-2008 "synchronized I/O" ์ต์
์์๋ ๋ค์ํ ๋๊ธฐ I/O ํํ๋ฅผ ๋ช
์ธํ๊ณ ๋์ ๋ฐฉ์์ ์ ์ดํ๊ธฐ ์ํ open()
ํ๋๊ทธ O_SYNC
, O_DSYNC
, O_RSYNC
๋ฅผ ๋ช
์ธํ๋ค. ๊ตฌํ์์ ์ต์
์ ์ง์ํ๋์ง ์ฌ๋ถ์ ์๊ด์์ด ์ ์ด๋ ์ ๊ท ํ์ผ์ ๋ํ O_SYNC
์ฌ์ฉ์ ์ง์ํด์ผ ํ๋ค.
๋ฆฌ๋
์ค์์๋ O_SYNC
์ O_DSYNC
๋ฅผ ๊ตฌํํ๊ณ O_RSYNC
๋ ๊ตฌํํ์ง ์๊ณ ์๋ค. glibc์์๋ O_RSYNC
๋ฅผ O_SYNC
์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋๋ก ์ ์ํ๋๋ฐ, ์ด๋ ๋ค์ ๋ถ์ ํํ๋ค. (HP PA-RISC์์ ๋ฆฌ๋
์ค ํค๋ ํ์ผ <asm/fcntl.h>
์ O_RSYNC
๊ฐ ์ ์๋ผ ์์ง๋ง ์ฐ์ด์ง๋ ์๋๋ค.)
O_SYNC
๋ ๋๊ธฐ I/O ํ์ผ ๋ฌด๊ฒฐ์ฑ ์๋ฃ๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ฐ๊ธฐ ๋์์์ ๋ฐ์ดํฐ์ ๊ด๋ จ ๋ฉํ๋ฐ์ดํฐ ๋ชจ๋๋ฅผ ๊ธฐ๋ฐ ํ๋์จ์ด๋ก ํ๋ฌ์ ํ๋ค๋ ๋ป์ด๋ค. O_DSYNC
๋ ๋๊ธฐ I/O ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์๋ฃ๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ฐ๊ธฐ ๋์์์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ ํ๋์จ์ด๋ก ํ๋ฌ์ ํ๋ ๋ฉํ๋ฐ์ดํฐ ๊ฐฑ์ ์ฌํญ์ ์ดํ ์ฝ๊ธฐ ๋์์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ ๋ฐ ํ์ํ ๊ฒ๋ง ํ๋ฌ์ ํ๋ค๋ ๋ป์ด๋ค. ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์๋ฃ ๋ฐฉ์์ ํ์ผ ๋ฌด๊ฒฐ์ฑ ์๋ฃ ๋ฐฉ์์ ๋ณด์ฅ ์์ค๊น์ง๋ ํ์์น ์์ ์์ฉ์์ ๋์คํฌ ๋์ ํ์๋ฅผ ์ค์ฌ ์ค ์ ์๋ค.
๋ ์๋ฃ ๋ฐฉ์์ ์ฐจ์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด ๋ ๊ฐ์ง ํ์ผ ๋ฉํ๋ฐ์ดํฐ ์กฐ๊ฐ, ์ฆ ์ต๊ทผ ์์ ํ์์คํฌํ(st_mtime
)์ ํ์ผ ๊ธธ์ด๋ฅผ ์๊ฐํด ๋ณด์. ์ต๊ทผ ํ์ผ ์์ ํ์์คํฌํ๋ ๋ชจ๋ ์ฐ๊ธฐ ๋์์์ ๊ฐฑ์ ํ์ง๋ง ํ์ผ ๊ธธ์ด๋ ํ์ผ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ์ฐ๊ธฐ์์๋ง ๋ฐ๊พธ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ต๊ทผ ์์ ํ์์คํฌํ๋ ์ฝ๊ธฐ์ ์ฑ๊ณต์ ์๋ฃ๋ฅผ ๋ณด์ฅํ๋ ๋ฐ ํ์ํ์ง ์์ง๋ง ํ์ผ ๊ธธ์ด๋ ํ์ํ๋ค. ๋ฐ๋ผ์ O_DSYNC
์์๋ ํ์ผ ๊ธธ์ด ๋ฉํ๋ฐ์ดํฐ ๊ฐฑ์ ์ ํ๋ฌ์ ํ๋ ๊ฒ๋ง ๋ณด์ฅํ๋ค. (๋ฐ๋ฉด O_SYNC
์์๋ ์ต๊ทผ ์์ ํ์์คํฌํ ๋ฉํ๋ฐ์ดํฐ๋ ํญ์ ํ๋ฌ์ ํ๊ฒ ๋๋ค.)
๋ฆฌ๋
์ค 2.6.33 ์ ์์ ๋ฆฌ๋
์ค๋ open()
์ O_SYNC
ํ๋๊ทธ๋ง ๊ตฌํํ๊ณ ์์๋ค. ํ์ง๋ง ๊ทธ ํ๋๊ทธ ์ง์ ์ ๋๋ค์ ํ์ผ ์์คํ
์์ ์ค์ ๋ก๋ ๋๊ธฐ I/O ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์๋ฃ์ ํด๋นํ๋ ๋์์ ์ ๊ณตํ๋ค. (์ฆ O_SYNC
๊ฐ ์ค์ ๋ก๋ O_DSYNC
์ ํด๋นํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์๋ค.)
๋ฆฌ๋
์ค 2.6.33๋ถํฐ ์ ๋๋ก ๋ O_SYNC
์ง์์ ์ ๊ณตํ๋ค. ํ์ง๋ง ํ์ ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด O_DSYNC
๋ ์ด์ O_SYNC
์ ๊ฐ์ ๊ฐ์ผ๋ก ์ ์ํ๊ณ O_SYNC
๋ ์๋ก์ด (๋ ๋นํธ์ง๋ฆฌ) ํ๋๊ทธ ๊ฐ์ผ๋ก ์ ์ํด์ O_DSYNC
ํ๋๊ทธ ๊ฐ์ ํฌํจํ๊ฒ ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ํค๋๋ก ์ปดํ์ผ ํ ์์ฉ๋ค์ด 2.6.33 ์ ์ปค๋์์ ์ ์ด๋ O_DSYNC
๋์์ ์ป๊ฒ ๋๋ค.
๋ฒ์ 2.26๋ถํฐ glibc์ open()
๋ํผ ํจ์๊ฐ ์ปค๋์ open()
์์คํ
ํธ์ถ ๋์ openat()
์์คํ
ํธ์ถ์ ์ด์ฉํ๋ค. ์ด๋ค ์ํคํ
์ฒ์์๋ glibc ๋ฒ์ 2.26 ์ ์์๋ ๊ทธ๋ ๋ค.
NFS์ ๊ธฐ๋ฐ์ด ๋๋ ํ๋กํ ์ฝ์ ์ฌ๋ฌ ๋ถ์ ์ ํ ๋ถ๋ถ์ด ์์ด์ ํนํ O_SYNC
์ O_NDELAY
์ ์ํฅ์ ์ค๋ค.
UID ๋งคํ์ ์ผ NFS ํ์ผ ์์คํ
์์ open()
์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๊ณ ์๋ ๊ฐ๋ น read(2)
์์ฒญ์ด EACCES
๋ก ๊ฑฐ๋ถ๋ ์๋ ์๋ค. ์ด๋ ํด๋ผ์ด์ธํธ์์ open()
์ ์ํํ ๋ ๊ถํ ๊ฒ์ฌ๋ ํ์ง๋ง UID ๋งคํ์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์์ฒญ ๋ ์๋ฒ์์ ์ํํ๊ธฐ ๋๋ฌธ์ด๋ค.
FIFO์ ์ฝ๊ธฐ ์ชฝ ๋ด์ง ์ฐ๊ธฐ ์ชฝ์ ์ฌ๋ ๋์์ (๋ค๋ฅธ ํ๋ก์ธ์ค๋ ์ค๋ ๋๊ฐ) ๋ฐ๋ํธ๋ ์ด ๋๊น์ง ๋ธ๋ก ํ๋ค. ์์ธํ ๋ด์ฉ์ fifo(7) ์ฐธ๊ณ .
flags
์ ์ง์ ํ ์ ์๋ ๋ค๋ฅธ ๊ฐ๋ค๊ณผ ๋ฌ๋ฆฌ ์ ๊ทผ ๋ชจ๋ ๊ฐ์ธ O_RDONLY
, O_WRONLY
, O_RDWR
์ ๊ฐ๋ณ ๋นํธ๋ฅผ ๋ํ๋ด๋ ๊ฒ ์๋๋ค. ๋์ ํจ๊ป flags
์ ํ์ ๋ ๋นํธ๋ฅผ ๊ท์ ํ๋ฉฐ, ๊ฐ๊ธฐ 0, 1, 2๋ก ์ ์๋ผ ์๋ค. ๋ฌ๋ฆฌ ๋งํด O_RDONLY | O_WRONLY
๋ ๋
ผ๋ฆฌ์ ์ค๋ฅ์ด๋ฉฐ ์ ํ O_RDWR
์ ๊ฐ์ ์๋ฏธ๊ฐ ์๋๋ค.
๋ฆฌ๋
์ค์์๋ flags
์ ๋นํ์ค ์ ๊ทผ ๋ชจ๋ 3(์ด์ง์๋ก 11)์ ๋ฐ๋ก ๋๊ณ ์๋๋ฐ, ํ์ผ์์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๊ถํ์ ๊ฒ์ฌํ๋ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ์ ์ฌ์ฉํ ์ ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๋ ๊ฑธ ๋ปํ๋ค. ์ผ๋ถ ๋ฆฌ๋
์ค ๋๋ผ์ด๋ฒ์์ ์ฅ์น๋ณ ioctl(2)
๋์์๋ง ์ฌ์ฉํด์ผ ํ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๊ฒ ํ๋ ๋ฐ ์ด ๋นํ์ค ์ ๊ทผ ๋ชจ๋๋ฅผ ์ด๋ค.
openat()
๊ณผ ๋๋ ํฐ๋ฆฌ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ธ์๋ฅผ ๋ฐ๋ ์ฌํ ์์คํ
ํธ์ถ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ค(์ฆ fexecveat(2), faccessat(2), fanotify_mark(2), fchmodat(2), fchownat(2), fstatat(2), futimesat(2), linkat(2), mkdirat(2), mknodat(2), name_to_handle_at(2), readlinkat(2), renameat(2), statx(2), symlinkat(2), unlinkat(2), utimensat(2), mkfifoat(3), scandirat(3))์ ์ ํ ์ธํฐํ์ด์ค์ ์๋ ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ค๋ฃฌ๋ค. ์ฌ๊ธฐ์ openat()
ํธ์ถ์ ๊ฐ์ง๊ณ ์ค๋ช
ํ์ง๋ง ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ค์ ๊ทผ๊ฑฐ๋ ๋น์ทํ๋ค.
์ฒซ์งธ๋ก, ์์ฉ์์ openat()
์ ์ฐ๋ฉด ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ ์๋ ๋๋ ํฐ๋ฆฌ์ ํ์ผ์ open()
์ผ๋ก ์ด ๋ ๋ฐ์ํ ์ ์๋ ๊ฒฝ์ ์กฐ๊ฑด์ ํผํ ์ ์๋ค. ๊ทธ ๊ฒฝ์ ์กฐ๊ฑด์ open()
์ ์ค ๋๋ ํฐ๋ฆฌ ์ ๋๋ถ์ ์ด๋ ๊ตฌ์ฑ ์์๊ฐ open()
ํธ์ถ๊ณผ ๋์์ ๋ฐ๋ ์๋ ์๋ค๋ ์ฌ์ค์์ ์จ๋ค. ์๋ฅผ ๋ค์ด dir1/dir2/xxx
๋ผ๋ ํ์ผ์ด ์กด์ฌํ๋ฉด dir1/dir2/xxx.dep
๋ผ๋ ํ์ผ์ ๋ง๋ค๊ณ ์ถ๋ค๊ณ ํด ๋ณด์. ๋ฌธ์ ๋ ์กด์ฌ ์ฌ๋ถ ๊ฒ์ฌ ๋จ๊ณ์ ํ์ผ ์์ฑ ๋จ๊ณ ์ฌ์ด์ (์ฌ๋ณผ๋ฆญ ๋งํฌ์ผ ์๋ ์์) dir1
์ด๋ dir2
๊ฐ ๋ค๋ฅธ ์์น๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ณ๊ฒฝ๋ ์๋ ์๋ค๋ ๊ฒ์ด๋ค. ๋์ ๋๋ ํฐ๋ฆฌ์ ๋ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฐ ๋ค์ ๊ทธ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ (๊ฐ๋ น) fstatat(2)๊ณผ openat()
์ dirfd
์ธ์๋ก ์ง์ ํ๋ค๋ฉด ๊ทธ๋ฐ ๊ฒฝ์์ ํผํ ์ ์๋ค. dirfd
ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ฌ์ฉ์๋ ๋ค๋ฅธ ์ด๋๋ ์๋ค.
-
๋๋ ํฐ๋ฆฌ ์ด๋ฆ์ด ๋ฐ๋๋๋ผ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๊ทธ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ ์ ์ผ๋ก ์ฐธ์กฐํ๋ค.
-
์ด๋ฆฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์์ผ๋ฉด ๊ธฐ๋ฐ ํ์ผ ์์คํ ์ ๋ง์ดํธ๊ฐ ํด์ ๋๋ ๊ฒ ๋ฐฉ์ง๋๋ค. ํ์ผ ์์คํ ์์ ํ๋ก์ธ์ค์ ํ์ฌ ์์ ๋๋ ํฐ๋ฆฌ๊ฐ ์๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ค.
๋์งธ๋ก, openat()
์ ์ฐ๋ฉด ์์ฉ์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ(๋ค)์ ์ ์งํ๋ฉฐ ์ค๋ ๋๋ณ "ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ"๋ฅผ ๊ตฌํํ ์ ์๋ค. (/proc/self/fd/dirfd
๋ฅผ ์ด์ฉํ๋ ๊ธฐ๋ฒ์ผ๋ก๋ ๊ฐ์ ๊ธฐ๋ฅ์ฑ์ ์ป์ ์ ์์ง๋ง ๋ ํจ์จ์ ์ด๋ค.)
O_DIRECT
ํ๋๊ทธ ์ฌ์ฉ ์ ์ฌ์ฉ์ ๊ณต๊ฐ ๋ฒํผ์ ๊ธธ์ด์ ์ฃผ์, ๊ทธ๋ฆฌ๊ณ I/O์ ํ์ผ ์คํ์
์ ์ ๋ ฌ ์ ์ฝ์ด ์์ ์ ์๋ค. ๋ฆฌ๋
์ค์ ์ ๋ ฌ ์ ์ฝ์ ํ์ผ ์์คํ
๊ณผ ์ปค๋ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ์์ ์์ ์๋ ์๋ค. ํ์ง๋ง ์์ฉ์์ ์ด๋ค ํ์ผ์ด๋ ํ์ผ ์์คํ
์ ๋ํด ๊ทธ๋ฐ ์ ์ฝ์ ์์๋ผ ์ ์๋ ํ์ผ ์์คํ
๋
๋ฆฝ์ ์ธํฐํ์ด์ค๋ ํ์ฌ ์๋ค. ์ด๋ค ํ์ผ ์์คํ
์์๋ ์ด๋ฅผ ์ํ ์์ฒด ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ธฐ๋ ํ๋๋ฐ, ์๋ฅผ ๋ค์ด xfsctl(3)
์ XFS_IOC_DIOINFO
๊ฐ ์๋ค.
๋ฆฌ๋
์ค 2.4์์๋ ์ ์ก ํฌ๊ธฐ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ๋ฒํผ ๋ฐ ํ์ผ ์คํ์
์ ์ ๋ ฌ์ด ๋ชจ๋ ํ์ผ ์์คํ
์ ๋
ผ๋ฆฌ์ ๋ธ๋ก ํฌ๊ธฐ์ ๋ฐฐ์์ฌ์ผ ํ๋ค. ๋ฆฌ๋
์ค 2.6.0๋ถํฐ๋ ๊ธฐ๋ฐ ์ ์ฅ์์ ๋
ผ๋ฆฌ์ ๋ธ๋ก ํฌ๊ธฐ(๋ณดํต 512๋ฐ์ดํธ)์ ์ ๋ ฌ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ค. ioctl(2)
BLKSSZGET
๋์์ ์ด์ฉํ๊ฑฐ๋ ์
ธ์์ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํด ๊ทธ ๋
ผ๋ฆฌ์ ๋ธ๋ก ํฌ๊ธฐ๋ฅผ ์์๋ผ ์ ์๋ค.
blockdev --getss
๋ฉ๋ชจ๋ฆฌ ๋ฒํผ๊ฐ ๋น๊ณต์ ๋งคํ(์ฆ mmap(2) MAP_PRIVATE
ํ๋๊ทธ๋ก ๋ง๋ ๋งคํ. ํ๊ณผ ์ ์ ํ ๋น ๋ฒํผ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ํฌํจ)์ด๋ผ๋ฉด ์ ๋ O_DIRECT
I/O๋ฅผ fork(2) ์์คํ
ํธ์ถ๊ณผ ๋์์ ์คํํ์ง ๋ง์์ผ ํ๋ค. ๊ทธ๋ฐ I/O๊ฐ ์์ผ๋ฉด ๋น๋๊ธฐ I/O ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ ์ถ๋ ๊ฒ์ด๋ ํ๋ก์ธ์ค์ ๋ค๋ฅธ ์ค๋ ๋์์ ์ด๋ค์ง๋ ๊ฒ์ด๋ fork(2) ํธ์ถ ์ ์ ์๋ฃ๋ผ์ผ ํ๋ค. ๊ทธ๋ ๊ฒ ํ์ง ์์ผ๋ฉด ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค์์ ๋ฐ์ดํฐ ์ค์ผ๊ณผ ๊ท์ ์ ๋ ๋์์ด ๋ฐ์ํ ์ ์๋ค. O_DIRECT
I/O๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ๋ฅผ shmat(2)์ด๋ MAP_SHARED
ํ๋๊ทธ๋ฅผ ์ด mmap(2)์ผ๋ก ๋ง๋ ๊ฒฝ์ฐ์๋ ์ด ์ ์ฝ์ด ์ ์ฉ๋์ง ์๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ์ madvise(2)๋ก MADV_DONTFORK
์กฐ์ธ์ ์ค์ fork(2) ํ ์์์์ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์๊ฒ ๋ง๋ ๊ฒฝ์ฐ์๋ ์ด ์ ์ฝ์ด ์ ์ฉ๋์ง ์๋๋ค.
O_DIRECT
ํ๋๊ทธ๋ SGI IRIX์์ ๋์
๋์์ผ๋ฉฐ ๊ฑฐ๊ธฐ์์ ์ ๋ ฌ ์ ์ฝ์ ๋ฆฌ๋
์ค 2.4์ ๋น์ทํ๋ค. IRIX์๋ ์ ์ ํ ์ ๋ ฌ ๋ฐ ํฌ๊ธฐ๋ฅผ ์ง์ํ ์ ์๋ fcntl(2) ํธ์ถ๋ ์๋ค. FreeBSD 4.x์์ ๊ฐ์ ์ด๋ฆ์ ํ๋๊ทธ๋ฅผ ๋์
ํ๋๋ฐ ์ ๋ ฌ ์ ์ฝ์ ์๋ค.
๋ฆฌ๋
์ค์์ O_DIRECT
์ง์์ด ์ถ๊ฐ๋ ๊ฑด ์ปค๋ ๋ฒ์ 2.4.10์์์๋ค. ๊ทธ ์ ์ ๋ฆฌ๋
์ค ์ปค๋๋ค์ ์ด ํ๋๊ทธ๋ฅผ ๊ทธ๋ฅ ๋ฌด์ํ๋ค. ์ผ๋ถ ํ์ผ ์์คํ
์์ ์ด ํ๋๊ทธ๋ฅผ ๊ตฌํํ๊ณ ์์ง ์์ ์ ์์ผ๋ฉฐ, ๊ทธ ๊ฒฝ์ฐ ํ๋๊ทธ๋ฅผ ์ฐ๋ฉด open()
์ด EINVAL
์ค๋ฅ๋ก ์คํจํ๋ค.
์์ฉ์์ ๊ฐ์ ํ์ผ์ ๋ํด O_DIRECT
I/O์ ๋ณดํต I/O๋ฅผ ์์ด ์ฐ๋ ๊ฑธ ํผํ๋ ๊ฒ ์ข์ผ๋ฉฐ ๊ฐ์ ํ์ผ์ ๊ฒน์น๋ ๋ฐ์ดํธ ์์ญ์ ๋ํด์ ํนํ ๊ทธ๋ ๋ค. ํ์ผ ์์คํ
์์ ์ผ๊ด์ฑ ๋ฌธ์ ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ค ํ๋๋ผ๋ ์ ์ฒด I/O ์ค๋ฃจํ์ด ์ด๋ ํ ๋ชจ๋๋ง ์ฐ๋ ๊ฒฝ์ฐ๋ณด๋ค ๋๋ฆด ๊ฒ์ด๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์์ฉ์์ ๊ฐ์ ํ์ผ์ ๋ํด ํ์ผ mmap(2)๊ณผ ์ง์ I/O๋ฅผ ์์ด ์ฐ๋ ๊ฑธ ํผํ๋ ๊ฒ ์ข๋ค.
NFS์์ O_DIRECT
์ ๋์ ๋ฐฉ์์ ๋ก์ปฌ ํ์ผ ์์คํ
์์์ ๋ค๋ฅด๋ค. ๊ตฌ์ ์ปค๋์ด๋ ํน์ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ ์ปค๋์์๋ ๊ทธ ์กฐํฉ์ ์ง์ํ์ง ์์ ์๋ ์๋ค. NFS ํ๋กํ ์ฝ์์๋ ์๋ฒ๋ก ํ๋๊ทธ๋ฅผ ์ ๋ฌํ๋ ๊ฑธ ์ง์ํ์ง ์์ผ๋ฏ๋ก O_DIRECT
I/O๋ ํด๋ผ์ด์ธํธ์์์ ํ์ด์ง ์บ์๋ง์ ๊ฑด๋๋ฐ๊ฒ ๋๋ค. ์ฆ ์๋ฒ์์๋ ์ฌ์ ํ I/O๋ฅผ ์บ์ฑ ํ ์ ์๋ค. ํด๋ผ์ด์ธํธ์์ ์๋ฒ์๊ฒ I/O๋ฅผ ๋๊ธฐ์ ์ผ๋ก ๋ง๋ค์ด ๋ฌ๋ผ๊ณ ์์ฒญํด์ O_DIRECT
์ ๋๊ธฐ์ฑ ์๋ฏธ๋ก ์ ์ ์งํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ค ์๋ฒ๋ ์ด๋ฐ ๊ฒฝ์ฐ์, ํนํ I/O ํฌ๊ธฐ๊ฐ ์์ ๋ ์ฑ๋ฅ์ด ๋๋น ์ง๊ฒ ๋๋ค. ๋ ์ด๋ค ์๋ฒ๋ ํด๋ผ์ด์ธํธ์๊ฒ I/O๊ฐ ์์ ์ ์ ์ฅ์์ ๋๋ฌํ๋ค๊ณ ๊ฑฐ์ง๋ง์ ํ๊ฒ ๊ตฌ์ฑ๋ผ ์์ ์๋ ์๋ค. ๊ทธ๋ฌ๋ฉด ์ฑ๋ฅ ๋ถ์ด์ต์ ํผํ์ง๋ง ์๋ฒ ์ ์ ์ฅ์ ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ํ ์ํ์ ์ผ๋ง๊ฐ ์ง๊ฒ ๋๋ค. ๋ฆฌ๋
์ค NFS ํด๋ผ์ด์ธํธ์์๋ O_DIRECT
I/O์ ๋ํด ์ด๋ค ์ ๋ ฌ ์ ์ฝ๋ ๋์ง ์๋๋ค.
์์ปจ๋ฐ O_DIRECT
๋ ์ ์ฌ์ ์ผ๋ก ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง ์ฃผ์ํด์ ์จ์ผ ํ๋ค. ์์ฉ์์ O_DIRECT
์ด์ฉ์ ์ฑ๋ฅ ๊ฐ์ ์ต์
์ผ๋ก ์๊ฐํด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํํด ๋๋ ๊ฑธ ๊ถ์ฅํ๋ค.
ํ์ฌ open()
ํธ์ถ ์์ O_ASYNC
๋ฅผ ์ง์ ํด์ ์๊ทธ๋ ์ฃผ๋ I/O๋ฅผ ์ผ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ ํ๋๊ทธ๋ฅผ ์ผ๋ ค๋ฉด fcntl(2)๋ฅผ ์ฌ์ฉํ๋ผ.
์ปค๋์์ O_TMPFILE
๊ธฐ๋ฅ์ ์ง์ํ๋์ง ์ฌ๋ถ๋ฅผ ์์๋ด๋ ค ํ ๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ์ค๋ฅ ์ฝ๋ EISDIR
๊ณผ ENOENT
๋ฅผ ํ์ธํด์ผ ํ๋ค.
flags
์ O_CREAT
๊ณผ O_DIRECTORY
๊ฐ ๊ฐ์ด ์ง์ ๋ผ ์๊ณ pathname
์ผ๋ก ์ง์ ํ ํ์ผ์ด ์กด์ฌํ์ง ์์ ๋ open()
์ด ์ ๊ท ํ์ผ์ ๋ง๋ค๊ฒ ๋๋ค. (์ฆ O_DIRECTORY
๋ฅผ ๋ฌด์ํ๋ค.)
chmod(2), chown(2), close(2), dup(2), fcntl(2), link(2), lseek(2), mknod(2), mmap(2), mount(2), open_by_handle_at(2), read(2)
, socket(2), stat(2), umask(2), unlink(2), write(2)
, fopen(3), acl(5)
, fifo(7), inode(7), path_resolution(7), symlink(7)
2018-04-30