1. Linux System Calls
๋ฆฌ๋ ์ค์๋ ์๋์ ๊ฐ์ด ๋ค์ํ ์์คํ ์ฝ์ด ์กด์ฌํฉ๋๋ค.
- File descriptor I/O
- open(); close(); creat(); read(); write();
- seek(); // random access
- fcntl(); // for file/record locking
- Process control
- Thread programming
- IPC
- Signal handling
- Memory management
- Synchronization
- Time management
- Network socket API(TCP, UDP)
๊ทธ ์ค File descriptor I/O์ ๋ํด ์์๋ด ๋๋ค.
2. System Calls & Library Calls for File I/O
ํ์ผ๊ณผ ๊ด๋ จ๋ ์์คํ ํ๋ก๊ทธ๋๋ฐ์ ์์คํ ์ฝ์ ํตํ ์์คํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ ํตํ ์์คํ ํ๋ก๊ทธ๋๋ฐ์ด ์์ต๋๋ค.
- System Calls for File descriptor I/O
- open(); close(); creat(); read(); write();
- seek();
- fcntl();
- Library Calls for File I/O
- fopen(); freopen(); fclose(); fread(); fwrite();
- fgetc(); fgetchar(); fputc; putchar(); ....
- fseek(); fprintf(); fsanf(); ...
3. System Calls vs. Library Calls
์์คํ ์ฝ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์์คํ ์ฝ์ ์ด์์ฒด์ ๋ด์ ์กด์ฌํ๋ ์ธํฐํ์ด์ค์ด๊ณ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ ์ด์์ฒด์ ๋ฐ์ ์กด์ฌํ๋ ์ธํฐํ์ด์ค ์ ๋๋ค.
์์คํ ์ฝ์ ์ปค๋์ ๋ด๋ถ์ ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ์ ๊ฐ ์ปค๋์ ์ง์ ํ๋ entry point๊ฐ ๋ฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ ์ปค๋ ๋ฐ์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ ์ ์ ์ฝ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ณ๊ฒฝ์์ผ์ ์ปค๋์ ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ API(application programming interface)๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค.
4. Library
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด๋ ํ๋์ ํ๋ก๊ทธ๋จ์ ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ ๋ถ๋ฅด๋ฉด, ์์คํ ์ฝ์ ํตํด ์์คํ ์ปค๋์ ์๋ ์์คํ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ๋ค์ ํ๋ก๊ทธ๋จํ ์์ผ์ ๋ง๋ค์ด ๋์ object program๋ค์ด ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ค์ฝ๋ ํํ๋ก ์กด์ฌํ์ง ์๊ณ , ์ปดํ์ผ๋ object ํํ๋ก ์กด์ฌํฉ๋๋ค.
e.g. Grapic Lib, Mathematical Lib, etc...
๋ฆฌ๋ ์ค์์ ๊ฐ์ข ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ "/lib" ๋๋ "usr/lib"์ ์กด์ฌํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ ์ ์ ๊ฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค๋ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ API ํจ์๋ค์ ์ ์ ํ๋ก๊ทธ๋จ์ด callํด์ ์ง์ ์คํ์์ผ ์ฃผ๋ ๊ฒ ์ ๋๋ค.
์ค์ ๋ก library function์ ์ ์ ๊ฐ callํ๋ฉด ์ ์ ํ๋ก๊ทธ๋จ์์ ์ฝ์ ํ ๋ link๋์ด์ ๋์ํฉ๋๋ค.
์์ค ํ๋ก๊ทธ๋จ์์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ปดํ์ผ ํ๋ฉด ์คํํ์ผ์ด ๋์ค๊ฒ ๋๋๋ฐ, ์ด ์คํํ์ผ์ ์คํํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ์๋ค์ ๋ถ๋ฌ์ฐ๊ธฐ ์ํด์ linker๋ผ๊ณ ํ๋ ์ปดํ์ผ๋ฌ ์์ ์๋ ๋๊ตฌ๊ฐ library function์ linking์์ผ์ค๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ ๋ง๋๋ก ์ ๋ฆฌํ๋ฉด "์ ์ ๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ๋ค์ ํจ์ํ ์์ผ์ ๋ง๋ค์ด ๋์ ํ๋ก๊ทธ๋จ ๋๋ object" ์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐฉ์์ผ๋ก๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค.
- Shared library (*.so, *.dll)
- ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ -> ํ๋๋ง ๋ง๋ค๊ณ ๊ณต์ ํด์ ์ฌ์ฉ. ์คํ ๋ฃจํด์ด ๋ฉ๋ชจ๋ฆฌ์ ํ๋๋ง ์กด์ฌ
- ํจ์์ ๋ณต์ฌ๋ณธ ํ๋๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋จ. ๊ธฐ๋ฅ์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ์ ๊ณต์ (memory saving)
- ํจ์์ ์ฃผ์๋ ์คํํ๋๋์ resolve๋จ. (dynamic linking or binding)
- dynamic linking์ ์ํ symbol table์ด ๋ฉ๋ชจ๋ฆฌ์ ์์ (memory overhead)
- ๋ง์ ํ๋ก๊ทธ๋จ์ด ๋์์ ๋์๊ฐ ๋ ์ ์ฉํจ
- Static library (*.a)
- ๋์ผํ ๋์์ ํ๋ ์ฝ๋๋ผ๋ ๊ฐ๊ฐ์ ํ๋ก๊ทธ๋จ์ ๋ชจ๋ ๋ ๋ฆฝ์ ์ผ๋ก staticํ๊ฒ ์คํํ์ผ์ ๋ค์ด๊ฐ
- ์ปดํ์ผ ํ ๋, ๊ฐ binary program์ ํ์ํ ํจ์๋ฅผ ๋ํด์ค
- ๋ฐ๋ผ์, ํจ์์ ๋์ผํ ๋ณต์ฌ๋ณธ ๋ช ๊ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํจ(memory overhead)
- embedded systems์์ ์๋๋ฅผ ๋์ด๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉ
- ๋งํฌํ๋ ๋์(jump)์ด ์๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ ๋ ๋น ๋ฅด๊ฒ ์คํ๋จ. but ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ด ๋จ์ด์ง
5. Standard I/O Library
<staio.h>
: (์ผ๋ฐ์ ์ผ๋ก ์ฝ์๊ณผ ํ์ผ์์) standard I/O ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ symbol๊ณผ API๋ฅผ ์ ์ํ๋ ํค๋ํ์ผ
file I/O๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ด ์ ์๋์ด ์์ต๋๋ค.
6. FILE object in C
<stdio.h> ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋์์ด ๋๋ ๊ฐ์ฒด๊ฐ ์์ฑ์ด ๋๋๋ฐ, ๊ทธ ๊ฐ์ฒด๊ฐ I/O stream object์ ๋๋ค.
- ํฌ์ธํฐ FILE* ํํ๋ก ๋๊ฒจ๋ฐ์
- ํ์ผ ์คํธ๋ฆผ ํฌ์ธํฐ๋ open file์ ์ง์ ํ๋๋ฐ ์ฌ์ฉํจ
- ํ์ผ ํฌ์ธํฐ๋ open file์ ๋ํ ์ฌ๋ฌ ์์คํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์
ํน๋ณํ shell์ ๊ฒฝ์ฐ stdio ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ I/O stream์ ํ ์ ์๋ ๊ฐ์ฒด๋ฅผ 3๊ฐ ์ ๊ณตํฉ๋๋ค.
-> stdin, stdout(ํ์ค์ ์ถ๋ ฅ), stderr(ํ์ค ์๋ฌ)
7. File descriptor
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ ๊ฒฝ์ฐ์๋ iostream ๊ฐ์ฒด์ธ FILE*๋ฅผ ์ด์ฉํ๋๋ฐ, ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์์คํ ์ฝ์ ์ด์ฉํ ๊ฒฝ์ฐ FILE* ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ File descriptor๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- open file์ ๋ํ file descriptor๋ ํ๋์ integer ์ซ์์ ๋์ํจ
- descriptors 0, 1, 2๋ ๊ฐ๊ฐ stdin, stdout, stderr์ assign๋จ
- user open file์ ๋ํด, file descriptor๋ 3๋ถํฐ ์ค๋ฆ์ฐจ์์ผ๋ก ํ ๋น๋จ
- ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๋ ์ต๋ 1024๊ฐ์ ํ์ผ์ ์ด ์ ์์
๊ถ๊ทน์ ์ผ๋ก standard I/O library function(FILE* ๊ฐ์ฒด)์ library function์ด ์ค์ ์ปค๋์ ์ ๊ทผํด์ system call์ ๋ถ๋ฅด๋ ๊ฒ์ ๋๋ค. ์๋ฅผ๋ค์ด, printf, fprintf, puts, ... ๋ write()๋ฅผ ๋ถ๋ฌ ์ปค๋์ ์์คํ ์ ์ฌ์ฉํ๊ฒ ํ๋ ๊ฒ ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ Library๋ฅผ ์ฌ์ฉํ ๊น์?
๊ทธ ์ด์ ๋ ์์คํ ์ฝ์ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค ๋ ํธ๋ฆฌํ๊ณ , formatting์ด ์๊ณ , ์ฑ๋ฅ์ ์ธ ์ธก๋ฉด์์๋ user level buffering์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
8. File stream & File Descriptor
file stream์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๊ณ , file descriptor๋ ์์คํ ์ฝ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
์ด๋ 1:1๋ก mapping ๋ฉ๋๋ค.
(๋ํ ํ๋์ ํ๋ก๊ทธ๋จ์์ ๋ ๊ฐ์ง ๋ฐฉ์์ ๋ชจ๋ ์ฌ์ฉํ ์๋ ์์ผ๋ ์ด๋ ๋๋ฌธ ๋ฐฉ์์ ๋๋ค. )
๋ฐ๋ผ์, ์ฐ๋ฆฌ๋ ๋ค์์ ํจ์๋ค์ ์ด์ฉํด ๊ฐ๊ฐ์ ๋์๋๋ ๊ฐ์ฒด๋ฅผ ์ป์ด๋ผ ์ ์์ต๋๋ค.
#include <stdio.h>
int fileno(FILE *stream);
์ด๋ open๋ FILE stream์ ๋ํ file descriptor number์ ๋ฐํํฉ๋๋ค.
#include <stdio.h>
FILE *fdopen(int fildes, const char *mode);
์ด๋ argument๋ก file descriptor number๊ฐ ๋ค์ด๊ฐ๊ณ , ํ์ผ์ ๋ชจ๋(์ฝ๊ธฐ/์ฐ๊ธฐ)๊ฐ ๋ค์ด๊ฐ๋ฉด
์ด์ ๋์๋๋ FILE* ๊ฐ์ฒด(file stream object)๋ฅผ ๋ฐํ๋ฐ์ ์ ์์ต๋๋ค.
9. Library buffering
stdio ๋ผ์ด๋ธ๋ฌ๋ฆฌ (FILE*)๋ฅผ ์ฌ์ฉํ๋ FILE I/O์์๋ library buffering์ด๋ผ๋ ๊ฐ๋ ์ด ์ ์ฉ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ปดํจํฐ ์์คํ ์์ buffer๋, ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋๋ค.
๊ทธ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒํผ๋, ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ธฐ ์ ์ ๊ณต๊ฐ์ ๋ง๋ จํด๋๊ณ ์์๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์ ๋งํฉ๋๋ค.
FILE*๋ฅผ ์ด์ฉํด ํ์ผ์ ์ด์ด์ file์ ๋ฐ์ดํฐ๋ฅผ writeํ ๋, ์ง์ ์ ์ผ๋ก ํ์ผ์ ์ฐ์ง ์๊ณ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์์ ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋๋ฐ
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์์คํ ์ฝ์ ๋ถ๋ฅด๋ ํ์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ file์ ์ฐ๊ธฐ ์ํด์๋ ์ปค๋์ ์ฐ๊ธฐ ์์ฒญ์ ํด์ (์์คํ ์ฝ์ ๋ถ๋ฌ์) ๋ฐ์ดํฐ๋ฅผ ์จ์ผ ํฉ๋๋ค.
์ด ๋ ์์คํ ์ฝ์ ๋ง์ด ๋ถ๋ฅด๋ฉด ์์คํ ๋ถํ๊ฐ ๊ฑธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ๋ฒํผ์ ๋ชจ์์ ์ด๋ฅผ ํ๊บผ๋ฒ์ ์ฐ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
stdio ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฒํผ๋ง์ ํ๋ ๋ฐฉ์์๋ 3๊ฐ์ง๊ฐ ์์ต๋๋ค.
- Full buffering
- lib-level buffer
- disk block๋จ์๋ก ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ก์(multiple KBs... 4KB, 8KB...)
- ์์คํ ์ฝ ํ์๋ฅผ ์๋นํ ์ค์ผ ์ ์์
- ๋ฒํผ๋ฅผ ์ฒด์ฐ์ง ์์ ์ํ์์ ๊ทธ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์จ์ผํ๋ ๊ฒฝ์ฐ, fflush()๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ ํตํด ๋ฒํผ์ ๋ฐ์ดํฐ๊ฐ ์ฒด์์ง์ง ์๋๋ผ๋ ๋์์ ์ํํ ์ ์์
- Line buffering
- shell์ console I/O์์ ์ฃผ๋ก ์ฌ์ฉํจ
- keyboard์ "enter"๊ฐ ๋ค์ด์ฌ ๋ ๊น์ง ํด๋น ๋ฐ์ดํฐ๋ฅผ bufferingํจ
- getchar() problem : enter์ ์น์ง ์๊ณ ์ ๋ ฅํ๊ฒ ๋๋ฉด ๋ฐ์ดํฐ๋ฅผ ์์ด๋ฒ๋ฆด ๊ฐ๋ฅ์ฑ์ด ์์
- full buffering์ ๋นํด ๋ฒํผ์ ํฌ๊ธฐ๊ฐ compactํด์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์์
- Unbuffering
- ๋ฒํผ๋ง์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ์๊ฐ ์์
- ๋ฐ์ดํฐ๋ฅผ ์ธ ๋ ๋ง๋ค(๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ ํ ๋ ๋ง๋ค) ์์คํ ์ฝ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ข์ง ์์
- ํ์ง๋ง ๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ์ฑ์ด ๋ฎ๊ธฐ ๋๋ฌธ์ ์์ ํ๊ฒ ๋ฐ์ดํฐ ์ ์ก ๊ฐ๋ฅ
Linux Library Buffering
- stderr : ํญ์ unbuffering -> ํญ์ reporting๋์ด์ผ ํ๊ธฐ ๋๋ฌธ
- stdin/stdout : line buffering -> console์ ์ถ๋ ฅํ ๋๋ ๋ผ์ธ ๋จ์์ ๋ฒํผ๋ง์ ์ฌ์ฉ
- anything else : full buffering (by default)
10. Set Buffering Type
#include <stdio.h>
//set a buffer address that user provides
void setbuf(FILE *stream, char *buf);
buf : non-NULL address for normal buffering
NULL if unbuffering
return : none
//set a buffer address and buffering type
int setvbuf(FILE *stream, char *buf, int type, size_t size);
buf : same as the above
type : the type of buffering
size : buffer size
return 0 for success, or nonzero for an error
type ๋ณ์์ ๋ค์ด๊ฐ ์ ์๋ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
type | meaning |
_IOFBF | Full buffering |
_IOLBF | Line buffering |
_IONBF | Unbuffering |
11. Kernel Buffering
์ปค๋ ์์ญ์์๋ ์ปค๋ ๋ฒํผ๋ง ๊ฐ๋ ์ ์ฌ์ฉํฉ๋๋ค. ์ ์ ๋ ๋ฒจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ์ ์ด์ฉํ์ ๋์ ๋ฒํผ๋ง๊ณผ๋ ๋ณ๋๋ก, ์ด์์ฒด์ ๋ด์ ์ปค๋์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ ์ฒ๋ฆฌํ๋ ๋ฒํผ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
buffer๊ฐ ํ ๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก ๋ชจ์๋๊ณ ์ ์กํ๋ ๊ฐ๋ ์ด๋ผ๋ฉด,
cach๋ ์ค๊ฐ ๋งค๊ฐ์ฒด ์ญํ ๋ก ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ฐ์ดํฐ์ ์ ๋ฌด๋ฅผ ์ฒดํฌํ๋ ์ญํ ๋ก ๋ฒํผ๋ง์ ๊ธฐ๋ฅ์ ๋์์ ์ํํ ์ ์์ต๋๋ค.
๋ฆฌ๋ ์ค ์ปค๋์๋ page cach๋ผ๋ I/O๋ฅผ ์ํ ๋ฒํผ๊ฐ ์กด์ฌํฉ๋๋ค.
์ฃผ๊ธฐ์ ์ผ๋ก disk์ ๊ฐ์ storage์ data๋ฅผ ์ธ ์ ์์ต๋๋ค.
cach๋ ์ฐ๊ธฐ ๋ฟ๋ง์๋๋ผ ์ฝ๊ธฐ์๋ ์ ์ฉ์ด ๋ฉ๋๋ค. storage์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ๋๋ฉด ๋จผ์ buffer cach์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์จ ๋ค์์ user์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด ์ค๋๋ค.
12. fflush
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒํผ๋ , ์ปค๋ ๋ฒํผ๋ ๋ฒํผ๋ฅผ ํน์ ํ ์๊ธฐ์ ์ค์ ๋งค์ฒด์ ์ฐ๋๋ก ๋์์์ผ์ฃผ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ์์๋ง ์กด์ฌํ๊ฒ ๋๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ค๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐจ์ง ์์ ์ํฉ์์ ์ด๋ฅผ ๊ฐ์ ์ ์ผ๋ก ๋ด๋ ค์ฃผ๊ธฐ ์ํ ๋์์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋๋ฐ, ์ด๋ฐ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด fflush์ ๋๋ค.
fflush๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ฒํผ๋ง ๋ ๋ฐ์ดํฐ๋ฅผ flushํด์ ์ปค๋๋ ๋ฒจ๋ก ๋ด๋ ค์ค๋๋ค.
#include <stdio.h>
int fflush(FILE *stream);
return 0 for normal
EOF for error
line buffering์ ์ฌ์ฉํ๋ printf์ ๊ฒฝ์ฐ, system console์๋ ๊ทธ๋๋ก ์ถ๋ ฅ๋ ์ ์์ง๋ง ์ด๋ฅผ file์ ์ฐ๋ ค๊ณ ํ๋ฉด(fprintf) ๋ฒํผ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฒํผ์๋ง ์กด์ฌํ์ฌ ํ์ผ์ ์จ์ง์ง ์์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ fflush()๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
printf("something");
fflush(stdout);
block device๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, (e.g. disk)
user level์ ์๋ ๋ฒํผ๋ฅผ fflush๋ฅผ ์ด์ฉํด ์จ์ฃผ๋๋ผ ํ๋๋ผ๋ ์ปค๋๋ ๋ฒจ๊น์ง๋ง ๋ด๋ ค๊ฐ๋๋ค. ๋ฐ๋ผ์ ์ปค๋์ page cach์ ๋ฐ์ดํฐ๊ฐ ์จ์ง๋๋ค. ์ค์ ์ ์ผ๋ก ์ด ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ์ฐ๋ ค๋ฉด storage device์ ๋ฐ์ดํฐ๊ฐ ์จ์ ธ์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ปค๋ level์ ๋ฐ์ดํฐ๋ฅผ disk๋ก ์์ ํ ๋ด๋ ค์ฃผ๊ธฐ ์ํด์๋ sync()๋ผ๋ ์์คํ ์ฝ์ ๋ถ๋ฌ์ค์ผํฉ๋๋ค.
13. I/O buffering & Sync
'๐SUBJECT > ๐์์คํ ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์์คํ ํ๋ก๊ทธ๋๋ฐ/Linux] 10. Signal Timer(1) (0) | 2020.05.23 |
---|---|
[์์คํ ํ๋ก๊ทธ๋๋ฐ/Linux] 10. POSIX-semaphore (0) | 2020.05.23 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ/Linux] 1-3. Linux Shell & Basic Commands (0) | 2020.05.05 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ/Linux] 1. Introduction (2) | 2020.04.24 |
๋๊ธ