#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd;
char str[] = "write test";
fd = open("test.txt", O_RDWR | O_CREAT, 0644);
write(fd, str, sizeof(str));
close(fd);
return 0;
}
๋ฌด์์ ํ๋ ์ฝ๋์ธ๊ฐ?
- open("test.txt", O_RDWR | O_CREAT, 0644)
- ํ์ฌ ๋๋ ํฐ๋ฆฌ์ test.txt๋ฅผ “์ฝ๊ธฐ+์ฐ๊ธฐ” ๋ชจ๋๋ก ์ฝ๋๋ค. ํ์ผ์ด ์์ผ๋ฉด ํผ๋ฏธ์ 0644(์์ ์ ์ฝ๊ธฐ/์ฐ๊ธฐ, ๊ทธ๋ฃน/๊ธฐํ ์ฝ๊ธฐ)๋ก ์์ฑํฉ๋๋ค. ์ค์ ๊ถํ์ umask์ ์ํฅ์ ๋ฐ์ ์กฐ๊ธ ๋ฌ๋ผ์ง ์ ์์ด์.
- write(fd, str, sizeof(str))
- ํ์ผ ๋์คํฌ๋ฆฝํฐ fd์ "write test"๋ฅผ ์๋๋ค.
- ์ฃผ์: sizeof(str)๋ ๋ฌธ์์ด ๊ธธ์ด(10) + ๋ ์ข ๋ฃ๋ฌธ์ '\0'(1)์ ํฉ์น 11์ ๋ฐํํฉ๋๋ค. ๊ทธ๋์ ํ์ผ์ ๋์ ๋ ๋ฐ์ดํธ๊ฐ 1๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค. ์ผ๋ฐ ํ ์คํธ ํ์ผ์ด๋ผ๋ฉด ๋ณดํต strlen(str)๋งํผ(๋ ์ ์ธ) ์ฐ๋ ๊ฒ์ด ๊ด๋ก์ ๋๋ค.
- close(fd)
- ํ์ผ์ ๋ซ์ต๋๋ค.
์ฆ, test.txt๋ฅผ ๋ง๋ค๊ณ "write test"๋ฅผ ๊ธฐ๋กํ ๋ค ๋ซ๋ ๊ฐ๋จํ ์์ ์ ๋๋ค.
๋ค๋ง ์ฝ๊ธฐ๋ ํ์ง ์์ผ๋ O_RDWR ๋์ O_WRONLY๊ฐ ๋ ์๋ง์ต๋๋ค.
๋ํ ๋ถ๋ถ ๊ธฐ๋ก/์๊ทธ๋ ์ธํฐ๋ฝํธ, ์ค๋ฅ ๋ฑ์ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค.
์๋ฌ ์ฒ๋ฆฌ์ ๋ชจ๋ฒ ์ฌ์ฉ์ ๋ฃ์ด ๋ค์ ์์ฑ
- ์ด๊ธฐ ์คํจ ์ ์ฒ๋ฆฌ
- O_WRONLY | O_CREAT | O_TRUNC๋ก “์ฐ๊ธฐ ์ ์ฉ + ์์ผ๋ฉด ์์ฑ + ๊ธฐ์กด ๋ด์ฉ์ ์ง์”
- strlen์ผ๋ก ๋ ์ ์ธ ๊ธธ์ด ์ฌ์ฉ
- write๊ฐ ๋ถ๋ถ์ ์ผ๋ก๋ง ์ฐ๋ ๊ฒฝ์ฐ๋ฅผ ๋ฃจํ๋ก ์ฒ๋ฆฌ
- EINTR(์๊ทธ๋ ์ธํฐ๋ฝํธ) ์ฌ์๋
- close ์คํจ ํ์ธ
- ํ์ํ ํค๋(errno.h, stdio.h, string.h) ์ถ๊ฐ
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
const char *path = "test.txt";
const char msg[] = "write test";
size_t len = strlen(msg);
/* ํ์ผ ์ด๊ธฐ: ์ฐ๊ธฐ ์ ์ฉ, ์์ผ๋ฉด ์์ฑ, ๊ธฐ์กด ๋ด์ฉ์ ๋น์ */
int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
perror("open");
return 1;
}
/* ์์ ํ๊ฒ ๋ชจ๋ ์ธ ๋๊น์ง ๋ฐ๋ณต */
size_t total = 0;
while (total < len) {
ssize_t n = write(fd, msg + total, len - total);
if (n == -1) {
if (errno == EINTR) continue; // ์๊ทธ๋๋ก ๋๊ธฐ๋ฉด ์ฌ์๋
perror("write");
close(fd); // ๋ซ๊ธฐ ์๋ ํ ์ข
๋ฃ
return 1;
}
total += (size_t)n;
}
/* (์ ํ) ๋์คํฌ์ ๊ฐ์ ํ๋ฌ์ํ๊ณ ์ถ๋ค๋ฉด fsync(fd); */
if (close(fd) == -1) {
perror("close");
return 1;
}
return 0;
}
์ถ๊ฐ ์ค๋ช
- ๊ถํ 0644: rw-r--r-- ์๋ฏธ์ ๋๋ค. ๋จ, ์ค์ ์ ์ฉ์ umask์ ์ํด ์ ํ๋ฉ๋๋ค(์: umask 022๋ฉด ๊ทธ๋๋ก 0644).
- O_TRUNC vs O_APPEND
- ๊ธฐ์กด ๋ด์ฉ์ ์ง์ฐ๊ณ ์๋ก ์ฐ๋ ค๋ฉด O_TRUNC.
- ๊ธฐ์กด ๋์ ๋ง๋ถ์ด๋ ค๋ฉด O_APPEND.
- ์ปดํ์ผ ์์
gcc -Wall -Wextra -O2 write_test.c -o write_test
./write_test # ์คํ ํ ํ์ฌ ํด๋์ test.txt ์์ฑ
๋ ๋ฐ์ดํธ ๋ฌธ์ : ์๋ณธ์ฒ๋ผ sizeof(str)๋ฅผ ์ฐ๋ฉด ํ์ผ ๋์ '\0'๊ฐ ๋ค์ด๊ฐ๋๋ค. ๋ณดํต ํ ์คํธ ํ์ผ์๋ ๋ถํ์ํ๋ strlen์ ์ฐ๋ ๊ฒ ์ข์ต๋๋ค.
1) ํค๋๋ค(์ ํ์ํ๊ฐ)
- <sys/types.h>, <sys/stat.h>, <fcntl.h>: open, ํ์ผ ๊ถํ/ํ๋๊ทธ ์ ์.
- <unistd.h>: write, close, fsync ๊ฐ์ POSIX ํจ์.
- <errno.h>: ์์คํ ํธ์ถ ์คํจ ์ ์๋ฌ์ฝ๋(errno) ํ์ธ.
- <stdio.h>: perror๋ก ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ.
- <string.h>: strlen ์ฌ์ฉ(๋ฌธ์์ด ๊ธธ์ด ๊ณ์ฐ).
2) ๋ฐ์ดํฐ ์ค๋น
const char *path = "test.txt";
const char msg[] = "write test";
size_t len = strlen(msg);
- msg๋ ํ์ผ์ ์ธ ๋ด์ฉ.
- strlen(msg)๋ ๋ ๋ฌธ์('\0') ์ ์ธ ๊ธธ์ด.
→ ํ ์คํธ ํ์ผ ๋์ ์ธ๋ฐ์๋ ๋ ๋ฐ์ดํธ๊ฐ ๋ค์ด๊ฐ์ง ์๊ฒ ํ๋ ค๋ ์๋.
(์๋ ์ฝ๋์ sizeof(str)๋ ๋๊น์ง ์จ์ 1๋ฐ์ดํธ ๋ ๊ธฐ๋ก๋จ.)
3) ํ์ผ ์ด๊ธฐ(ํต์ฌ ํ๋๊ทธ ์ค๋ช )
int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
- O_WRONLY: ์ฐ๊ธฐ ์ ์ฉ(์ฝ์ง๋ ์์ผ๋๊น O_RDWR ๋ถํ์).
- O_CREAT: ํ์ผ์ด ์์ผ๋ฉด ์๋ก ๋ง๋ฆ.
- O_TRUNC: ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด ๋ด์ฉ์ ๋น์ฐ๊ณ ์๋ก ์(๊ธธ์ด๋ฅผ 0์ผ๋ก).
- ๊ธฐ์กด ๋ด์ฉ ๋ค์ ๋ง๋ถ์ด๊ณ ์ถ๋ค๋ฉด O_TRUNC ๋์ O_APPEND ์ฌ์ฉ.
- 0644: ์์ฑ ์ ๊ถํ(์์ ์ ์ฝ๊ธฐ·์ฐ๊ธฐ, ๊ทธ๋ฃน/๊ธฐํ ์ฝ๊ธฐ). ์ค์ ๋ก๋ umask์ ์ํด ์ ํ๋ ์ ์์.
์ด๊ธฐ ์คํจ ์ฒ๋ฆฌ
if (fd == -1) { perror("open"); return 1; }
- ์์คํ ํธ์ถ์ ์คํจ ์ -1์ ๋ฐํ. perror๋ errno์ ๋ง๋ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅ(์: ๊ถํ ๊ฑฐ๋ถ, ๋๋ ํฐ๋ฆฌ ์์ ๋ฑ).
4) ์์ ํ ์ฐ๊ธฐ ๋ฃจํ(์ ๋ฃจํ๊ฐ ํ์ํ๊ฐ)
size_t total = 0;
while (total < len) {
ssize_t n = write(fd, msg + total, len - total);
...
total += (size_t)n;
}
- write๋ ์์ฒญํ ๋ฐ์ดํธ๋ฅผ ํ ๋ฒ์ ๋ชจ๋ ์ฐ์ง ์์ ์ ์์(partial write).
- ํ์ดํ, ์์ผ, ํ์ผ์ด ๋น๋๊ธฐ/๋คํธ์ํฌ/ํน์ ํ์ผ์์คํ ์ผ ๋ ํนํ ๊ฐ๋ฅ.
- ์ผ๋ฐ ํ์ผ์ด๋ผ๋ ์๊ทธ๋ ์ธํฐ๋ฝํธ, ๋ฆฌ์์ค ์ํฉ์ ๋ฐ๋ผ ๋ถ๋ถ ์ฐ๊ธฐ๊ฐ ๋ฐ์ํ ์ ์์ด์.
- ๊ทธ๋์ “์ง๊ธ๊น์ง ์ด ๊ธธ์ด”(total)๋ฅผ ์ถ์ ํ๋ฉฐ ๋จ์ ๋งํผ ๊ณ์ ์๋.
์ฐ๊ธฐ ์คํจ ์ผ์ด์ค ์ฒ๋ฆฌ
if (n == -1) {
if (errno == EINTR) continue; // ์๊ทธ๋์ ์ํด ์ค๋จ → ๋ค์ ์๋
perror("write");
close(fd);
return 1;
}
- EINTR: ํจ์๊ฐ ์๊ทธ๋์ ์ํด ์ค๋จ๋ ๊ฒ—์ฌ์๋ํ๋ฉด ๋จ.
- ๊ทธ ์ธ ์๋ฌ(๋์คํฌ ๊ฝ ์ฐธ, ๊ถํ ๋ฌธ์ , I/O ์ค๋ฅ ๋ฑ)๋ ๋ฉ์์ง ์ถ๋ ฅ ํ ์ข ๋ฃ.
- ์คํจํ๋๋ผ๋ close๋ ์๋ํด์ ์ปค๋ ๋ฆฌ์์ค๋ฅผ ํ์.
5) (์ ํ) ๋์คํฌ ๊ฐ์ ๊ธฐ๋ก
- ํ์ผ์์คํ
์บ์์๋ง ์๊ณ ๋์คํฌ์ ์์ง ์ ๋ด๋ ค๊ฐ์ ์ ์์.
์ค์ํ ๋ก๊ทธ/๊ฑฐ๋ ๊ธฐ๋ก์ด๋ฉด fsync๋ก ์์์ฑ ๋ณด์ฅ.
6) ๋ซ๊ธฐ์ ์๋ฌ ํ์ธ
if (close(fd) == -1) {
perror("close");
return 1;
}
- close๋ ์คํจํ ์ ์์(๋คํธ์ํฌ ํ์ผ์์คํ
์ง์ฐ๋ ์ค๋ฅ ๋ฑ).
๋ซ๊ธฐ ์คํจ๋ ๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ์ ์จ์ก์ ์ํ์ ์๋ฏธํ ์ ์์ผ๋ฏ๋ก ์ฒดํฌ.
์คํ ๊ฒฐ๊ณผ๋ ์ด๋ป๊ฒ ๋๋?
- ํ์ฌ ๋๋ ํฐ๋ฆฌ์ test.txt๊ฐ ์๊ธฐ๊ณ , ํ์ผ ๋ด์ฉ์ ์ ํํ:
(๋ ๋ฌธ์๋ ์์)
์์ฃผ ํท๊ฐ๋ฆฌ๋ ํฌ์ธํธ ์์ฝ
- sizeof("write test") = 11 (๋ฌธ์ 10 + ๋ 1)
strlen("write test") = 10 (๋ ์ ์ธ) → ํ ์คํธ ํ์ผ์ ๋ณดํต ์ด๊ฑธ ์ฌ์ฉ. - ์๋ก ์ฐ๊ธฐ: O_TRUNC / ์ด์ด ์ฐ๊ธฐ: O_APPEND.
- ์ฝ์ง ์์ผ๋ฉด O_WRONLY๊ฐ ์ ์ .
- ์์คํ ํธ์ถ์ ํญ์ ๋ฐํ๊ฐ ์ฒดํฌ(ํนํ open, write, close).
์ปดํ์ผ/์คํ ์
gcc -Wall -Wextra -O2 write_test.c -o write_test
./write_test
cat test.txt # → write test
ls -l test.txt # → ๊ถํ์ด ๋๋ต -rw-r--r-- (umask์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์)
ChatGPT์ ๋ง:
์ข์, ์ด ๋ถ๋ถ์ ์ปดํ์ผ ์ต์
์ ๋ํ ์ด์ผ๊ธฐ์ผ ๐
์ฝ๋ ์คํ์๋ ๊ผญ ํ์ํ์ง๋ ์์ง๋ง, **“์ข์ ์ต๊ด”**์ด๋ผ ์์ฃผ ์.
ํ๋์ฉ ํ์ด์ ๋ณผ๊ฒ ๐
๐งฉ -Wall
๋ป: “๋ชจ๋ ๊ฒฝ๊ณ (Warning All)”
โก๏ธ ๊ฐ๋ฅํ ๋ชจ๋ ์ปดํ์ผ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ผ๋ ๋ป์ด์ผ.
์๋ฅผ ๋ค์ด
์ด๋ฐ ์ฝ๋๊ฐ ์์ผ๋ฉด,
gcc main.c ๋ก๋ ์กฐ์ฉํ ๋์ด๊ฐ์ง๋ง
gcc -Wall main.c ๋ก ํ๋ฉด
warning: 'a' is used uninitialized in this function
์ด๋ฐ ๊ฒฝ๊ณ ๊ฐ ๋จ์ง!
๐ ์ฆ, ์ค์๋ฅผ ๋ฏธ๋ฆฌ ์ก์์ค์ ๋ฒ๊ทธ ์๋ฐฉ์ ๋์๋ผ.
๐งฉ -Wextra
๋ป: “์ถ๊ฐ ๊ฒฝ๊ณ (Warning Extra)”
โก๏ธ -Wall์ด ์ก์ง ๋ชปํ๋ ์กฐ๊ธ ๋ ์ธ๋ฐํ ๊ฒฝ๊ณ ๋ค๊น์ง ํ์ํด ์ค.
์๋ฅผ ๋ค์ด ํจ์ ์ธ์ ๊ฐ์๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ๋,
์กฐ๊ฑด๋ฌธ ์์์ ๋ถ์ฃผ์ํ๊ฒ ๋ณ์ ๋น๊ตํ ๋ ๋ฑ๋ฑ.
๐ก ์ฆ,
-Wall = ๊ธฐ๋ณธ์ ์ธ ๊ฒฝ๊ณ
-Wextra = ์ธ์ธํ ๊ฒฝ๊ณ ๊น์ง
โก -O2
๋ป: “์ต์ ํ ๋ ๋ฒจ 2” (Optimization level 2)
โก๏ธ ์ปดํ์ผ๋ฌ์๊ฒ “์คํ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ต์ ํํด์ค” ๋ผ๋ ์ง์์ผ.
- -O0 : (๊ธฐ๋ณธ) ์ต์ ํ ์ ํจ → ๋๋ฒ๊น ์ ์ ๋ฆฌ
- -O1 : ๊ฐ๋ฒผ์ด ์ต์ ํ
- -O2 : ๋๋ถ๋ถ์ ์ํฉ์์ ์ข์ ์ฑ๋ฅ๊ณผ ์์ ์ฑ
- -O3 : ๊ณต๊ฒฉ์ ์ธ ์ต์ ํ (๋งค์ฐ ๋น ๋ฅด์ง๋ง ์ฝ๋๊ฐ ์ปค์ง ์ ์์)
๊ทธ๋์ ๋ณดํต ๊ฐ๋ฐ ์ค์
- ๋๋ฒ๊น ํ ๋ -O0 (๋ผ์ธ๋ฒํธ ๊ทธ๋๋ก ์ ์ง๋จ)
- ์์ฑ ํ ๋ฐฐํฌ์ฉ์ผ๋ก๋ -O2
โ ๊ฒฐ๋ก
| -Wall | ์ผ๋ฐ ๊ฒฝ๊ณ ์ ๋ถ ์ผ๊ธฐ | โ(ํ์ ์๋) | โ ๋งค์ฐ ์ถ์ฒ |
| -Wextra | ์ถ๊ฐ ๊ฒฝ๊ณ ์ผ๊ธฐ | โ | โ ์ถ์ฒ |
| -O2 | ์คํ ์๋ ์ต์ ํ | โ | โ ์ถ์ฒ (์์ฑ ํ) |
๐ฌ ์ ๋ฆฌํ๋ฉด
"ํ์๋ ์๋์ง๋ง, ๊ฐ๋ฐํ ๋ ํญ์ -Wall -Wextra -O2๋ฅผ ๋ถ์ด๋ ๊ฑด ์ข์ ์ต๊ด"
๐ ์ค์ ๋ฏธ๋ฆฌ ์ก๊ณ , ์คํ ์๋๋ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด์ค.

'6. CS ๊ธฐ์ด ๐ > Linux & Unix ๐ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Linux/Unix][6-3] ํฉ&ํ๊ท ์ถ๋ ฅ ํ๋ก๊ทธ๋จ (0) | 2025.10.21 |
|---|---|
| [Linux/Unix][6-2] $ ./2 test.txt test.bak (0) | 2025.10.21 |
| [Linux/Unix][5-2] ํ๋ ๋งํฌ vs ์ฌ๋ณผ๋ฆญ ๋งํฌ (0) | 2025.10.21 |
| [Linux/Unix][5-1] stat ๊ตฌ์กฐ์ฒด์ ๋ฉค๋ฒ // st_mode (0) | 2025.10.21 |
| [Linux/Unix][4-3] Inode ์ ๋ณด ์ถ๋ ฅ (0) | 2025.10.21 |