ํฐ์คํ ๋ฆฌ ๋ทฐ
728x90
๋ฐ์ํ
High-level API
struct info
{
char ch[10];
int digit;
};
int write_info(struct info *i)
{
FILE *fp = NULL;
if (!(fp = fopen("/test", "w")))
return -1;
if (fwrite(i, sizeof(struct info), 1 fp) != 1) {
fclose(fp);
return -1;
}
fclose(fp);
return 0;
}
int read_info()
{
FILE *fp;
struct info i;
if (!(fp = fopen("/test", "r")))
return -1;
if (fread(i, sizeof(struct info), 1) != 1) {
fclose(fp);
return -1;
}
fclose(fp);
printf("%s, %d\n", i.ch, i.digit);
}
์๋ ํ์ผ์ ์ฝ๊ณ ์ฐ๊ธฐ ์ํ ๊ฐ๋จํ ์์ ์ด๋ค.
- ํ์ผ์ ์ฝ๊ณ ์ฐ๊ธฐ ์ํด์๋ ๋ผ์ธ 15, 33๊ณผ ๊ฐ์ด fopen์ ํตํด ์ฝ๊ฑฐ๋ ์ธ ์ ์๋ FILE ํฌ์ธํฐ๋ฅผ ์์ฑํ์ฌ์ผ ํ๋ค.
- ํ์ผ์ ์ฐ๊ณ ์ฝ์ ๋๋ Text, Binary ๋ชจ๋๋ก ๋๋๊ฒ ๋๋ค.
- ์๋์ฐ์ ๊ฒฝ์ฐ ํจ์์ ์ด์ ๊ฐ์ ๊ฒ์ ๋ช ์์ ์ผ๋ก ๊ตฌ๋ถํ์ง๋ง ๋ฆฌ๋ ์ค๋ ํจ์์ ๋ฐ๋ผ ๊ตฌ๋ถ๋๋ค.
- Text ๋ชจ๋
- Read : fgetc, fgets, fscanf
- Write : fputc, fputs, fprintf
- Binary ๋ชจ๋
- fread, fwrite
- fopen์ ํตํด FILE ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์๋ค๋ฉด, ์ฌ์ฉ ํ fclose๋ฅผ ํตํด ์ฒ๋ฆฌํด์ฃผ์ด์ผ ํ๋ค.
- fclose๋ฅผ ํ์ง ์์ ์ํ์์ fopen์ ํ์ฌ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๊ฐ์ด ๊ธฐ๋ก๋์ง ์๊ฑฐ๋, ์ด์ํ ๊ฐ์ด ์ฝํ๋ค.
- ftell, fseek๋ฅผ ์ฌ์ฉํ์ฌ, ํ์ผ ํฌ์ง์ ์ ๋ํ ์ฒ๋ฆฌ๋ ๊ฐ๋ฅํ๋ค.
Low-level API
struct info
{
char ch[10];
int digit;
};
int write_data(struct info *i)
{
int fd;
ssize_t ret;
fd = (open("/test", O_CRET | O_WRONLY | O_APPEND, 0644);
if (fd == -1)
return -1;
ret = write(fd, i, sizeof(struct info));
if (ret == -1) {
close(fd);
return -1;
} else if (ret != sizeof(struct info)) {
close(fd);
return -1;
}
close(fd);
return 0;
}
int read_data()
{
int fd;
ssize_t ret;
struct info i;
fd = open("/test", O_RDONLY);
if (fd == -1)
return -1;
ret = write(fd, &i, sizeof(struct info));
if (ret == -1) {
close(fd);
return -1;
} else if (ret != sizeof(struct info)) {
close(fd);
return -1;
}
printf("%s %d", i.ch, i.digit);
close(fd);
return 0;
}
High level API์ ๊ฒฝ์ฐ `foepn`์ด๋ผ๋ ํจ์๋ฅผ ํตํด ํ์ผ์ ์ฌ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, Low level API๋ `open`์ด๋ผ๋ ์ ์์ค ํจ์๋ฅผ ํตํด ์ปค๋๋ก ์ํ๋ ๋์์ ์ ๋ฌํ๊ฒ ๋๋ค.
- High level API๋ณด๋ค ๋ค์ํ ์ต์ ์ ์ฌ์ฉํ ์ ์๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
- ํ์ผ์ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋๋๋ค.
- Read
- read, pread
- Write
- write, pwrite, dprintf
- Read
- ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํ์ผ ํฌ์ธํฐ๋ก ๋ณํํ๊ฑฐ๋ ๋ฐ๋์ ์์
๋ ๊ฐ๋ฅํ๋ค.
- fd → fp
- `FILE *fdopen(int fd, const char *mode)`
- fp → fd
- `int fileno(FILE *stream);`
- fd → fp
Memory Mapping
struct info
{
char ch[10];
int digit;
};
int read_data()
{
int fd;
struct stat sp;
struct info *i;
fd = open("/test", O_RDONLY);
if (fd == -1)
return -1;
if (fstat(fd, &sp) == -1) {
close(fd);
return -1;
}
i = mmap(NULL, sp.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (i == MAP_FAILED) {
close(fd);
return -1;
}
close(fd);
return 0;
}
์ผ๋ฐ์ ์ read, write์ ๊ฒฝ์ฐ system call์ ํตํด ์ปค๋๋ก ์ ๋ฌํ๋ ๊ณผ์ ์ด ์ง์์ ์ผ๋ก ํ์ํ๋ค. ๋ฐ๋ผ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ Memory Mapping์ด ๋ณด๋ค ํจ์จ์ ์ผ ์ ์๋ค.
- mmap์ ๋๋ฐ์ด์ค ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋งตํ ํ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
- ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋งตํํ๊ฒ ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ๊ทผํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค.
- ๋ณ๋์ context switch๊ฐ ํ์ํ์ง ์๋ค.
- mmap์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ง์ ํ ์ ์์ง๋ง NULL์ ์ ๋ ฅํ๋ฉด ์ปค๋์ด ์ ์ ํ ์ฃผ์๋ฅผ ํ ๋นํ๋ค.
- open์ ํตํด fd๋ฅผ ๋ฐํ๋ฐ๊ณ , ํ์ผ ํฌ๊ธฐ๋ฅผ ์๊ธฐ ์ํด์๋ fstat๋ฅผ ํตํด ์ ์ ์๋ค.
- ์ปค๋ ๋ ๋ฒจ์์๋ ioremap์ ์ฌ์ฉํ๋ค.
728x90
๋ฐ์ํ
'๐โโ๏ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C: IPC (0) | 2021.06.13 |
---|---|
C: Signal (0) | 2021.06.11 |
C: thread safe and reentrant (0) | 2021.01.26 |
C: Memory Layout of C Programs (0) | 2021.01.26 |
C: Storage class specifier (0) | 2020.11.27 |
๋๊ธ
๊ธ ๋ณด๊ดํจ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ