open(2) - wariua/manpages-ko GitHub Wiki

NAME

open, openat, creat - ํŒŒ์ผ์„ ์—ด๊ณ  ๋•Œ์— ๋”ฐ๋ผ ์ƒ์„ฑํ•˜๊ธฐ

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);

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

DESCRIPTION

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 ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•œ๋‹ค.

๊ฒฐ๊ณผ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ๋‹ค์Œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • close(2)

  • 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()

creat() ํ˜ธ์ถœ์€ flags๋ฅผ O_CREAT|O_WRONLY|O_TRUNC๋กœ ํ•ด์„œ open()์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๋™๋“ฑํ•˜๋‹ค.

openat()

openat() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์—ฌ๊ธฐ ์„ค๋ช…ํ•˜๋Š” ์ฐจ์ด์ ์„ ๋นผ๋ฉด open()๊ณผ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

pathname์— ์ค€ ๊ฒฝ๋กœ๋ช…์ด ์ƒ๋Œ€ ๊ฒฝ๋กœ์ด๋ฉด (์ƒ๋Œ€ ๊ฒฝ๋กœ๋ช…์— ๋Œ€ํ•ด open()์—์„œ ํ•˜๋“ฏ ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค์˜ ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ) ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ dirfd๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ช…์„ ํ•ด์„ํ•œ๋‹ค.

pathname์ด ์ƒ๋Œ€ ๊ฒฝ๋กœ์ด๊ณ  dirfd๊ฐ€ ํŠน์ˆ˜ ๊ฐ’ AT_FDCWD์ด๋ฉด (open()์ฒ˜๋Ÿผ) ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค์˜ ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ pathname์„ ํ•ด์„ํ•œ๋‹ค.

pathname์ด ์ ˆ๋Œ€ ๊ฒฝ๋กœ์ด๋ฉด dirfd๋ฅผ ๋ฌด์‹œํ•œ๋‹ค.

RETURN VALUE

open(), openat(), creat()์€ ์ƒˆ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (๊ทธ ๊ฒฝ์šฐ errno๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•œ๋‹ค.)

ERRORS

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๊ฐ€ ๋””๋ ‰ํ„ฐ๋ฆฌ ์•„๋‹Œ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์ด๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.6.16์—์„œ openat()์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. glibc ๋ฒ„์ „ 2.4์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

CONFORMING TO

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 ๊ฐ™์€ ๊ธฐ๋Šฅ ํ™•์ธ ๋งคํฌ๋กœ๋Š” ์–ด๋–ค ํ—ค๋” ํŒŒ์ผ๋„ ํฌํ•จ์‹œํ‚ค๊ธฐ ์ „์— ์ •์˜๋ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

NOTES

๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ํŒŒ์ผ์„ ์—ด๊ณ  ์‹ถ์ง€๋งŒ ๊ผญ ์ฝ๊ธฐ๋‚˜ ์“ฐ๊ธฐ๋ฅผ ํ•˜๋ ค๋Š” ๊ฑด ์•„๋‹Œ ๊ฒฝ์šฐ์— 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 ๋™์ž‘์„ ์‚ฌ์šฉํ•ด (๋™์ผ ํ”„๋กœ์„ธ์Šค์˜ ๋˜๋Š” ๋‹ค๋ฅธ ๋‘ ํ”„๋กœ์„ธ์Šค์˜) ๋‘ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๊ฐ™์€ ์—ด๋ฆฐ ํŒŒ์ผ ๊ธฐ์ˆ  ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™๊ธฐ I/O

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 ๋™์ž‘์€ ์–ป๊ฒŒ ๋œ๋‹ค.

C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ปค๋„ ์ฐจ์ด

๋ฒ„์ „ 2.26๋ถ€ํ„ฐ glibc์˜ open() ๋ž˜ํผ ํ•จ์ˆ˜๊ฐ€ ์ปค๋„์˜ open() ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋Œ€์‹  openat() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ด์šฉํ•œ๋‹ค. ์–ด๋–ค ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” glibc ๋ฒ„์ „ 2.26 ์ „์—์„œ๋„ ๊ทธ๋ ‡๋‹ค.

NFS

NFS์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ํ”„๋กœํ† ์ฝœ์— ์—ฌ๋Ÿฌ ๋ถ€์ ์ ˆํ•œ ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ ํŠนํžˆ O_SYNC์™€ O_NDELAY์— ์˜ํ–ฅ์„ ์ค€๋‹ค.

UID ๋งคํ•‘์„ ์ผ  NFS ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ open()์ด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ ์„œ๋„ ๊ฐ€๋ น read(2) ์š”์ฒญ์ด EACCES๋กœ ๊ฑฐ๋ถ€๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ open()์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ถŒํ•œ ๊ฒ€์‚ฌ๋Š” ํ•˜์ง€๋งŒ UID ๋งคํ•‘์€ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์š”์ฒญ ๋•Œ ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

FIFO

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() ๋ฐ ๊ธฐํƒ€ ๋””๋ ‰ํ„ฐ๋ฆฌ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ API์˜ ๋ฐฐ๊ฒฝ

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

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 ์ด์šฉ์„ ์„ฑ๋Šฅ ๊ฐœ์„  ์˜ต์…˜์œผ๋กœ ์ƒ๊ฐํ•ด์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ด ๋‘๋Š” ๊ฑธ ๊ถŒ์žฅํ•œ๋‹ค.

BUGS

ํ˜„์žฌ open() ํ˜ธ์ถœ ์‹œ์— O_ASYNC๋ฅผ ์ง€์ •ํ•ด์„œ ์‹œ๊ทธ๋„ ์ฃผ๋„ I/O๋ฅผ ์ผœ๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ผœ๋ ค๋ฉด fcntl(2)๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

์ปค๋„์—์„œ O_TMPFILE ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์•„๋‚ด๋ ค ํ•  ๋•Œ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์ฝ”๋“œ EISDIR๊ณผ ENOENT๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

flags์— O_CREAT๊ณผ O_DIRECTORY๊ฐ€ ๊ฐ™์ด ์ง€์ •๋ผ ์žˆ๊ณ  pathname์œผ๋กœ ์ง€์ •ํ•œ ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ open()์ด ์ •๊ทœ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. (์ฆ‰ O_DIRECTORY๋ฅผ ๋ฌด์‹œํ•œ๋‹ค.)

SEE ALSO

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

โš ๏ธ **GitHub.com Fallback** โš ๏ธ