System Programming Ch3
๐กย Chap_3
File Descriptors
๐ File Descriptors
os์์ ํ์ ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ
0 : ํ์ค์ ๋ ฅ
1 : ํ์ค์ถ๋ ฅ
2 : ํ์ค์๋ฌ
ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํ๋ฐ์ ๋๋ 0,1,2๋ฅผ ์ ์ธํ๊ณ ๊ฐ์ฅ ๋ฎ์ integer์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ non-negative integer returned by open or create
๐ open function
(๋จ๋ตํ)ํ์ผ์ ์ฌ๋ ํจ์๋ช ์ ์ฐ์์ค.
โ open
#include <fcntl.h>
int open(const char *pathname, int oflag, ... /* , mode_t mode */);
oflag argument
- open์ ์ธ์ (int oflag)
- ์ฝ์๊ฑด์ง, ์ธ๊ฑด์ง, ๋ ๋ค ํ ๊ฑด์ง
- O_RDONLY : ์ฝ๊ธฐ๋ง ํจ
- O_WRONLY : ์ฐ๊ธฐ๋ง ํจ
- O_RDWR : ๋ ๋ค ํจ
- Optional
- O_APPEND : ํ์ผ์ ์ด๋ฏธ ๋ด์ฉ์ด ์๋๋ฐ ๊ทธ ๋ค์ ์ถ๊ฐํ๊ณ ์ถ์ ๋ ์
- O_CREAT : ์๋ ํ์ผ์ ๋ง๋ค ๋ ์
- O_EXCL : exception, ์์ธ ์ฒ๋ฆฌ
- O_TRUNC : truncate, ์์ ์๋ ๋ด์ฉ์ ์ ๋ถ ๋ ๋ ค์ค
- O_NOCTTY
- O_NONBLOCK
๐ creat , close Function
#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
//equivalent to
open(pathname, O_WRONLY | O_CREAT |O_TRUNC, mode);
- openํจ์์์ O_CREAT๋ ์ต์ ์ด๊ณ , creat๋ ํ์ผ์ ์์ฑํ๋ ํจ์์ด๋ค.
- close๋ ์ด์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋์ด์ ์ฌ์ฉํ์ง ์๋๋ค, ์ฆ ๋ซ๋ ํจ์
๐ read, write Function
- read ํจ์๋ ์ฝ์ ๋ฐ์ดํธ ์๋งํผ ๋ฐํ์ ํจ
- EOF(end of file)๋ 0์ ๋ฐํ
- EOF ๋ง๋๋ฉด ํ์ผ์ ๋
- write ํจ์๋ ์ด ๋ฐ์ดํธ ์๋งํผ ๋ฐํ์ ํจ
#include <unistd.h>
ssize_t write(int filedes, const void *buf, size_t nbytes);
- nbytes ๋ด๊ฐ ์ฐ๊ธฐ๋ฅผ ์ํํ ๋ฐ์ดํธ์ ์ (์ด๊ฒ๊ณผ write๊ฐ ๋ฐํํ ์๋ฅผ ๋น๊ตํด์ ๊ฐ์์ง ํ์ธํ๋ฉด ์ ๋๋ก ์ํํ๋์ง ํ์ธ ๊ฐ๋ฅ)
๐ lseek Function
- ๋ด๊ฐ ํ์ผ์ ์ด๋๊น์ง ์ฝ์๋์ง, ๋๋ ์ด๋์๋ถํฐ ์ธ์ง ์์น๋ฅผ ์๊ณ ์ถ์ ๋ ์
- ํน์ ๊ทธ ์์น๋ก ์ฎ๊ฒจ๊ฐ ๋ ์
- SEEK_SET : ์ฒ์ ์์น๋ก ์ฎ๊ฒจ๊ฐ (offset from the beginning of the file)
- SEEK_CUR : ์ง๊ธ ํ์ฌ ์์น (current file offset + offset)
- SEEK_END : ํ์ผ์ ๋ (file size + offset) (์ด๋ offset์ ์์)
- offset : ์ผ๋ง๋งํผ skip ํ ๊ฑด์ง ์ ํด์ค (๊ธฐ์ค์ ์ด ๋จ)
(๋จ๋ตํ)
ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฒ์์ผ๋ก ์ฎ๊ธฐ๋ ์ต์ ์? โ SEEK_SET
๋์ผ๋ก ์ฎ๊ธฐ๋ ์ต์ ์? โ SEEK_END
ํ์ผ์ด ํ์ฌ ์ฝ๊ณ ์๋ ํฌ์ธํฐ์ ์์น๋ฅผ ์ฎ๊ธฐ๋ ํจ์๋? โ lseek
File Sharing
File Sharing_1 (๊ทธ๋ฆผ ์์ฒด๋ฅผ ๊ทธ๋ฆฌ๋ผ๋ ๋ฌธ์ ๊ฐ ๋์ฌ ํ๋ฅ ์ด ๋งค์ฐ ๋์) -์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ์๋ก ์ ์ ํ๋์จ์ด์ ๊ฐ๊น์ โ ์ ๊ทธ๋ฆผ์ ํ๋์ ํ๋ก์ธ์ค์์ ๋๊ฐ์ file descriptor๋ฅผ ๋ง๋ค๊ณ ๊ฐ๊ธฐ ๋ค๋ฅธ v-node์ ์ ๊ทผ
๐ process table entry
- ํ๋ก์ธ์ค(์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ main์์ ์๋ ์ฝ๋)์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ถ์๋ถ
- ํ๋ก์ธ์ค์์ ์ด๋ค file descriptor๋ค์ด ์ด๋ ค์๋์ง๋ฅผ ์๋ ค์ค (0,1,2 ๋ os์์ ๊ธฐ๋ณธ์ผ๋ก ์ด์ด ๋์)
file table
- ํ์ผ์ ๋ํ ์ ๋ณด(ํ์ผ์ ์ด๋ฆ, ์์ฑ์, ์์ ์, ์์ ๊ทธ๋ฃน, ์์ฑ์๊ฐ, ์ด ํ์ผ์ ๋์คํฌ๋ฆฝํฐ๋ ๋ช๊ฐ๊ฐ ์ฐ๊ฒฐ๋์ด์๋ ๋ฑ, metadata)๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ถ์๋ถ(table)
- metadata๋ ์ค์ ๋ก i-node์ ์์, file table์ ์ค๊ฐ์ ์ญํ
- ํ์ผ์ ๊ฐ์๋งํผ ์กด์ฌ
- file status flags : ์ฐ๊ธฐ๋ชจ๋๋ก ์ด๋ ค์๋, ์ฝ๊ธฐ๋ชจ๋๋ก ์ด๋ ค์๋ โฆ ํ์ผ์ ๋ํ ์ํ ์ ๋ณด
- current file offset : ํ์ผ์ด ์ด๋์๋ถํฐ ์ด๋๊น์ง ์ ์ฅ๋์ด์๋์ง ๋ํ๋ด๋ ๊ธฐ์ค
- v-node ptr : ์ค์ ๋ก ๋ฐ๋ผ๊ฐ๋ณด๋ฉด i-node๊ฐ ์์ , ์ด i-node๊ฐ metadata๋ฅผ ๋ด๊ณ ์์
v-node table
- v-node๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ
v-node
โ os๋ ๋ฒจ์์ ์ข ๋ ์ฝ๊ฒ ๋ง๋ค์ด์ค, i-node๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ๋ผ๊ณ ์ ๊ณตํด์ฃผ๋ ๊ฒ
โ ์ฆ, i-node๋ฅผ ์ ์ดํ๊ธฐ ์ํ virtual node interface์ด๋ค.
i-node
โ ํ๋์ architecture, unix linux ์์คํ ์์ ํ์ผ์ ์ ์ฅ ํ๋ ค๋ฉด i-node๋ผ๋ ๊ตฌ์ฑ์ ๋ฐ๋ผ์ผํจ, ์ด ํ์ค์ด i-node architecture
โ ํ๋์จ์ด์ ๋ ๊ฐ๊น์ด ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์, ๋ฉ๋ชจ๋ฆฌ/๋จ์ ๋ ๊ฐ๊น์์ง
โ ํ์ผ์ ์ฉ๋์ด ๋์ด๋ ๋ ํ์ด์ง๋ ๋ช๊ฐ๋ฅผ ์ฐ๊ณ โฆ ์ด๋ฐ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์, ์์นํ๋ ์ ๋ณด
โ ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ ๋ฐ๊ฟ ์ ์์ด์ผํ๋๋ฐ, ์ด์์ฒด์ ์์ ์ปค๋์ด ๊ด๋ฆฌํจ
โ ์ปค๋์ ์ฌ์ฉ์๊ฐ ์ฐ๊ธฐ์๋ ๋๋ฌด ์ด๋ ค์ ๊ทธ๋์ os๋ฅผ ๋ง๋ค์ด๋์
*process table entry, file table, v-node table ๋ชจ๋ ์ปค๋์์ ๊ด๋ฆฌํจ
File Sharing_2 โ ์ ๊ทธ๋ฆผ์ ๊ตฌ์กฐ๋ ๋๊ฐ์ง๋ง ํฌ์ธํ ํ๋ ํ์ดํ์ ๋ฐฉํฅ๊ณผ ๊ฐ์๊ฐ ๋ค๋ฆ โ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์๋ก ๋ค๋ฅธ ํ์ผ ํ ์ด๋ธ์ ์ ๊ทผํ๋๋ฐ v-node๊ฐ ๊ฐ์
๐ v-node๊ฐ ๊ฐ๋ค = i-node๊ฐ ๊ฐ๋ค =
์๋ก๋ค๋ฅธ ํ๋ก์ธ์ค ๋๊ฐ๊ฐ ๊ฐ์ ํ์ผ์ ํฌ์ธํ ํ๊ณ ์๋ค.
ํ์ผ ์คํ์ ๋๊ฐ์ ํ์ผ์ ๋ํด ๋๋ฒํ๋ ๊ฒ์
dup and dup2 Functions โ ํ๋ก์ธ์ค ํ๋๊ฐ ๊ฐ์ ํ์ผํ ์ด๋ธ์ ๊ฐ๋ฆฌํค๊ณ v-node๋ ๊ฐ์
๐ dup, dup2 Functions
- duplicate
- dup ํจ์๋ฅผ ์ฐ๋ฉด ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋์ํจ
- ํ๋์ ํ๋ก์ธ์ค ๋ด์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ณต์ฌ
- dup2๋ ๊ฐ์์ญํ , ์ธ์๋ง ๋ค๋ฆ
(๋จ๋ตํ)ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ณต์ฌํ๋ ํจ์๋?
โ dup ๋๋ dup2
- dup : ๊ฐ์ฅ ๋ฎ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํ
- dup2: fd1์ fd2๋ก ๋ณต์ ํ์ฌ fd2๋ฅผ ๋ฐํ (fd2๊ฐ ์ด๋ ค์๋ค๋ฉด closeํ๊ณ ๋ณต์ )
Atomic Operations
๐ race condition(๊ฒฝ์ ์ํ)
- ํ๋ก์ธ์ค ๋๊ฐ๊ฐ ๋์์ ํ๋๋ฐ, ํ๋ก์ธ์ค ํ๋๋ ์ฆ๊ฐ์ฐ์ฐ์, ํ๋๋ ๊ฐ์์ฐ์ฐ์๋ผ๋ฉด ์๋ก ๋๊ธฐ๊ฐ ๋ง๋๋ค๋ฉด ์ด๊ธฐ๊ฐ๊ณผ ๊ฐ์์ง ๊ฒ์
- ๋๊ธฐํ๋ผ์ ์ผ์ด๋๋ฉด ๊ณ์ 0์ผ ๊ฒ์(์ด๊ธฐ๊ฐ์ด 0์ด๋ผ๋ฉด)
- ๊ทผ๋ฐ, ๋๊ธฐ๊ฐ ์๋ง์ผ๋ฉด(์ ํํ 1์ด์ ํ๋ฒ์ฉ ์ํ์ด ์๋จ) โ ๋ ์ด์ค ์ปจ๋์
- ํ๋์ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํฅ์ ๋ฏธ์นจ
atomic operation
- ์๋ก ๋ค๋ฅธ ๋๊ฐ์ ๋์ ๊ฐ์ ์๋ก๊ฐ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํ๋ ๊ฒ
- ๊ฐ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ํ๋ ์ผ์ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํฅ์ ๋ฏธ์น๋ฉด ์๋๋ค โ ์์์ ์ธ(atomic) ์ํ
if (lseek(fd, 0L, SEEK_END) < 0)
//์ง๊ธ ํ์ฌ fd๋ก ๋๊ฒจ์ฃผ๋ ํ์ผ์ ์ฒ์๋ถํฐ ๋๊น์ง, ์ด๋ฅผ 1500์ด๋ผ ๊ฐ์
err_sys("lseek error");
if (write(fd, buf, 100) != 100)
err_sys("write error");
โ process A๊ฐ ํ์ผ์ ๋์ ์๊ณ ์ถ์ด์ lseek ํจ์๋ฅผ ์ A์ ๊ธธ์ด 1500์ด๋ผ ๊ฐ์
โ process B๋ ๊ธธ์ด๊ฐ 1500์ธ๋ฐ, A๋ณด๋ค ๋จผ์ ์ํ์ด ๋จ
โ B๋ 100๊ฐ๋ฅผ ๋ ์, B์ file descriptor๋ 1600์ ๊ฐ๋ฆฌํค๊ฒ ๋จ
โ A๊ฐ write๋ฅผ ์ํํ๋ฉด A๋ B๊ฐ ์ด ๊ฒ์ overwriteํ๊ฒ ๋จ
์ด๋ฐ ์ํฉ์์ race condition ์ด ๋ฐ์ํ๋ค๊ณ ํจ
โ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ํ์ผ์ ํฌ์ธํ ํ๊ณ ์๋ ๊ฒฝ์ฐ์ atomic operation์ ๋ณด์ฅํด์ผํจ
โ ์์์ฑ์ ๋ณดํธํ๊ธฐ ์ํด write ํจ์๋ฅผ ์ธ ๋ O_APPEND๋ฅผ ์จ์ผ๋จ
๐ atomic operation์ ๋ณด์ฅํ๋ ํจ์
โ pread, pwrite
- pread : lseek์ ํ๊ณ read ํจ, ํ์ผ์ ๋์ ๊ฒ์ํ ๋ค์ ์ฝ์ด์ด
- pwrite : ๋์ผ๋ก ์ฎ๊ฒจ๊ฐ ๋ค์์ ์
โ race condition์ฒ๋ผ ์๋ก ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐฐ์ ํ๊ฒ ๋ค.
๐ sync
- :w ํ๋ฉด ์ ์ฅ์ด ๋๋๋ฐ ๋ด์ฉ๋ง ๋์คํฌ์ ์ ์ฅ์ด ๋๋ ๊ฒ, ํ์ผ์ ์ ๋ณด ์ ์ฅ์ ์ปค๋์ด ํ๋ ์ผ
- ๋์คํฌ์ ์ ์ฅํ ๋ i-node์ ๊ดํ ์ ๋ณด๊น์ง ์ ์ฅ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ํจ์
fsync
- sync์ ๊ฐ์ ์ญํ
fdatasync
- data๊ฐ ์ ์ฅ๋๋ ๊ฒ๊น์ง๋ง ๊ธฐ๋ค๋ฆผ (i-node๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฑด ์๋)
๐ fcntl
- ํ์ผ์ ์์ฑ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋ ์ฐ๋ ํจ์
- file control
๐ /dev/fd
dev : ์ฐ๋ถํฌ๋ ๋ฆฌ๋ ์ค์์ ์ต์์ directory๋ โ / โ ,
๊ทธ ์ต์์ ๋๋ ํ ๋ฆฌ ๋ฐ๋ก ๋ฐ์ โ dev โ(device)๊ฐ ์์,
๊ทธ ์์ โ fd โ(file descriptor)๋ผ๋ ๋๋ ํ ๋ฆฌ๊ฐ ์์
fd 0,1,2๋ ๊ณ ์ , ์ฌ์ฉ์๊ฐ ๋ชป์
๊ทผ๋ฐ ์ด๊ฑธ ์ฐ๊ฑฐ๋ ๋ณต์ฌํ๊ณ ์ถ์ผ๋ฉด ๋ณต์ฌํด์ ์
3๋ฒ์ผ๋ก ํ์ค์ ๋ ฅ์ ํ๋ ค๋ฉด /dev/fd์ ์๋ 0์ ์ฐ๋ค.
๊ทธ๋ฌ๋ฉด 0๋ฒ์ด ์๋ 3๋ฒ(์ ์ผ ์์ ์์๊ฐ)์ผ๋ก ํ์ค์ ๋ ฅ์ด ์๊น
(๋จ๋ตํ)ํ์ค์ ๋ ฅ/ํ์ค์ถ๋ ฅ/ํ์ค์๋ฌ๋ฅผ ๋ณต์ฌํ์ฌ ๋ค๋ฅธ ํ์ผ๋์คํฌ๋ฆฝํฐ๋ก ํ ๋น๋ฐ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ ํจ์๋ ๋ฌด์์ธ๊ฐ?
โ open ๋๋ dup