fmemopen(3) - wariua/manpages-ko GitHub Wiki
fmemopen - ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์คํธ๋ฆผ์ผ๋ก ์ด๊ธฐ
#include <stdio.h>
FILE *fmemopen(void *buf, size_t size, const char *mode);
glibc ๊ธฐ๋ฅ ํ์ธ ๋งคํฌ๋ก ์๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):
-
fmemopen()
: -
- glibc 2.10๋ถํฐ:
_POSIX_C_SOURCE >= 200809L
- glibc 2.10 ์ :
_GNU_SOURCE
fmemopen()
ํจ์๋ mode
๋ก ์ง์ ํ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ ์ ์๋ ์คํธ๋ฆผ์ ์ฐ๋ค. ๊ทธ ์คํธ๋ฆผ์ ํตํด buf
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์์ด ๋ด์ง ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ์ I/O๋ฅผ ์ํํ ์ ์๋ค.
mode
์ธ์๋ ์คํธ๋ฆผ I/O์ ๋์ ๋ฐฉ์์ ๋ํ๋ด๋ฉฐ ๋ค์ ์ค ํ๋์ด๋ค.
r
- ์คํธ๋ฆผ์ ์ฝ๊ธฐ์ฉ์ผ๋ก ์ฐ๋ค.
w
- ์คํธ๋ฆผ์ ์ฐ๊ธฐ์ฉ์ผ๋ก ์ฐ๋ค.
a
- ๋ง๋ถ์ด๊ธฐ. ์คํธ๋ฆผ์ ์ฐ๊ธฐ์ฉ์ผ๋ก ์ด๊ณ ์ด๊ธฐ ๋ฒํผ ์์น๋ฅผ ์ฒซ ๋ ๋ฐ์ดํธ ์์น๋ก ์ค์ ํ๋ค.
r+
- ์คํธ๋ฆผ์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ์ฉ์ผ๋ก ์ฐ๋ค.
w+
- ์คํธ๋ฆผ์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ์ฉ์ผ๋ก ์ฐ๋ค. ๋ฒํผ ๋ด์ฉ๋ฌผ์ ์๋ผ๋ธ๋ค. (์ฆ ๋ฒํผ์ ์ฒซ ๋ฐ์ดํธ์ '\0'์ ๋๋ค.)
a+
- ๋ง๋ถ์ด๊ธฐ. ์คํธ๋ฆผ์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ์ฉ์ผ๋ก ์ด๊ณ ์ด๊ธฐ ๋ฒํผ ์์น๋ฅผ ์ฒซ ๋ ๋ฐ์ดํธ ์์น๋ก ์ค์ ํ๋ค.
์คํธ๋ฆผ์ ํ์ฌ ์์น, ์ฆ ๋ค์ I/O ๋์์ ์ํํ ์์น๋ผ๋ ๊ฐ๋
์ด ์๋ค. I/O ๋์์์ ํ์ฌ ์์น๋ฅผ ๋ฌต์์ ์ผ๋ก ๊ฐฑ์ ํ๋ค. fseek(3)
์ผ๋ก ๋ช
์์ ์ผ๋ก ๊ฐฑ์ ํ ์ ์๊ณ ftell(3)
๋ก ์์๋ผ ์ ์๋ค. ๋ง๋ถ์ด๊ธฐ๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ชจ๋์์๋ ์ด๊ธฐ ์์น๋ฅผ ๋ฒํผ ์์์ ์ผ๋ก ์ค์ ํ๋ค. ๋ง๋ถ์ด๊ธฐ ๋ชจ๋์์ ๋ฒํผ ๋ด์ ๋ ๋ฐ์ดํธ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ด๊ธฐ ์์น๊ฐ size+1
์ด๋ค.
buf
๋ฅผ NULL๋ก ์ง์ ํ๋ฉด fmemopen()
์์ size
๋ฐ์ดํธ์ ๋ฒํผ๋ฅผ ํ ๋นํ๋ค. ์์ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ์ ๋ค์ ์ฝ์ด ๋ค์ด๊ณ ์ถ์ ์์ฉ์์ ์ ์ฉํ๋ค. ์ด๊ธฐ ์์น๋ ๋ฒํผ ์์์ ์ผ๋ก ์ค์ ํ๋ค. ๊ทธ ๋ฒํผ๋ ์คํธ๋ฆผ์ด ๋ซํ ๋ ์๋์ผ๋ก ํด์ ๋๋ค. ์ฐธ๊ณ ๋ก ๊ทธ๋ฐ ํธ์ถ๋ก ํ ๋น๋ ์์ ๋ฒํผ์ ๋ํ ํฌ์ธํฐ๋ฅผ ํธ์ถ์๊ฐ ์ป์ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ค. (open_memstream(3)๋ ์ฐธ๊ณ .)
buf
๊ฐ NULL์ด ์๋๋ฉด ํธ์ถ์๊ฐ ํ ๋นํ ์ต์ len
๋ฐ์ดํธ์ง๋ฆฌ ๋ฒํผ๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํ๋ค.
์ฐ๊ธฐ ๊ฐ๋ฅํ๊ฒ ์ฐ ์คํธ๋ฆผ์ ํ๋ฌ์(fflush(3)) ํ๊ฑฐ๋ ๋ซ์(fclose(3)) ๋ ๋ฒํผ ๋์ ๊ณต๊ฐ์ด ์์ผ๋ฉด ๋ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋กํ๋ค. ๊ทธ๋ ๊ฒ ๋๋ ค๋ฉด ๋ฒํผ์ ์ฌ์ ๋ฐ์ดํธ๊ฐ ์๋๋ก (๊ทธ๋ฆฌ๊ณ size
๊ฐ ๊ทธ ๋ฐ์ดํธ๊น์ง ํฌํจํ๋๋ก) ํธ์ถ์๊ฐ ์ ๊ฒฝ์จ ์ค์ผ ํ๋ค.
์ฝ๊ธฐ ๊ฐ๋ฅํ๊ฒ ์ฐ ์คํธ๋ฆผ์์ ๋ฒํผ ๋ด์ ๋ ๋ฐ์ดํธ('\0')๊ฐ ์์ด๋ ์ฝ๊ธฐ ๋์์ด ํ์ผ ๋ ํ์๋ฅผ ๋ฐํํ์ง๋ ์๋๋ค. ํ์ฌ ๋ฒํผ ์์น๊ฐ ๋ฒํผ ์์์ ๋ถํฐ size
๋ฐ์ดํธ๋ฅผ ์ง๋ ๋๋ง ๋ฒํผ ์ฝ๊ธฐ๊ฐ ํ์ผ ๋์ ์๋ฆฐ๋ค.
์ฐ๊ธฐ ๋์์ ํ์ฌ ์์น์์ ์ผ์ด๋๊ฑฐ๋ (๋ง๋ถ์ด๊ธฐ ์ธ์ ๋ชจ๋), ์คํธ๋ฆผ์ ํ์ฌ ํฌ๊ธฐ ์์น์์ ์ผ์ด๋๋ค (๋ง๋ถ์ด๊ธฐ ๋ชจ๋).
๋ฒํผ์ size
๋ฐ์ดํธ๋ณด๋ค ๋ง์ด ์ฐ๋ ค๊ณ ์๋ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฐ ์ค๋ฅ๋ ๊ทธ stdio
๋ฒํผ๋ฅผ ํ๋ฌ์ ํ์ ๋์์ผ (๋ฐ์ดํฐ๋ ์ฌ๋ผ์ง ์ฑ) ๋๋ฌ๋๊ฒ ๋๋ค. ๋ค์ ํธ์ถ๋ก ๋ฒํผ๋ง์ ๊บผ์ ์ถ๋ ฅ ๋์ ์์ ์ ์ค๋ฅ๋ฅผ ํ์งํ๋ ๊ฒ ์ ์ฉํ ์ ์๋ค.
setbuf(stream, NULL);
์ฑ๊ณต ์๋ฃ ์ fmemopen()
์ FILE
ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ์๋๋ฉด NULL์ ๋ฐํํ๋ฉฐ ์ค๋ฅ๋ฅผ ๋ํ๋ด๋๋ก errno
๋ฅผ ์ค์ ํ๋ค.
glibc 1.0.x๋ถํฐ fmemopen()
์ด ์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
fmemopen() |
์ค๋ ๋ ์์ ์ฑ | MT-Safe |
POSIX.1-2008. ์ด ํจ์๋ POSIX.1-2001์ ๋ช ์ธ๋์ด ์์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์์คํ ๋ค์์ ๋๋ฆฌ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์๋ค.
POSIX.1-2008์์๋ mode
์ 'b'๋ฅผ ๋ฌด์ํด์ผ ํ๋ค๊ณ ๋ช
์ธํ๋ค. ํ์ง๋ง ๊ธฐ์ ์ ์คํ 1์์ ๊ทธ ๊ฒฝ์ฐ์ ๊ตฌํ๋ณ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋๋ก ํ์ค์ ์กฐ์ ํ๊ณ ์์ผ๋ฉฐ, ๊ทธ๋์ glibc์ 'b' ์ฒ๋ฆฌ ๋ฐฉ์์ด ํ์ฉ๋๋ค.
์ด ํจ์๊ฐ ๋ฐํํ๋ ํ์ผ ์คํธ๋ฆผ์๋ ์ฐ๊ณ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์๋ค. (์ฆ ๋ฐํ๋ ์คํธ๋ฆผ์ fileno(3)๋ฅผ ํธ์ถํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐํํ๊ฒ ๋๋ค.)
๋ฒ์ 2.22์์ ๋ฐ์ด๋๋ฆฌ ๋ชจ๋(์๋ ์ฐธ๊ณ )๋ฅผ ์์ ๋ฉด์ fmemopen()
๊ตฌํ์ ์ค๋๋ ๋ฒ๊ทธ๋ค์ด ๊ณ ์ณ์ก์ผ๋ฉฐ ์ด ์ธํฐํ์ด์ค๋ฅผ ์ํ ์ ๋ฒ์ ์ฌ๋ณผ์ด ์๊ฒผ๋ค.
2.9์์ 2.21๊น์ง glibc์ fmemopen()
๊ตฌํ์์๋ "๋ฐ์ด๋๋ฆฌ" ๋ชจ๋๋ฅผ ์ง์ํ๋๋ฐ mode
์ ๋ ๋ฒ์งธ ๊ธ์๋ก 'b'๋ฅผ ์ง์ ํด์ ๋ชจ๋๋ฅผ ์ผฐ๋ค. ์ด ๋ชจ๋์์๋ ์ฐ๊ธฐ ์ ๋ฌต์์ ์ผ๋ก ์ข
๋ฃ์ฉ ๋ ๋ฐ์ดํธ๋ฅผ ์ถ๊ฐํ์ง ์์ผ๋ฉฐ fseek(3)
SEEK_END
๊ฐ ํ์ฌ ๋ฌธ์์ด ๊ธธ์ด๊ฐ ์๋๋ผ ๋ฒํผ ๋(์ฆ size
์ธ์๋ก ์ง์ ํ ๊ฐ)์ ๊ธฐ์ค์ผ๋ก ํ๋ค.
๋ฐ์ด๋๋ฆฌ ๋ชจ๋ ๊ตฌํ์๋ API ๋ฒ๊ทธ๊ฐ ์์๋๋ฐ, ๋ฐ์ด๋๋ฆฌ ๋ชจ๋๋ฅผ ์ง์ ํ๋ ค๋ฉด 'b'๊ฐ mode
์์ ๋ ๋ฒ์งธ ๋ฌธ์์ฌ์ผ ํ๋ค. ๊ทธ๋์ ์๋ฅผ ๋ค์ด "wb+"๋ผ๊ณ ํ๋ฉด ์ํ๋ ํจ๊ณผ๊ฐ ๋์ง๋ง "w+b"๋ผ๊ณ ํ๋ฉด ๋์ง ์๋๋ค. fopen(3)์ mode
์ฒ๋ฆฌ ๋ฐฉ์๊ณผ ์ผ์นํ์ง ์๋ ๋ฐฉ์์ด๋ค.
glibc 2.22์์ ๋ฐ์ด๋๋ฆฌ ๋ชจ๋๊ฐ ์์ด์ก๋ค. mode
์ 'b'๋ฅผ ์ง์ ํด๋ ์๋ฌด ํจ๊ณผ๊ฐ ์๋ค.
glibc ๋ฒ์ 2.22 ์ ์์, size
๋ฅผ 0์ผ๋ก ์ง์ ํ๋ฉด fmemopen()
์ด EINVAL
์ค๋ฅ๋ก ์คํจํ๋ค. ์ด ๊ฒฝ์ฐ์ ์คํธ๋ฆผ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋ ๋ค์ ์ฒซ ๋ฒ์งธ ์ฝ๊ธฐ ์๋์์ ํ์ผ ๋์ด ๋ฐํ๋๋ ๊ฒ ๋ ์ผ๊ด์ ์ผ ํ
๋ฐ, ๋ฒ์ 2.22๋ถํฐ glibc ๊ตฌํ์ด ๊ทธ๋ฐ ๋์ ๋ฐฉ์์ ์ ๊ณตํ๋ค.
glibc ๋ฒ์ 2.22 ์ ์์, fmemopen()
์ ๋ง๋ถ์ด๊ธฐ ๋ชจ๋("a"๋ "a+")๋ฅผ ์ง์ ํ๋ฉด ์ด๊ธฐ ๋ฒํผ ์์น๋ฅผ ์ฒซ ๋ ๋ฐ์ดํธ ์์น๋ก ์ค์ ํ๊ธฐ๋ ํ์ง๋ง (ํ์ฌ ์์น๋ฅผ ์คํธ๋ฆผ ๋์ด ์๋ ์์น๋ก ์ฌ์ค์ ํ๋ ๊ฒฝ์ฐ) ์ดํ์ ์ฐ๊ธฐ๊ฐ ์คํธ๋ฆผ ๋์์ ์ด๋ค์ง๋๋ก ๊ฐ์ ํ์ง๋ ์๋๋ค. glibc 2.22์์ ์ด ๋ฒ๊ทธ๊ฐ ๊ณ ์ณ์ก๋ค.
glibc ๋ฒ์ 2.22 ์ ์์, fmemopen()
์ mode
์ธ์๊ฐ ๋ง๋ถ์ด๊ธฐ("a"๋ "a+")๋ฅผ ๋ํ๋ด๊ณ size
์ธ์๊ฐ ๋ํ๋ด๋ buf
๋ด ๋ฒ์์ ๋ ๋ฐ์ดํธ๊ฐ ํฌํจ๋์ง ์๋ ๊ฒฝ์ฐ์ POSIX.1-2008์ ๋ฐ๋ฅด๋ฉด ์ด๊ธฐ ๋ฒํผ ์์น๋ฅผ ๋ฒํผ ๋ ๋ค์ ๋ฐ์ดํธ ์์น๋ก ์ค์ ํด์ผ ํ๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ์ glibc์ fmemopen()
์์๋ ๋ฒํผ ์์น๋ฅผ -1๋ก ์ค์ ํ๋ค. glibc 2.22์์ ์ด ๋ฒ๊ทธ๊ฐ ๊ณ ์ณ์ก๋ค.
glibc ๋ฒ์ 2.22 ์ ์์, fmemopen()
์ผ๋ก ๋ง๋ ์คํธ๋ฆผ์ whence
๊ฐ์ SEEK_END
๋ก ํด์ fseek(3)
ํธ์ถ์ ์ํํ ๋ offset
์ ์คํธ๋ฆผ ๋ ์์น์ ๋ํ๋ ๊ฒ ์๋๋ผ ๊ทธ ์์น์์ ๋บ๋ค. glibc 2.22์์ ์ด ๋ฒ๊ทธ๊ฐ ๊ณ ์ณ์ก๋ค.
glibc 2.9์์ fmemopen()
์ "๋ฐ์ด๋๋ฆฌ" ๋ชจ๋๋ฅผ ์ถ๊ฐํ๋ฉด์ ABI๊ฐ ์กฐ์ฉํ ๋ฐ๋์๋ค. ๊ทธ ์ ์๋ fmemopen()
์์ mode
๋ด์ 'b'๋ฅผ ๋ฌด์ํ๋ค.
์๋ ํ๋ก๊ทธ๋จ์์๋ fmemopen()
์ ์ฌ์ฉํด ์
๋ ฅ ๋ฒํผ๋ฅผ ์ด๊ณ open_memstream(3)์ ์ฌ์ฉํด ๋์ ํฌ๊ธฐ ์ถ๋ ฅ ๋ฒํผ๋ฅผ ์ฐ๋ค. (ํ๋ก๊ทธ๋จ ์ฒซ ๋ฒ์งธ ๋ช
๋ นํ ์ธ์์์ ๊ฐ์ ธ์จ) ์
๋ ฅ ๋ฌธ์์ด์ ํ์ํด์ ์ ์๋ค์ ์ฝ์ด ๋ค์ด๊ณ , ๊ทธ ์ ์์ ์ ๊ณฑ์ ์ถ๋ ฅ ๋ฒํผ๋ก ์จ๋ฃ๋๋ค. ๋ค์์ ์ด ํ๋ก๊ทธ๋จ์ ์ถ๋ ฅ ์์ด๋ค.
$ ./a.out '1 23 43'
size=11; ptr=1 529 1849
#define _GNU_SOURCE
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
int
main(int argc, char *argv[])
{
FILE *out, *in;
int v, s;
size_t size;
char *ptr;
if (argc != 2) {
fprintf(stderr, "Usage: %s '<num>...'\n", argv[0]);
exit(EXIT_FAILURE);
}
in = fmemopen(argv[1], strlen(argv[1]), "r");
if (in == NULL)
handle_error("open_memstream");
out = open_memstream(&ptr, &size);
if (out == NULL)
handle_error("open_memstream");
for (;;) {
s = fscanf(in, "%d", &v);
if (s <= 0)
break;
s = fprintf(out, "%d ", v * v);
if (s == -1)
handle_error("fprintf");
}
fclose(in);
fclose(out);
printf("size=%zu; ptr=%s\n", size, ptr);
free(ptr);
exit(EXIT_SUCCESS);
}
fopen(3), fopencookie(3), open_memstream(3)
2019-03-06