read()์ write() ํจ์๋ unistd.h ํค๋ ํ์ผ์ ์ ์๋์ด ์๋ค.
ํ์ค์ ๋ ฅ(0), ํ์ค์ถ๋ ฅ(1), ํ์ค์๋ฌ(2)์ ๊ฐ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฌ์ฉํด ๋ค์ํ ์ ์ถ๋ ฅ ์์ ์ ์ํํ ์ ์๋ค.
read() ํจ์
read() ํจ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ C ์ธ์ด์ ์์คํ
ํธ์ถ ํจ์์ด๋ค.
ssize_t read(int fd, void *buf, size_t count);
- fd: ์ฝ์ ๋์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ
- buf: ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฒํผ
- count: ์ฝ์ ๋ฐ์ดํธ ์
์ฑ๊ณตํ๋ฉด ์ฝ์ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๊ณ , ์คํจํ๋ฉด -1์ ๋ฐํํ๋ค.
write() ํจ์
write() ํจ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ C ์ธ์ด์ ์์คํ
ํธ์ถ ํจ์์ด๋ค.
ssize_t write(int fd, const void *buf, size_t count);
- fd: ์ธ ๋์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ
- buf: ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ฒํผ
- count: ์ธ ๋ฐ์ดํธ ์
์ฑ๊ณตํ๋ฉด ์ด ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๊ณ , ์คํจํ๋ฉด -1์ ๋ฐํํ๋ค.
์ฌ์ฉ ์์
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
int main(void) {
int fd;
char buf[30];
fd = open("test.txt", O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
ssize_t bytesRead = read(fd, buf, sizeof(buf) - 1);
if (bytesRead == -1) {
perror("read");
close(fd);
return 1;
}
buf[bytesRead] = '\0'; // ๋ฌธ์์ด ์ข
๋ฃ ๋ฌธ์ ์ถ๊ฐ
write(STDOUT_FILENO, buf, bytesRead);
close(fd);
return 0;
}
test.txt ํ์ผ์ ์ด๊ณ , ์ต๋ 29๋ฐ์ดํธ๋ฅผ ์ฝ์ด์์ buf์ ์ ์ฅํ ํ, ํ์ค์ถ๋ ฅ(STDOUT_FILENO)์ ํตํด ์ถ๋ ฅํ๋ค.
count ์ธ์
read() ํจ์์์ ๋ง์ง๋ง ์ธ์์ธ count๋ ํ ๋ฒ์ ์ฝ์ ์ ์๋ ์ต๋ ๋ฐ์ดํธ ์๋ฅผ ์๋ฏธํ๋ค.
์ค์ ๋ก count ๋ฐ์ดํธ๋ฅผ ๋ค ์ฝ์ ์๋, ๊ทธ๋ณด๋ค ์ ๊ฒ ์ฝ์ ์๋, ์์ ๋ชป ์ฝ๊ณ -1 (์๋ฌ) ๋ฅผ ๋ฐํํ ์๋ ์๋ค.
์์
char buffer[10];
ssize_t n = read(fd, buffer, 10);
- ์ต๋ 10๋ฐ์ดํธ๋ฅผ ์ฝ๊ณ , ๊ทธ๊ฑธ
buffer์ ์ ์ฅํ๋ค. - ๋ง์ฝ ์ฝ์ ๊ฒ
"hi\n"์๋ค๋ฉดn == 3 - ๋๋จธ์ง 7๋ฐ์ดํธ๋ ์ ์ฑ์์ง๋ค. (์์ ํ๊ฒ ์ฐ๋ ค๋ฉด
buffer[n] = '\0';ํ์)
๋ ์ฝํ๋ ๊ฒฝ์ฐ
| ์ํฉ | ๊ฒฐ๊ณผ |
|---|---|
| EOF ๋๋ฌ | 0 ๋ฐ์ดํธ ๋ฐํ |
ํ์ผ์ ๋จ์ ๋ฐ์ดํฐ๊ฐ count๋ณด๋ค ์ ์ |
์ผ๋ถ๋ง ์ฝํ |
| ์์ผ/ํ์ดํ์ฒ๋ผ ๋น๋๊ธฐ ์คํธ๋ฆผ | ์ค๋น๋ ๋งํผ๋ง ์ฝํ |
| ์๋ฌ ๋ฐ์ | -1 ๋ฐํ |
์ฆ, count๋ ์ต๋๋ก ์๋ํ ์ฝ๊ธฐ ํฌ๊ธฐ์ผ ๋ฟ, ์ค์ ๋ก๋ ๊ทธ ์ดํ์ผ ์ ์์ผ๋ฏ๋ก,
ํญ์ ๋ฐํ๊ฐ ssize_t๋ฅผ ํ์ธํด์ ์ค์ ๋ก ๋ช ๋ฐ์ดํธ ์ฝ์๋์ง ํ์ธํด์ผ ํ๋ค.
ssize_t๋ฅผ ์ฐ๋ ์ด์
read() ํจ์์ ๋ฐํ๊ฐ์ ์๋์ ๊ฐ๋ค.
- ์์ N: ์ค์ ๋ก ์ฝ์ ๋ฐ์ดํธ ์ (1 ~ count)
- 0: EOF (ํ์ผ ๋)
- -1: ์ฝ๊ธฐ ์คํจ (์๋ฌ ๋ฐ์)
์์์ 0์ ๊ฒฝ์ฐ int, size_t, ssize_t ๊ฐ ์ ๋ถ ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง -1์ ๊ฒฝ์ฐ, ์์์ด๋ฏ๋ก unsigned์ธ size_t๋ก๋ ํํ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋์ ssize_t๊ฐ ํ์ํ๋ค.
'๐โโ๏ธ Activities > 42 Cursus' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Born2beroot] ํ๋ก์ ํธ ๊ฐ์ (0) | 2025.06.22 |
|---|---|
| [C] Memory Leak (3) | 2025.06.04 |
| [get_next_line][C] static ํจ์ & ๋ณ์ (0) | 2025.06.04 |
| [get_next_line][C] open ํจ์ (0) | 2025.06.04 |
| [get_next_line][C] ํ์ผ ๋์คํฌ๋ฆฝํฐ(File Descriptor) (0) | 2025.06.02 |