Search
โญ๏ธ

get_next_line

Created
2021/02/13
tag
42์„œ์šธ
42Seoul
get_next_line
gnl
fd
fcntl
static

Subjects

โ€ข
โ€ข

1. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ (fd: File Descriptor)

1) ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ž€?

ํ”ํžˆ ์œ ๋‹‰์Šค ๋‚ด์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ ํŒŒ์ผ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ •๊ทœ ํŒŒ์ผ (Regular File)์—์„œ๋ถ€ํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ (Directory), ์†Œ์ผ“ (Socket), ํŒŒ์ดํ”„ (pipe), ๋ธ”๋ก ๋””๋ฐ”์ด์Šค, ์บ๋ฆญํ„ฐ ๋””๋ฐ”์ด์Šค ๋“ฑ๋“ฑ ๋ชจ๋“  ๊ฐ์ฒด๋“ค์€ ํŒŒ์ผ๋กœ์จ ๊ด€๋ฆฌ๋œ๋‹ค. ์œ ๋‹‰์Šค ์‹œ์Šคํ…œ์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์œ„์™€ ๊ฐ™์€ ํŒŒ์ผ๋“ค์„ ์ ‘๊ทผํ•  ๋•Œ์— ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ (File Descriptor)๋ผ๋Š” ๊ฐœ๋…์„ ์ด์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค.
์‘์šฉ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ผ์„ ์—ด๊ฑฐ๋‚˜ ์ƒ์„ฑ ํ•˜๊ฒŒ ๋˜๋ฉด ์ •์ˆ˜๋กœ ๋œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์–ป๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ์ฝ๊ธฐ (read ํ•จ์ˆ˜), ์“ฐ๊ธฐ (write ํ•จ์ˆ˜), ํŒŒ์ผ ๋™์ž‘ ์ œ์–ด (fcntl ํ•จ์ˆ˜), ํŒŒ์ผ ๋‹ซ๊ธฐ(close ํ•จ์ˆ˜)๋“ฑ์˜ ๋ชจ๋“  ํŒŒ์ผ์— ๋Œ€ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก FD Table์„ ์ฐธ์กฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” index์ด๋‹ค.
๋‹จ์ˆœํžˆ index ๊ฐ’๋งŒ์œผ๋กœ ํŒŒ์ผ์„ ์ œ์–ดํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๋•Œ ์ด์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”๋“ค์ด 3๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ, FD Table, File Table, VFS inode Cache์ด๋‹ค. ์ œ์‹œ๋œ ํ…Œ์ด๋ธ”๋“ค์ด ๋ฌด์—‡์ด๋ฉฐ, ์–ด๋–ค ํ๋ฆ„์œผ๋กœ ์ด์šฉ๋˜๋Š”์ง€ ์ดํ•ดํ•ด์•ผ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๋™์ž‘๋“ค์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

1. FD Table

FD Table์€ File Descriptor Table์ด๋ฉฐ, ๋จธ์‹  ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋กœ์„ธ์Šค ๋‹จ์œ„๋กœ ํ• ๋‹น๋˜๋Š” ํ…Œ์ด๋ธ”์ด๋‹ค. ์ฆ‰, ๊ฐ ํ”„๋กœ์„ธ์Šค๋“ค์€ ์ €๋งˆ๋‹ค์˜ FD Table์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, FD Table์˜ ๊ฐ index์—๋Š” File Table์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก File Table์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ 0๋ฒˆ, 1๋ฒˆ, 2๋ฒˆ index๊ฐ€ ํ™œ์„ฑํ™” ๋˜๋ฏ€๋กœ, FD Table์˜ ๊ฐ index์— ํ•ด๋‹น๋˜๋Š” ๊ณต๊ฐ„์—๋Š” ๊ฐ๊ฐ ํ‘œ์ค€ ์ž…๋ ฅ, ํ‘œ์ค€ ์ถœ๋ ฅ, ํ‘œ์ค€ ์˜ค๋ฅ˜์— ํ•ด๋‹น๋˜๋Š” File Table์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ฒŒ ๋œ๋‹ค.
Linux์—์„œ์˜ Kernel์„ ๋œฏ์–ด๋ณด๋ฉด <linux/file.h>์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด fdtable์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ์•„๋ž˜์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์ค‘์—์„œ fd๊ฐ€ ๊ณง ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ผ๋Š” index๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฐ์—ด์ธ๋ฐ, ์ด๋Š” file์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ฃผ์†Œ์— ๋Œ€ํ•œ ๋ฐฐ์—ด์ด๋ฏ€๋กœ ์ด์ค‘ ํฌ์ธํ„ฐ๋กœ ์„ ์–ธ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
file์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋Š” Linux์—์„œ์˜ Kernel์—์„œ ์‚ฌ์šฉ๋˜๊ณ  <linux/fs.h>์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ File Table์„ ๋‹ค๋ฃฐ ๋•Œ ํ™•์ธํ•  ๊ฒƒ์ด๋‹ค. ์ด์™€ ๊ฐ™์€ ํ—ค๋”๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ—ค๋”๊ฐ€ ์•„๋‹ˆ๋ผ, ์šด์˜์ฒด์ œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ผ๋ถ€์ด๋ฏ€๋กœ Kernel์„ ์ด๋ฃจ๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
struct fdtable { unsigned int max_fds; int max_fdset; struct file ** fd; /* current fd array */ fd_set *close_on_exec; fd_set *open_fds; struct rcu_head rcu; struct files_struct *free_files; struct fdtable *next; };
C
๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ๋Š” ๋™์ผํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ, FD Table์ด ํ”„๋กœ์„ธ์Šค ๋‹จ์œ„๋กœ ํ• ๋‹น๋œ๋‹ค๋Š” ๊ฒƒ์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ผ๋ฉด ์ค‘๋ณต๋œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, a๋ผ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ FD Table์˜ 3๋ฒˆ index๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด์„œ b๋ผ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ FD Table์˜ 3๋ฒˆ index๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๋ง์ด๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ํ• ๋‹น์€ ๋จธ์‹  ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋กœ์„ธ์Šค ๋‹จ์œ„๋ผ๋Š” ๊ฒƒ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.
๋˜ํ•œ ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ FD Table์„ ์ด์šฉํ•˜๋ฏ€๋กœ, ๊ฐ FD Table์ด ๊ฐ–๊ณ  ์žˆ๋Š” File Table์˜ ์ฃผ์†Œ๋Š” ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด a ํ”„๋กœ์„ธ์Šค๊ฐ€ FD Table์˜ 3๋ฒˆ index๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๋•Œ aFile์„ ์ด์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ  b ํ”„๋กœ์„ธ์Šค๊ฐ€ FD Table์˜ 3๋ฒˆ index๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๋•Œ bFile์„ ์ด์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด, ์„œ๋กœ ๋‹ค๋ฅธ File Table์˜ ์ฃผ์†Œ๊ฐ€ ๊ธฐ๋ก๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

2. File Table

FD Table์ด ํ”„๋กœ์„ธ์Šค ๋‹จ์œ„๋กœ ํ• ๋‹น๋˜์—ˆ๋‹ค๋ฉด, File Table์€ ๋จธ์‹  ๋‹จ์œ„์˜ ํ• ๋‹น์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ๋จธ์‹  ๋‹จ์œ„์˜ ์ „์—ญ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ด ํ…Œ์ด๋ธ”์€ <linux/file.h>์˜ files_struct๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋กœ ๊ทธ ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ๋•Œ ํ…Œ์ด๋ธ”์˜ ๊ฐ entry๋Š” <linux/fs.h>์˜ file์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ์ด ๋•Œ files_struct ๋‚ด์— ๋‹จ์ˆœํžˆ file์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด์˜ ๋ฐฐ์—ด์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์ด files_struct๋ฅผ ๋ณด๋ฉด ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. files_struct๋ผ๋Š” ํ•˜๋‚˜์˜ ํฐ ๊ตฌ์กฐ์ฒด๋Š” ๊ฐ ํ”„๋กœ์„ธ์Šค๋“ค์ด ์ด์šฉํ•˜๋Š” fdtable์˜ ๋ฐฐ์—ด๋กœ ์œ ์ง€๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ๋•Œ ํ•˜๋‚˜์˜ fdtable์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ file์ด๋ผ๋Š” entry์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.
struct files_struct { /* * read mostly part */ atomic_t count; struct fdtable *fdt; struct fdtable fdtab; /* * written part on a separate cache line in SMP */ spinlock_t file_lock ____cacheline_aligned_in_smp; int next_fd; struct embedded_fd_set close_on_exec_init; struct embedded_fd_set open_fds_init; struct file * fd_array[NR_OPEN_DEFAULT]; };
C
์ด ๋•Œ ํŒŒ์ผ์— ๋Œ€ํ•œ ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„  ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, <linux/fs.h>์˜ file ๊ตฌ์กฐ์ฒด ๋‚ด์—๋Š” ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ ์ž ๊น ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž๋ฉด, ์œ ๋‹‰์Šค์—์„œ ํŒŒ์ผ๋“ค์„ ๊ด€๋ฆฌํ•  ๋•Œ๋Š” inode๋ผ๊ณ  ํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ, ์ด ๊ตฌ์กฐ์ฒด์—๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด์ด ๊ธฐ๋ก๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ file ๊ตฌ์กฐ์ฒด์—๋„ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•ด๋‘๊ฒŒ ๋˜๋ฉด inode์˜ ์—ญํ• ๊ณผ ์ค‘๋ณต๋˜์–ด ๊ทธ ์กด์žฌ ์˜์˜๊ฐ€ ๋ฌด์ƒ‰ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, file ๊ตฌ์กฐ์ฒด์—๋Š” ํ”„๋กœ์„ธ์Šค์˜ FD Table์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์–ป์„ ๋•Œ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ์ œ์–ด ์ •๋ณด๋“ค ์œ„์ฃผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
struct file { /* * fu_list becomes invalid after file_free is called and queued via * fu_rcuhead for RCU freeing */ union { struct list_head fu_list; struct rcu_head fu_rcuhead; } f_u; struct dentry *f_dentry; struct vfsmount *f_vfsmnt; const struct file_operations *f_op; atomic_t f_count; unsigned int f_flags; mode_t f_mode; loff_t f_pos; struct fown_struct f_owner; unsigned int f_uid, f_gid; struct file_ra_state f_ra; unsigned long f_version; void *f_security; /* needed for tty driver, and maybe others */ void *private_data; #ifdef CONFIG_EPOLL /* Used by fs/eventpoll.c to link all the hooks to this file */ struct list_head f_ep_links; spinlock_t f_ep_lock; #endif /* #ifdef CONFIG_EPOLL */ struct address_space *f_mapping; };
C
inode๋ž€? ํŒŒ์ผ์„ ๊ธฐ์ˆ ํ•˜๋Š” ๋””์Šคํฌ ์ƒ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ์„œ ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์ด ๋””์Šคํฌ ์ƒ์˜ ์–ด๋Š ์ฃผ์†Œ์— ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€์™€ ๊ฐ™์€ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ inode๋“ค์€ ๊ณ ์œ  ๋ฒˆํ˜ธ(inode number)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ํŒŒ์ผ์„ ์‹๋ณ„ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ls -i ์˜ต์…˜์œผ๋กœ inode number๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

3. VFS inode Cache

์‹ค์ œ๋กœ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ์ด์šฉํ•˜๊ณ  ์ด๋ฅผ ์กฐ์ž‘ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” inode๋ฅผ ์ง์ ‘ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ, ์œ„์˜ file ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ทธ ์–ด๋””์—๋„ inode์™€ ๊ด€๋ จ๋œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋ž˜๋œ Kernel์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด file ๊ตฌ์กฐ์ฒด ๋‚ด์— ์ง์ ‘์ ์œผ๋กœ inode๋ผ๋Š” ๊ตฌ์กฐ์ฒด๊ฐ€ ํฌ์ธํ„ฐ๋กœ ์กด์žฌํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ํ˜„์žฌ ํ™•์ธํ•˜๊ณ  ์žˆ๋Š” Kernel์˜ ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด <linux/fs.h>์˜ address_space๋ผ๋Š” ๊ตฌ์กฐ์ฒด ๋‚ด์— inode ๊ตฌ์กฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๋‘˜ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
struct address_space { struct inode *host; /* owner: inode, block_device */ struct radix_tree_root page_tree; /* radix tree of all pages */ rwlock_t tree_lock; /* and rwlock protecting it */ unsigned int i_mmap_writable;/* count VM_SHARED mappings */ struct prio_tree_root i_mmap; /* tree of private and shared mappings */ struct list_head i_mmap_nonlinear;/*list VM_NONLINEAR mappings */ spinlock_t i_mmap_lock; /* protect tree, count, list */ unsigned int truncate_count; /* Cover race condition with truncate */ unsigned long nrpages; /* number of total pages */ pgoff_t writeback_index;/* writeback starts here */ const struct address_space_operations *a_ops; /* methods */ unsigned long flags; /* error bits/gfp mask */ struct backing_dev_info *backing_dev_info; /* device readahead, etc */ spinlock_t private_lock; /* for use by the address_space */ struct list_head private_list; /* ditto */ struct address_space *assoc_mapping; /* ditto */ } __attribute__((aligned(sizeof(long))));
C
์œ„์™€ ๊ฐ™์ด ๊ฐ๊ฐ์˜ file์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋“ค์ด ๋‚ด๋ถ€์ ์œผ๋กœ inode์˜ ์ฃผ์†Œ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํ–‰์œ„์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด๋ณด์ž. ์ด์™€ ๊ฐ™์€ ํ–‰์œ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ์œ„ํ•ด์„  ํŒŒ์ผ์— ๋Œ€ํ•œ ํŠน์ • ๋™์ž‘ ์ˆ˜ํ–‰์„ ์œ„ํ•ด ํŒŒ์ผ์„ ์—ฌ๋Š” ํ–‰์œ„๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋ฉฐ, ํ•ด๋‹น ํŒŒ์ผ๊ณผ ์ผ์น˜ํ•˜๋Š” inode๋ฅผ ์ „์ฒด์ ์œผ๋กœ ์ฐพ์•„๋‚ด๋Š” ๊ณผ์ •์ด ์š”๊ตฌ๋œ๋‹ค. ํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋กœ ๋™์ผํ•œ ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ด๋Ÿฌํ•œ ํ–‰์œ„๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋งŒ์ผ ์ค‘๋ณต๋˜๋Š” ํŒŒ์ผ๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ฐ˜๋ณต์ ์œผ๋กœ inode๋ฅผ ์ „์ฒด์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ฒŒ ๋˜๋ฉด ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์„ฑ๋Šฅ์ด ๊ต‰์žฅํžˆ ์ข‹์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ์„ ์—ด ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ๋œ inode๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํ–‰์œ„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๋•Œ ๊ธฐ๋ก๋˜๋Š” ๊ณต๊ฐ„์ด VFS inode Cache์ด๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ ๊ธฐ๋กํ•˜๋ฉฐ ์œ ์ง€ํ•˜๋Š” inode๋Š” ๊ณ ์œ ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ผ์ด ์—ด๋ฆฌ๊ฒŒ ๋˜๋ฉด VFS inode Cache๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•œ ํ›„์— ์ „์ฒด ํƒ์ƒ‰์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
VFS inode Cache์—์„œ ์œ ์ง€ํ•˜๋Š” entry๋“ค์€ ๊ณ ์œ ํ•˜๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Š” ํ•ด์‰ฌ ํ…Œ์ด๋ธ”๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.
VFS inode Cache๋Š” File Table์˜ ๊ฐ entry์˜ ๊ธฐ๋ก์—๋„ ๋„์›€์ด ๋˜์ง€๋งŒ, ํ˜„์žฌ ์—ด๋ ค ์žˆ๋Š” ํŒŒ์ผ๋“ค์˜ ๋ฌถ์Œ์ด๋ผ๋Š” ์ ์—์„œ ์šด์˜์ฒด์ œ์˜ ํŒŒ์ผ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ๋„ ๋งŽ์€ ๋„์›€์ด ๋œ๋‹ค.

4. ์ „์ฒด์ ์ธ ๊ตฌ์กฐ

2) ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ์ฒ˜๋ฆฌ ํ๋ฆ„

fd = open("test.txt", O_RDONLY); // Bunch of Code Execution close(fd);
C
์œ„์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์—์„œ ์„ค๋ช…๋œ ๊ฒƒ๋“ค์„ ์ด์šฉํ•˜์—ฌ ํ๋ฆ„์„ ํ™•์ธํ•ด๋ณด์ž. ๋‹จ, test.txt๋Š” ๊ธฐ์กด์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํŒŒ์ผ๋กœ์จ inode๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ๊ณ , ํ˜ธ์ถœ ๊ตฌ๋ฌธ ์ด์ „์— ์—ด๋ ค์žˆ๋Š” ํŒŒ์ผ์€ ํ•˜๋‚˜๋„ ์—†๋‹ค๊ณ  ์ „์ œํ•˜์—ฌ VFS inode Cache๋Š” ๋น„์–ด์žˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•œ๋‹ค. open ๋ฐ close์™€ ๊ฐ™์ด ํŒŒ์ผ์— ๋Œ€ํ•œ ๋™์ž‘์„ ์•ผ๊ธฐํ•˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” ์‹œ์Šคํ…œ ์ฝœ์ด ํ˜ธ์ถœ๋˜๋ฉฐ, ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์— ๋Œ€ํ•ด์„œ๋Š” Kernel ๋‚ด์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
[1] VFS inode Cache๊ฐ€ ๋น„์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋””์Šคํฌ ๋‚ด์—์„œ test.txt๋ฅผ ์ฐพ๊ณ  ๊ทธ inode ์ •๋ณด๋ฅผ ์ทจ๋“ํ•œ๋‹ค.
[2] inode์—์„œ test.txt์˜ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ™•์ธํ•˜์—ฌ, open ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋œ ๋ชจ๋“œ๊ฐ€ ์ ‘๊ทผ ๊ถŒํ•œ์— ์œ„๋ฐฐ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
์ ‘๊ทผ ๊ถŒํ•œ์— ์œ„๋ฐฐ๋œ๋‹ค๋ฉด, ์ฆ‰์‹œ -1 ๊ฐ’์„ index๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
[3] VFS inode Cache์˜ ์ƒˆ๋กœ์šด entry๋กœ์จ, test.txt์— ํ•ด๋‹นํ•˜๋Š” inode๋ฅผ ์ฑ„์›Œ ๋„ฃ๋Š”๋‹ค.
[4] test.txt์— ํ•ด๋‹นํ•˜๋Š” File Table์˜ entry๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด์— ๋”ฐ๋ผ file ๊ตฌ์กฐ์ฒด์˜ ๊ฐ’๋“ค์„ ์ดˆ๊ธฐ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
์„ค์ • ๊ฐ’๋“ค ์ค‘์—์„œ f_pos๋Š” ํŒŒ์ผ์ด ์ฝ๊ณ  ์“ธ ์œ„์น˜์— ๋Œ€ํ•œ index์ด๋‹ค. O_APPEND ๋ชจ๋“œ๋กœ open ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค๋ฉด f_pos๋Š” ๊ณง ํŒŒ์ผ์˜ ํฌ๊ธฐ์™€ ๋™์ผํ•˜๊ฒŒ ์„ค์ •๋˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด 0์œผ๋กœ ์„ค์ •๋œ๋‹ค.
์„ค์ • ๊ฐ’๋“ค ์ค‘์—์„œ f_flags๋Š” open ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋œ ๋ชจ๋“œ ๊ฐ’์ด ๊ธฐ๋ก๋œ๋‹ค. Read-Only๋กœ ํŒŒ์ผ์„ ์—ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•œ ๊ฐ’์œผ๋กœ f_flags๊ฐ€ ์„ค์ •๋œ๋‹ค.
์„ค์ • ๊ฐ’๋“ค ์ค‘์—์„œ f_count๋Š” File Table์˜ entry๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ํ˜„์žฌ๋Š” ํ•ด๋‹น entry์— ๋Œ€ํ•ด ์ตœ์ดˆ๋กœ ์ฐธ์กฐํ•˜๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ƒ๊ธธ ์˜ˆ์ •์ด๋ฏ€๋กœ 1๋กœ ์„ค์ •๋œ๋‹ค. ๋™์ผํ•œ ํŒŒ์ผ์„ ์—ฌ๋Š” ๊ฒฝ์šฐ์—๋„ ๋ณ„๋„์˜ File Table์˜ entry๋กœ ๊ธฐ๋ก์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์ฒด์ ์œผ๋กœ f_count๋Š” 1์ด ๋˜์ง€๋งŒ, ์˜ˆ์™ธ์ ์œผ๋กœ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณต์ œํ•˜๋Š” dup ํ˜น์€ dup2 ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๋กœ ๋™์ผํ•œ entry๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฒฝ์šฐ์— f_count๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ๋™์ผ entry๋ฅผ ์ง€์นญํ•˜๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ์ˆ˜์— ๋”ฐ๋ผ์„œ f_count๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ  ๊ฐ์†Œํ•œ๋‹ค.
[5] test.txt์˜ inode๋ฅผ ์ฐธ์กฐํ•˜๋Š” File Table์˜ entry๊ฐ€ ์ƒ๊ฒผ์œผ๋ฏ€๋กœ, ํ•ด๋‹น inode ๊ตฌ์กฐ์ฒด ๋‚ด์— ์žˆ๋Š” i_count์˜ ์ฐธ์กฐ ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค.
i_count๋ผ๋Š” ์„ค์ • ๊ฐ’์€ File Table์˜ entry๋“ค์ด inode๋ฅผ ์ฐธ์กฐํ•  ๋•Œ๋งˆ๋‹ค i_count๋Š” ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๊ณ , inode์˜ ์ฐธ์กฐ๋ฅผ ๋Š์–ด ๋‚ผ ๋•Œ๋งˆ๋‹ค i_count๋Š” ๊ฐ์†Œํ•˜๊ฒŒ ๋œ๋‹ค. ํ˜„์žฌ์˜ ๊ฒฝ์šฐ์—๋Š” ์ตœ์ดˆ๋กœ inode๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ i_count์˜ ๊ฐ’์€ 1์ด ๋œ๋‹ค.
[6] ํ”„๋กœ์„ธ์Šค์˜ FD Table์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜์—ฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€ ์•Š์€ ์˜์—ญ์— File Table์˜ entry ์ฃผ์†Œ๋ฅผ ํฌ์ธํ„ฐ๋กœ ๊ธฐ๋กํ•œ ํ›„, open ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ํ•ด๋‹น ์˜์—ญ์˜ index๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ 0, 1, 2๋ฒˆ index์— ํ•ด๋‹นํ•˜๋Š” ์˜์—ญ์€ stdin, stdout, stderr์— ๋Œ€ํ•œ ์ŠคํŠธ๋ฆผ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ดํ›„์˜ ๊ฐ’์ด ๋ฐ˜ํ™˜๋œ๋‹ค.
[7] ์ฃผ์„ ์ฒ˜๋ฆฌ ๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.
[8] FD Table์˜ fd์— ํ•ด๋‹นํ•˜๋Š” index์˜ ์˜์—ญ์—์„œ File Table์˜ entry ์ฃผ์†Œ๋ฅผ ์ง€์šด๋‹ค.
[9] File Table์˜ entry๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์—†์–ด์กŒ์œผ๋ฏ€๋กœ, f_count์˜ ๊ฐ’์ด ๊ฐ์†Œํ•œ๋‹ค.
ํ˜„์žฌ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ณ„๋„์˜ ๋ณต์ œ ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1์ด์—ˆ๋˜ f_count์˜ ๊ฐ’์ด 0์ด ๋œ๋‹ค. f_count์˜ ๊ฐ’์ด 0์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— File Table์—์„œ ํ•ด๋‹น entry๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
[10] test.txt์˜ inode๋ฅผ ์ฐธ์กฐํ•˜๋Š” File Table์˜ entry๊ฐ€ ์‚ฌ๋ผ์กŒ๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น inode ๊ตฌ์กฐ์ฒด ๋‚ด์— ์žˆ๋Š” i_count์˜ ๊ฐ’์„ ๊ฐ์†Œํ•œ๋‹ค.
ํ˜„์žฌ์˜ ๊ฒฝ์šฐ์—๋Š” 1์ด์—ˆ๋˜ i_count์˜ ๊ฐ’์ด 0์œผ๋กœ ๊ฐ์†Œํ–ˆ์œผ๋ฏ€๋กœ VFS inode Cache์—์„œ test.txt์˜ inode์— ํ•ด๋‹นํ•˜๋Š” entry๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

3) ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ œํ•œ

์šด์˜์ฒด์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ์ œํ•œ๋˜์–ด ์žˆ๋‹ค. ์ด ๊ฐ’์€ ์‚ฌ์šฉํ•˜๋Š” ์šด์˜์ฒด์ œ ํ˜น์€ ๋จธ์‹ ์— ๋”ฐ๋ผ์„œ๋„ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์–ผ๋งˆ๋งŒํผ์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๊ฐ€์šฉํ• ์ง€์— ๋Œ€ํ•ด์„œ๋„ ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž์— ํ•œํ•˜์—ฌ ๊ทธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ ์ƒ์—์„œ ์ •ํ™•ํžˆ ์š”๊ตฌํ•˜๋Š” ์ตœ๋Œ€์น˜๊นŒ์ง€๋งŒ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด์„  ์‚ฌ์ „์— ์ •์˜๋œ ๊ฐ’์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์„ ํƒ์ง€๊ฐ€ ์•„๋‹ˆ๋‹ค.
์‹œ์Šคํ…œ ์ƒ์—์„œ ์ •์˜๋œ ์ตœ๋Œ€์น˜๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด์„  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉฐ, <unistd.h>์˜ ํฌํ•จ์ด ํ•„์š”ํ•˜๋‹ค. name์—๋Š” ์‹œ์Šคํ…œ ์ƒ์—์„œ ์–ด๋–ค ์ •๋ณด๋ฅผ ์•Œ์•„๋‚ผ ๊ฒƒ์ธ์ง€ ํ•ญ๋ชฉ์— ๋”ฐ๋ผ ์ •์˜๋œ ๋งคํฌ๋กœ ๊ฐ’์„ ์ธ์ž๋กœ ๋„ฃ๋Š”๋‹ค. ํ˜„์žฌ ์ƒํ™ฉ์ฒ˜๋Ÿผ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด์„  _SC_OPEN_MAX๋ผ๋Š” ๊ฐ’์„ name์œผ๋กœ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ ์™ธ์˜ ์„ค์ • ๊ฐ’์„ ์•Œ์•„๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋„๋ก ํ•˜์ž.
long sysconf(int name);
C
#include <stdio.h> #include <unistd.h> int main(void) { long limit; limit = sysconf(_SC_OPEN_MAX); printf("%ld File Descriptors can be used\n", limit); return (0); }
C
์œ„ ์ฝ”๋“œ์—์„œ sysconf๋ฅผ ํ†ตํ•ด ์–ป์–ด๋‚ธ ๊ฐ’์€, getconf ๋ช…๋ น์–ด๋กœ ์•Œ์•„๋‚ธ ํ˜„์žฌ ์‹œ์Šคํ…œ ์ƒ์—์„œ ์„ค์ •๋œ ํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ์—ด ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ํŒŒ์ผ์˜ ์ˆ˜์™€ ๋™์ผํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
๋งŒ์ผ ์œ„์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ์ฐจ์„ ์ฑ…์œผ๋กœ OPEN_MAX ํ˜น์€ FOPEN_MAX ๋“ฑ์˜ ๋งคํฌ๋กœ ๊ฐ’์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์‹œ์Šคํ…œ ์ƒ์—์„œ ์ •์˜๋œ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ ๋ฐ ์šด์˜์ฒด์ œ์— ๋”ฐ๋ผ ์–ธ์–ด์—์„œ ์ •์˜๋œ ๊ฐ’์ด๋ฏ€๋กœ ์ •ํ™•ํ•œ ์ˆ˜์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ ์ƒ์—์„œ๋Š” ํ•œ ํ”„๋กœ์„ธ์Šค ๋‹น 2048๊ฐœ์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‘˜ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋งคํฌ๋กœ ๊ฐ’์ด ๊ทธ ์ด์ƒ์ธ ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ๊ฐ’์— ๋Œ€ํ•ด ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค.

4) ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ํ™•์ธ

int open(const char *filename, int flags, [mode_t mode]);
C
open ํ•จ์ˆ˜๋Š” filename์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์„ ์—ด๊ณ , ํ•ด๋‹น ํŒŒ์ผ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ˜„์žฌ ์ด์šฉ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋ฐ›์•„ index๋กœ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค. open ํ•จ์ˆ˜๋Š” <fcntl.h>์— ์œ„์น˜ํ•œ๋‹ค.
int close(int fd);
C
close ํ•จ์ˆ˜๋Š” open ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜ ๋ฐ›์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋‹ซ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ •ํ™•ํžˆ๋Š” File Table์˜ entry ์ฃผ์†Œ๋ฅผ ์ง€์›Œ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค์–ด, entry์˜ f_count๋ฅผ ํ•˜๋‚˜ ๊ฐ์†Œ์‹œํ‚ค๋„๋ก ๋งŒ๋“ ๋‹ค. close ํ•จ์ˆ˜๋Š” <unistd.h>์— ์œ„์น˜ํ•œ๋‹ค.
์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ 3๋ถ€ํ„ฐ ๋ถ€์—ฌ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ถœ๋ ฅ๋œ 3์€ ํ‘œ์ค€ ์ž…๋ ฅ, ํ‘œ์ค€ ์ถœ๋ ฅ, ํ‘œ์ค€ ์˜ค๋ฅ˜๋ฅผ ์ง€์นญํ•˜๋Š” index์˜ ๋ฐ”๋กœ ๋‹ค์Œ ๊ฐ’์ด๋‹ค.
#include <stdio.h> #include <fcntl.h> #include <unistd.h> int main(void) { int fd; fd = open("test.txt", O_RDONLY); if (fd == -1) return (1); printf("fd : %d\n", fd); close(fd); return (0); }
C

5) ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ณ€๊ฒฝ

์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋•Œ๋ฌธ์— ํ˜„์žฌ ํŒŒ์ผ์— ๋Œ€ํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณต์ œํ•˜๋Š” ํ–‰์œ„๋กœ ์ด์™€ ๋น„์Šทํ•˜๊ฒŒ ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ๋ณต์ œ๋Š” ๋Œ€์ฒด์ ์œผ๋กœ ํ‘œ์ค€ ์ž…๋ ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” 0๋ฒˆ index ํ˜น์€ ํ‘œ์ค€ ์ถœ๋ ฅ์„ ์˜๋ฏธํ•˜๋Š” 1๋ฒˆ index๊ฐ€ ๊ธฐ์กด์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋„๋ก ๋งŒ๋“ค๋ฉด์„œ, 0๋ฒˆ๊ณผ 1๋ฒˆ index๋ฅผ ์ด์šฉํ•˜๋”๋ผ๋„ ํ‘œ์ค€ ์ž…๋ ฅ๊ณผ ํ‘œ์ค€ ์ถœ๋ ฅ์— ๋Œ€ํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“œ๋Š”๋ฐ ์ด์šฉ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์€ pipe ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•  ๋•Œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋ณต์ œ ํ–‰์œ„๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ฃผ๋œ ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๋ช…์‹ฌํ•˜๊ณ , ์—ฌ๊ธฐ์„œ๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ๋ณต์ œ์— ๋Œ€ํ•œ ์‹ฌ๋„ ์žˆ๋Š” ์ดํ•ด๋ณด๋‹ค๋Š” ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.
dup ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด ํ˜„์žฌ ์ด์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ด์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ๊ณ , dup2์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ด์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ๋‹ค. ์ด ๋•Œ dup2์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด, ์‚ฌ์ „์— ๋จผ์ € ์—ด๋ ค์žˆ๋˜ ํŒŒ์ผ์„ ๋‹ซ์•„์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ•ด์ œํ•œ ํ›„์— ํ•ด๋‹น ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค.
์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” dup2 ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.
#include <stdio.h> #include <fcntl.h> #include <unistd.h> int main(void) { int fd1; int fd2; fd1 = open("test.txt", O_RDONLY); if (fd1 == -1) return (1); printf("fd1\t: %d\n", fd1); printf("\nDuplication\n\n"); fd2 = dup2(fd1, 42); printf("fd1\t: %d\n", fd1); printf("fd2\t: %d\n", fd2); close(fd1); close(fd2); return (0); }
C

2. File Control์„ ์œ„ํ•œ ํ•จ์ˆ˜๋“ค

1) open ํ•จ์ˆ˜ ๊ทธ๋ฆฌ๊ณ  create, close

Linux, Unix ๊ณ„์—ด์˜ ์‹œ์Šคํ…œ์—์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ผ์„ ์—ด ๋•Œ open ํ•จ์ˆ˜ ํ˜น์€ openat ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
int open(const char *filename, int flag); int open(const char *filename, int flag, [mode_t mode]); int openat(int dirfd, const char *filename, int flag); int openat(int dirfd, const char *filename, int flag, [mode_t mode]);
C
๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ filename (์ ˆ๋Œ€ ๊ฒฝ๋กœ ํ˜น์€ ์ƒ๋Œ€ ๊ฒฝ๋กœ), flag, mode ๋“ฑ์„ ๋ฐ›๊ณ  ํŒŒ์ผ ๋””์ŠคํŠธ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฆ‰, open ๊ด€๋ จ ํ•จ์ˆ˜๋Š” filename์— ๋ช…์‹œ๋œ ํŒŒ์ผ์„ flag์—์„œ ์„ค์ •ํ•œ ๋ชจ๋“œ๋กœ ์—ด์–ด์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

openat ํ•จ์ˆ˜์™€ open ํ•จ์ˆ˜์˜ ์ฐจ์ด

open์€ ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์„ flag ์˜ต์…˜์„ ์ ์šฉํ•˜์—ฌ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด, openat์€ open๊ณผ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ dirfd๊ฐ’์„ ์ถ”๊ฐ€๋กœ ๋ฐ›์•„ ๊ฒฝ๋กœ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. openat ํ•จ์ˆ˜๊ฐ€ ๋„์ž…๋œ ๋ฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
โ€ข
๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค. ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค์— ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ๋“ค์€ CWD(Current Working Directory)๋ฅผ ๊ณต์œ ํ•œ๋‹ค.
โ€ข
TOCTTOU(time-of-check-to-time-of-use) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค.
openat ํ•จ์ˆ˜๋Š”? ๊ด€๊ฑด์€ filename์ด ์ ˆ๋Œ€ ๊ฒฝ๋กœ์ธ์ง€ ์ƒ๋Œ€ ๊ฒฝ๋กœ์ธ์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. 1. ๊ฒฝ๋กœ๋กœ ์ฃผ์–ด์ง„ ์ธ์ž๊ฐ€ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ผ๋ฉด, dirfd๋Š” ๋ฌด์‹œ๋œ๋‹ค. 2. ๊ฒฝ๋กœ๋กœ ์ฃผ์–ด์ง„ ์ธ์ž๊ฐ€ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ผ๋ฉด, FD Table์˜ dirfd ์— ํ•ด๋‹นํ•˜๋Š” ํ•ญ๋ชฉ์„ ์ฐพ์•„ ๋‚˜์˜จ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ธ์ž๋ฅผ ๋ถ™์—ฌ ์ฐพ์•„๊ฐ„๋‹ค. 3. ๊ฒฝ๋กœ๋กœ ์ฃผ์–ด์ง„ ์ธ์ž๊ฐ€ ์ƒ๋Œ€ ๊ฒฝ๋กœ์ด๋ฉด์„œ dirfd ๊ฐ’์ด ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์˜๋ฏธํ•˜๋Š” AT_FDCWD๋กœ ๋˜์–ด ์žˆ๋‹ค๋ฉด, ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ธ์ž๋ฅผ ๋ถ™์—ฌ ์ฐพ์•„๊ฐ„๋‹ค. ์ด ๋•Œ dirfd์˜ AT_FDCWD๋ผ๋Š” ํŠน์ˆ˜ ๊ฐ’์ด ์กด์žฌํ•˜๋ฉฐ ์ด ๋•Œ๋Š” open๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. (open ์—ญ์‹œ CWD ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.) (openat์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ dirfd์˜ ์ด๋ฆ„์—์„œ๋„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ˜„์žฌ FD Table์— ๊ธฐ๋ก๋˜์–ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋ฏ€๋กœ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์˜ fd๋ฅผ ์ด์šฉํ•œ๋‹ค. ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” dirfd ๊ฐ’์„ ์–ป๊ธฐ ์œ„ํ•ด ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์ฒด๋ฅผ ์ธ์ž๋กœ ์‚ฌ์šฉํ•˜๋Š” int dirfd(DIR *dirp) ํ•จ์ˆ˜๋ฅผ ์ฃผ๋กœ ์ด์šฉํ•œ๋‹ค.)
Search
oflag
๊ธฐ์ค€
์—ด
O_WRONLY
Open
Necessary
ํŒŒ์ผ์„ ์“ฐ๊ธฐ ์ „์šฉ์œผ๋กœ ์—ฐ๋‹ค. (Write Only)
O_RDWR
Open
Necessary
ํŒŒ์ผ์„ ์“ฐ๊ธฐ์™€ ์ฝ๊ธฐ์šฉ์œผ๋กœ ์—ฐ๋‹ค. (Read & Write)
O_EXEC
Open
Necessary
ํŒŒ์ผ์„ ์‹คํ–‰ ์ „์šฉ์œผ๋กœ ์—ฐ๋‹ค. (Execute Only)
O_SEARCH
Open
Necessary
๋””๋ ‰ํ† ๋ฆฌ ํŒŒ์ผ์„ ํƒ์ƒ‰ ์ „์šฉ์œผ๋กœ ์—ฐ๋‹ค. (Search Only)
O_APPEND
Open
Optional
ํŒŒ์ผ์˜ ๋๋ถ€๋ถ„ (EOF)์— writeํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.
O_CLOEXEC
Open
Optional
FD_CLOEXEC ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•œ ์ฑ„ ํŒŒ์ผ์„ ์—ฐ๋‹ค. (exec๋ฅ˜์˜ ํ•จ์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด fd๊ฐ€ ๋‹ซ๊ธด๋‹ค.)
O_CREAT
Open
Optional
ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ƒ์„ฑํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ช…์‹œํ•˜๋ฉด, open ํ•จ์ˆ˜์— Permission ์ •๋ณด๋ฅผ ์ถ”๊ฐ€๋กœ ๋” ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ํŒŒ์ผ์ด ์กด์žฌํ•˜๋ฉด ์—ฐ๋‹ค.
O_DIRECTORY
Open
Optional
path์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์ด ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค.
O_EXCL
Open
Optional
O_CREAT ํ”Œ๋ž˜๊ทธ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค ํŒŒ์ผ์ด ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค.
O_NOCTTY
Open
Optional
path์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์ด ํ„ฐ๋ฏธ๋„ ์žฅ์น˜์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ์žฅ์น˜๋ฅผ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ์ปจํŠธ๋กค๋ง ํ„ฐ๋ฏธ๋„๋กœ ํ• ๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค.
O_NOFOLLOW
Open
Optional
path์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์ด ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค.
O_NONBLOCK
Open
Optional
FIFO, Block Device, Charactoer Device์— ๋Œ€ํ•ด ๋…ผ ๋ธ”๋กํ‚น ๋ฐฉ์‹์œผ๋กœ read ํ•จ์ˆ˜์™€ write ํ•จ์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ธฐ๋ณธ ์„ค์ •์„ ์„ธํŒ…ํ•œ๋‹ค.
O_SYNC
Open
Optional
path์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์— write ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ I/O๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ์„ค์ •ํ•œ๋‹ค
O_TRUNC
Open
Optional
ํŒŒ์ผ์ด ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  write-only, read-write๋ชจ๋“œ๋กœ ์—ด ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ํŒŒ์ผ ์‚ฌ์ด์ฆˆ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”์‹œํ‚จ๋‹ค
O_DSYNC
Open
Optional
write ํ•จ์ˆ˜ ์ˆ˜ํ–‰์‹œ ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„์— ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ I/O๊ฐ€ ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ํŒŒ์ผ์˜ ์„ค์ •์ด๋‚˜ Attribute๋ถ€๋ถ„์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋Š” ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
O_RSYNC
Open
Optional
read ํ•จ์ˆ˜ ์ˆ˜ํ–‰์‹œ ์ปค๋„์— ํ•ด๋‹น ํŒŒ์ผ์˜ offset์— ๋Œ€ํ•œ write ํ•จ์ˆ˜์˜ pending์ด ์žˆ์œผ๋ฉด ๊ทธ write ํ•จ์ˆ˜์˜ ์ˆ˜ํ–‰์ด ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

creat ํ•จ์ˆ˜

์ƒˆ๋กœ์šด ํŒŒ์ผ ์ƒ์„ฑ์€ creat ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
int creat(const char *filename, [mode_t mode]);
C
open ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„ฑ๊ณตํ•˜๋ฉด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ, ์‹คํŒจํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
creat ํ•จ์ˆ˜๋Š” open ํ•จ์ˆ˜๋กœ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
open(filename, O_WRONLY | O_CREAT | O_TRUNC, [mode]);
C
creat ํ•จ์ˆ˜์˜ ์ตœ๋Œ€ ๋‹จ์ ์€ write ๋ชจ๋“œ๋กœ๋งŒ ์—ด๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์‹œ ์ฝ๊ธฐ ์œ„ํ•ด์„œ๋Š” creat ํ•จ์ˆ˜๋กœ ํŒŒ์ผ์„ ๋งŒ๋“  ํ›„, close ํ•จ์ˆ˜๋กœ ๋‹ซ๊ณ  O_RDONLY๋กœ ์ฝ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค.
open(filename, O_RDWR | O_CREAT | O_TRUNC, [mode]);
C

close ํ•จ์ˆ˜

open ํ•จ์ˆ˜๋กœ ์—ฐ ํŒŒ์ผ์€ close ํ•จ์ˆ˜๋กœ ๋‹ซ์„ ์ˆ˜ ์žˆ๋‹ค.
int close(int fd);
C
์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉด 0์„, ์‹คํŒจํ•˜๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
ํŒŒ์ผ์„ ๋‹ซ์œผ๋ฉด, ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ผ์— ์„ค์ •ํ–ˆ๋˜ Record Lock(๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ)๋„ ์ž๋™์œผ๋กœ ์ž ๊ธˆ ํ•ด์ œ๋œ๋‹ค. ๋˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ด์–ด๋†จ๋˜ ํŒŒ์ผ๋“ค์€ close ํ•จ์ˆ˜๋กœ ๋‹ซ๊ธฐ๊ฒŒ ๋œ๋‹ค.
Record Lock(๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ)์ด๋ž€? ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์—์„œ, ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋™์‹œ์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ ํŒŒ์ผ ์ž ๊ธˆ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ํŒŒ์ผ์— ์ฝ๊ธฐ๋ฐ ์“ฐ๊ธฐ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ž ๊ธˆ์ด๋ผ๋Š” ํ–‰๋™์˜ ์ฃผ์ฒด๋Š” ์šด์˜์ฒด์ œ์ด๋‹ค. ์ž ๊ธˆ์— ๋Œ€ํ•œ ๊ธฐ๋ก์ด ์šด์˜์ฒด์ œ์—์„œ ๊ด€๋ฆฌ, ๊ธฐ๋ก์„ ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. (Record Lock ์ž์ฒด๋Š” <fcntl.h>์˜ fcntl ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ด๋ค„์ง€๋ฉฐ, ์ด ๋•Œ flock์ด๋ผ๊ณ  ํ•˜๋Š” ์ž ๊ธˆ์„ ์œ„ํ•œ ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•œ๋‹ค.)

2) read ํ•จ์ˆ˜

ํŒŒ์ผ์„ ์—ด๊ณ  ๋‚œ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ์—๋Š” read ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. read ํ•จ์ˆ˜๋Š” ํŒŒ์ผ์—์„œ n ๋งŒํผ ์ฝ์–ด์™€์„œ buf์— ๊ทธ ๊ฐ’์„ ํ• ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค. ํ•จ์ˆ˜๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ฝ์€ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
ssize_t read(int fd, void *buf, size_t n);
C
size_t์™€ ssize_t๋ž€? size_t๋Š” ๊ฐ์ฒด์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ type์œผ๋กœ ๋ณดํ†ต์˜ 32 bit ๋จธ์‹ ์—์„œ๋Š” 32 bit ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ unsigned int๋กœ ๋˜์–ด์žˆ๋‹ค. sizeof๋ผ๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ๋‹ด๊ธฐ ์œ„ํ•œ type์œผ๋กœ ๋ณด๋ฉด ๋˜๊ณ , ๋งŽ์€ I/O ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ssize_t๋Š” ๋ถ€ํ˜ธ๊ฐ€ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๊ฐ์ฒด์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ type์œผ๋กœ ๋ณดํ†ต์˜ 32 bit ๋จธ์‹ ์—์„œ๋Š” 32 bit ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ int๋กœ ๋˜์–ด์žˆ๋‹ค. I/O ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” ํ•ด๋‹น I/O ํ•จ์ˆ˜์˜ ์‹คํŒจ๋ฅผ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ์ˆ˜ํ–‰ ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ํ•ด๋‹น I/O ํ•จ์ˆ˜์˜ ์‹คํŒจ๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.
์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
//text.txt abcdefg
C
// read.c #include <fcntl.h> #include <stdio.h> #include <unistd.h> int main(void) { int fd; char buf[100]; fd = open("./text.txt", O_RDONLY); if (fd < 0) printf("file open error"); else { read(fd, buf, sizeof(buf)); printf("%s", buf); close(fd); } return (0); }
C

3) write ํ•จ์ˆ˜

ํŒŒ์ผ์„ ์—ด๊ณ  ๋‚œ ํ›„ ํŒŒ์ผ์— ๊ฐ’์„ ๊ธฐ๋กํ•  ๋•Œ๋Š” write ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•จ์ˆ˜ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋กํ•œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
ssize_t write(int fd, const void *buf, size_t n);
C

3. ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•˜์—ฌ

1) Program (ํ”„๋กœ๊ทธ๋žจ)์ด๋ž€?

์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ ํ•จ์€ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด ๋ชจ์Œ์ด ๋“ค์–ด ์žˆ๋Š” ๋ฉ์–ด๋ฆฌ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ์˜ ๋ฉ์–ด๋ฆฌ๋Š” Code์™€ Data๋กœ ๋‚˜๋‰œ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ ์ž์ฒด๋กœ์จ๋Š” ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†๊ณ , ๊ทธ๊ฒƒ์„ ๋”๋ธ” ํด๋ฆญ ๋“ฑ์œผ๋กœ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์˜๋ฏธ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ ์•ˆ์— ์žˆ๋Š” ๋ช…๋ น์–ด๋ฅผ ํ•œ ์ค„์”ฉ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ๋ญ”๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๋“ฑ์˜ ์ƒํƒœ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ”„๋กœ๊ทธ๋žจ์ด ์ƒํƒœ(State)๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ํ•œ๋‹ค.

2) Process (ํ”„๋กœ์„ธ์Šค)๋ž€?

ํ”„๋กœ์„ธ์Šค๋Š” ์šด์˜์ฒด์ œ์— ์˜ํ•ด์„œ ๊ด€๋ฆฌ ๋˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค ๋ณ„๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ์กด์žฌํ•œ๋‹ค. ํ”„๋กœ์„ธ์Šค์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฝ๊ณ  ์“ฐ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ํ”„๋กœ์„ธ์Šค๋กœ์จ ๋Œ์•„๊ฐ€๊ฒŒ ๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ Code์™€ Data๋Š” ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ถˆ๋Ÿฌ๋“ค์—ฌ ์ง„๋‹ค. ์ด ๋•Œ ํ”„๋กœ์„ธ์Šค๋Š” Code Segment, Data Segment, Heap, Stack์˜ ๊ตฌ์กฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ์šด์˜์ฒด์ œ๊ฐ€ Heap๊ณผ Stack์œผ๋กœ ์ง์ ‘ ๋‚˜๋ˆ„์–ด ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค. ์šด์˜์ฒด์ œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ์‚ฌ์šฉํ•  ๊ณต๊ฐ„ ์ž์ฒด๋ฅผ ๋ถ€์—ฌํ•˜๊ธฐ๋งŒ ํ•  ๋ฟ, ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์„ค์ •๊ณผ ๊ตฌ๋™ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ์„œ ๊ฒฐ์ •๋œ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ์€ HDD, SSD์™€ ๊ฐ™์€ ๊ณณ์— ์กด์žฌํ•˜๊ณ , ํ”„๋กœ์„ธ์Šค๋Š” RAM์— ์กด์žฌํ•œ๋‹ค.
์ผ๋ฐ˜์ ์ธ Stack์˜ ํฌ๊ธฐ๋Š” ์ˆ˜์‹ญKB ~ ์ˆ˜์‹ญMB ์ •๋„์ด๋‹ค. ์ด ํฌ๊ธฐ๋Š” ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ ์ƒ์ดํ•˜๋ฉฐ, ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•  ๋•Œ Stack์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๋ฐฐ์—ด์„ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๋ฉด Stack ์šฉ๋Ÿ‰ ๋ถ€์กฑ ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ์ˆ˜ ์žˆ๋‹ค. ์ง€์—ญ ๋ณ€์ˆ˜ ์ด์™ธ์—๋„ Stack์—๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๊ธฐ๋ก ๋ฐ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋“ฑ์— ๋Œ€ํ•ด ๋ณด์œ ํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด๋“ค์€ ๋ชจ๋‘ ์ค‘๊ด„ํ˜ธ์˜ Block ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋˜์–ด ์ค‘๊ด„ํ˜ธ๋ฅผ ๋งˆ์น˜๋ฉด Stack์—์„œ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ๋ชจ๋“  ๊ฒƒ๋“ค์ด Stack Frame์„ ๋ฒ—๊ฒจ๋‚ด๋ฉด์„œ ํ•ด์ œ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  ์‹œ์Šคํ…œ ์„ค์ •์œผ๋กœ Stack์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ•์ œ๋กœ ๋Š˜๋ ค์ฃผ๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ์ด์šฉ์„ Stack์„ ํ”ผํ•˜๋ฉด ๋œ๋‹ค. ์ด๋Š” ์ •์  ๋ณ€์ˆ˜ ํ˜น์€ ์ „์—ญ ๋ณ€์ˆ˜ ๋กœ ์„ ์–ธํ•˜์—ฌ Data Segment์— ์œ„์น˜์‹œํ‚ค๊ฑฐ๋‚˜ Heap์œผ๋กœ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ๋ฐ›์œผ๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

3) Thread (์“ฐ๋ ˆ๋“œ)๋ž€?

ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„๋Š” ์“ฐ๋ ˆ๋“œ์ด๋‹ค. ์ด ๋•Œ, ํ”„๋กœ์„ธ์Šค ๋‚ด์—๋Š” ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•œ ํ”„๋กœ์„ธ์Šค ์•ˆ์— ์†ํ•œ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋“ค์€ ํ”„๋กœ์„ธ์Šค ์•ˆ์˜ Heap, Code Segment, Data Segment๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ Stack๋งŒ ๋ณ„๋„๋กœ ๊ฐ€์ง„๋‹ค. (์ด ๋ง์€ ๊ฐ ์“ฐ๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋“ค์ด ์“ฐ๋ ˆ๋“œ ๋งˆ๋‹ค ๋ณ„๋„๋กœ ๊ด€๋ฆฌ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.) ํ”„๋กœ์„ธ์Šค ๋‚ด์—๋Š” ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ๋‘”์ฑ„๋กœ ์‹คํ–‰์ด ๋  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋˜ํ•œ ์ด๋ ‡๊ฒŒ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ๋ชจ๋ธ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ–๋Š” ์ „๋ฐ˜์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์€ ์•„๋ž˜์˜ ๊ธ€์„ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž. ์ด๋ฅผ ํ†ตํ•ด static ๋ณ€์ˆ˜๊ฐ€ ์–ด๋Š ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์— ์กด์žฌํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด, static์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

4. static ๋ณ€์ˆ˜

1) static ๋ณ€์ˆ˜๋ž€?

static ๋ณ€์ˆ˜๋Š” Global, Local ์–ด๋Š ๊ฒƒ์œผ๋กœ ์ด์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
์ „์—ญ์ด๋“  ์ง€์—ญ์ด๋“  static ๋ณ€์ˆ˜๋Š” Data Segment์— ์œ„์น˜ํ•œ๋‹ค.

2) ์™ธ๋ถ€ ์ •์  ๋ณ€์ˆ˜

์ „์—ญ์œผ๋กœ ์„ ์–ธ๋œ static ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€ ์ •์  ๋ณ€์ˆ˜๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, ๋ณ„๋„์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ด ์—†๋‹ค๋ฉด 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์ด ๋•Œ๋Š” Data Segment์˜ BSS ์˜์—ญ์— ์œ„์น˜ํ•˜์—ฌ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์กด์žฌ ์‹œ์—๋Š” Data Segment์˜ Data ์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค. ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์—๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๋Ÿฐ ํƒ€์ž„์— ์ด๋ค„์ง€๋ฏ€๋กœ ๋Ÿฐ ํƒ€์ž„ ์ด์ „์— ๊ทธ ๊ฐ’์ด ๊ฒฐ์ •๋˜๋Š” static ๋ณ€์ˆ˜์—๋Š” ์ด์šฉํ•  ์ˆ˜ ์—†๋‹ค.

3) ๋‚ด๋ถ€ ์ •์  ๋ณ€์ˆ˜

ํŠน์ • ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ๋‚ด๋ถ€ ์ •์  ๋ณ€์ˆ˜๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, ์™ธ๋ถ€ ์ •์  ๋ณ€์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ„๋„์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ด ์—†์œผ๋ฉด 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค. ์ด ๋•Œ๋Š” Data Segment์˜ BSS ์˜์—ญ์— ์œ„์น˜ํ•˜์—ฌ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์กด์žฌ ์‹œ์—๋Š” Data Segment์˜ Data ์˜์—ญ์— ์œ„์น˜ํ•œ๋‹ค. ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์—๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ๋Ÿฐ ํƒ€์ž„์— ์ด๋ค„์ง€๋ฏ€๋กœ ๋Ÿฐ ํƒ€์ž„ ์ด์ „์— ๊ทธ ๊ฐ’์ด ๊ฒฐ์ •๋˜๋Š” static ๋ณ€์ˆ˜์—๋Š” ์ด์šฉํ•  ์ˆ˜ ์—†๋‹ค.
static ๋ณ€์ˆ˜๋ฅผ ํ•จ์ˆ˜ ํ˜น์€ ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ ๋‚ด๋ถ€ ์ •์  ๋ณ€์ˆ˜๋กœ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ๊ฐ ํ•จ์ˆ˜ ๋ณ„ ํ˜น์€ ํด๋ž˜์Šค ๋ณ„๋กœ ๊ณต์œ ๋˜๋Š” ์ผ์ข…์˜ ๊ณต์œ  ๋ณ€์ˆ˜๋กœ ์ด์šฉ๋œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.
#include <stdio.h> void increase_num(void) { static int num = 4; printf("%d\n", num); ++num; } int main(void) { increase_num(); increase_num(); increase_num(); return (0); }
C
์œ„์˜ ๊ฒฝ์šฐ static int num์ด๋ผ๋Š” ๋‚ด๋ถ€ ์ •์  ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐ ๊ฐ’ ๊ฒฐ์ •์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•  ๋•Œ ์ด๋ค„์ง€๋ฉฐ ๊ทธ ๊ฐ’์ด 4๊ฐ€ ๋œ๋‹ค. ์ด ๋•Œ static int num์€ increase_num์ด๋ผ๋Š” ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋ณด์—ฌ Stack์— ์œ„์น˜ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— Data ์˜์—ญ์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์— ๋”ฐ๋ผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ increase_num ํ•จ์ˆ˜ ๋‚ด์—์„œ static int num = 4๋ผ๋Š” ๊ตฌ๋ฌธ์€ ๋งค ํ•จ์ˆ˜ ์‹คํ–‰๋งˆ๋‹ค ์ด๋ค„์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ๋‚ด๋ถ€ ์ •์  ๋ณ€์ˆ˜๋Š” ํŠน์ • ํ•จ์ˆ˜ ํ˜น์€ ํด๋ž˜์Šค ๊ฐ„ ๊ณต์œ ๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„ main ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” 4, 5, 6๊ฐ€ ๋œ๋‹ค.

4) ์ฃผ์˜ํ•  ์ 

๋‹ค๋ฅธ ์†Œ์Šค ํŒŒ์ผ์— ์กด์žฌํ•˜๋Š” ์ „์—ญ static ๋ณ€์ˆ˜ (์™ธ๋ถ€ ์ •์  ๋ณ€์ˆ˜)๋Š” ์ฐธ์กฐ ํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, extern์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ณ  ์ด๋ฅผ ์‹œ๋„ํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
โ€ข
increase_num.c
#include <stdio.h> static int num = 4; void increase_num(void) { printf("%d\n", num); ++num; }
C
โ€ข
main.c
#include <stdio.h> extern int num; // ์ปดํŒŒ์ผ ์—๋Ÿฌ void increase_num(void); int main(void) { increase_num(); increase_num(); increase_num(); printf("%d\n", num); return (0); }
C
์œ„์™€ ๊ฐ™์ด extern์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

static ๋ณ€์ˆ˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜์— static์„ ๋ถ™์ด๋”๋ผ๋„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” static์œผ๋กœ์จ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ๊ฐ’์ด ์œ ์ง€ ๋˜์ง€ ์•Š๋Š”๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

5. Reference

6. Code of Jseo