freopen함수에 대한 설명(리눅스, 표준 c라이브러리이기도 함)좀 이해시켜주세요(책에 나와있는).

inviolable의 이미지

FILE *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp); <- freopen 함수 정의.

FILE 객체는 곧 스트림을 뜻하는 것이고...

책에는 이렇게 설명이 되어있는데 대체 뭔말인지 모르겠습니다.

2.freopen 함수는 지정된 파일을 지정된 스트림으로 연다. 스트림이 이미 열려 있으면 닫은 후 다시 연다. 스트림에 지향이 설정되어 있으면 freopen은 그 지향을 지운다. 이 함수는 지정된 파일을 미리 정의된 스트림(표준 입력, 표준 출력, 표준 오류)중 하나로 여는 데 주로 쓰인다.

c라이브러리인지라 김XX씨의 홈페이지(주소를 공개해도 되는지 몰라서 조심스럽습니다...)로 가서 레퍼런스를 보니까 원래 fp(3번째 인수)를 스트림으로 갖는 파일을 1번째 인수로 된 파일로 변경한다.(즉 변경 후 파일에 대해 쓰면 3번째 인수 파일이 아닌 1번째 인수 파일로 써진다.)라고 되어있네요... 근데 위의 설명은... 마치 1번째 인수가 파일이고 3번째 인수가 스트림 즉 1번째 인수 파일을 3번째 인수 스트림으로 연다라는 식으로 설명되어있어 이해도 안되고...(스트림하고 파일은 밀접하게 연관되어 있어 파일이 바뀌면 스트림도 바뀌고 스트림이 바뀌면 파일도 바뀌는 거 아닌가요???)그러네요 2. 번 좀 이해하기 쉽게 풀어 써주세요 부연 설명도 부탁드리고요.

inviolable의 이미지

크게 중요한 부분 아니면 그냥 넘어가는 것도 한 방법일 듯 한데 한번 더 글을 노출시켜보겠습니다.

ymir의 이미지

freopen 은 fclose + fopen 과 같다고 보면 됩니다.
파일을 새로운 mode 로 다시 열거나 할 때 사용하면 되는데, 잘 쓰이지는 않습니다.

주로 stdin, stdout, stderr 같이 잘 알려진 파일 스트림을 컨트롤 할 때 쓰이죠.

예를 들어 daemonize 할 때, close 로 stdio 에 해당하는 fd 를 모두 닫아 주는데..
freopen("/dev/null", "w", stdout); 처럼 stdin, stdout, stderr 를 직접 지명해도 됩니다.
이 코드는 stdout 로 나가는 출력을 /dev/null 로 날리지만..
만약 /dev/null 대신 특정 파일명을 지정하면.. 그 파일에 모든 stdout 출력이 저장되겠죠. (stream redirect)

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

inviolable의 이미지

답변 감사합니다.

bushi의 이미지

        freopen("/tmp/log.txt", "w", stdout);
        printf("hello freopen\n");

        int fd = open("/tmp/log.txt", O_CREAT | O_WRONLY, 0755);
        dup2(fd, fileno(stdout));
        printf("hello dup2\n");

file/socket descriptor 는 커널 내부로 진입했을 때만 의미를 가지는 단순한 숫자입니다.

inviolable의 이미지

답변 감사합니다.

익명 사용자의 이미지

함수라는 것은 프로그램을 편하게 하는 부분이기도 하지만 때로는 이해가 안 가기도 합니다.

첨에 이렇게 올려 와져 있는
FILE *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp); <- freopen 함수 정의.

요렇게 그냥 보면 어렵습니다.
이 형식을 쉽게 풀어 보겠습니다.
FILE *freopen(const char *path, const char *mode, FILE *fp); 로 표현이 됩니다.

예제로 써 보겠습니다.
FILE *freopen(./wow.ph, r+, NULL)
여기서 두번째 항목 r+ 는 fdopen 의 mode 인자 값입니다.
리눅스 파일을 보면 -rwxrwxr-x 이런식으로 있는 부분이 있습니다.
파일 권한을 주는 부분인데 파일을 읽고 쓰기 위해서 권한을 주는 부분입니다.

세번째 인자값은 성공시 반환값은 파일 포인터 이고 오류시 반환값은 NULL 입니다.

2번은 이런 의미 입니다. 조건이라고 보면 되는데 한글 파일을 예로 들면 이미 열려 있는 파일을 다시 열려고 하면 저장하시겠습니까 라는
메시지가 뜹니다. 이런식으로 생각하시면 스트림을 통해 상태를 볼수 있는 도태로 쓸수 있습니다.

내가 파일을 저장하고자 한다. 파일명이 중복이다. 그렇다면 새로운 파일명으로 저장하실것이냐? 아니면 덮어 쓰실래요?
요런 느낌입니다.

inviolable의 이미지

추가적인 설명 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.