[질문] fopen과 fprintf를 이용한 파일 입출력 시 ...

hexascii의 이미지

안녕하세요? 파일 입출력 처리하다가 궁금한 점이 있어서 글 올립니다.

일단 Gentoo에서 gcc 사용 중이구요

파일 입출력으로는 fopen과 fprintf를 사용하고 있습니다. 그리고, 여러 개의 Process가 fork에 의해

생성되지만(Dummy, 시작되자마자 suspend됩니다.) 실제로는 처음 실행된 Process 하나만

파일 입출력을 수행합니다. 이 상황에서 계속 파일에 기록하게 되는데요,

기록하는 파일은 하나의 전역 변수 파일 포인터(FILE* inf)로

기록되며 프로그램 종료 시에 fclose가 한 번 수행됩니다.

fprintf를 이용한 파일 기록은 User level에서의 Buffer를 사용한다고 알고 있습니다. 그래서

buffer overrun을 방지하기 위하여, 기록할 때마다 fflush(inf);를 실행해주는 방법을 씁니다.

그래도 간혹 죽는 경우가 발생합니다. 중간중간에 sync()를 넣어줘서 (임시방편으로 사용했습니다.)

Kernel level에서 Buffer를 비움에도 불구하고, 실행되었다 말았다를 반복합니다.

질문의 요지는, fopen()과 fprintf(), FILE pointer를 사용하여 큰 파일을 기록할 때 발생될 수

문제를 방지하는 방법을 알고 싶습니다.

혹, fopen()이나 fprintf()가 방법 자체로서 잘못된 것이라면 다른 함수로는 어떤 것이 있을까요?

글 읽어 주셔서 감사합니다.

mach의 이미지

죽는다?
fopen/fprintf 때문에 죽을 것 같지는 않군요.
기본적으로 파일크기는 검토해보시고(죽을 경우)

다른 문제가 있는지 찾아보세요. fork()를 하신다니, 시그널이라던지, 파이프라던지등등 부터 말입니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

hexascii의 이미지

답변감사합니다.

죽는 경우의 파일크기는 매번 다릅니다. 저도 이부분이 이상하게 생각되서 다른 문제를

의심했습니다만, 기본적으로 fork()와 signal, Message Queue를 사용하는데, 매번 다른 지점에서

죽는 것은 이해가 가지 않아서 (정해진 실행 루틴을 따릅니다.)

파일 입출력 문제가 아닌가 했습니다. fopen/fprintf 문제가 아니라면, 다른 부분을 고민해 봐야 겠네요

ymir의 이미지

core 가 생성되는지 확인해 보시는게 우선일 것 같군요.

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

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

jick의 이미지

System I/O library가 fprintf 크게 부른다고 죽을만큼 허술하게 짜여져 있지는 않습니다. :P 버퍼가 다 차면 자동으로 OS를 불러서 파일에 씁니다. 따라서 fflush는 불러주실 필요가 없습니다. sync는 더더욱 OS가 죽거나 누가 전원선을 뽑는 사태를 가정하면 모를까 일반적으로는 속도를 저하시키는 것 외의 의미가 없구요.

일단 core를 확인해보시고, valgrind 같은 툴을 활용해보시면 웬만하면 잡을 수 있을 것 같습니다.

hexascii의 이미지

valgrind를 이용한 결과 msgsnd와 관련된 문제가 있음을 알았습니다.

Syscall param msgsnd(msgp->mtext) points to uninitialised byte(s)

그렇지만 이것이 무엇을 의미하는지는 잘 모르겠습니다.

msgsnd를 래핑하여 사용중인데요

이런 식으로 사용합니다.

if (sendMessage(tmBuf) == -1 ) {
   perror("Message Queue(sendMessage) :");
}
 
int sendMessage(mBuf* pmBuf) {
     int result;
     int msglen = sizeof(mBuf) - sizeof(long);
     if ( (result = msgsnd(msgid, pmBuf, msglen, 0)) == -1 ) return -1;
     return (result);
}

이렇게 사용되는 것이 어떤 잠재적인 문제를 갖고 있는 것일까요?

제 프로그램이 실행되다가 안되다가 하는 것의 문제는 이 래핑 함수 인 것 같습니다.

mach의 이미지

mBuf 구조체를 보여주셔야 할듯.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

hexascii의 이미지

답변 감사합니다.

mBuf는 특별한 사항이 없는데요.

typedef struct messageBuffer {
    long m_type;
    DEFe mDEFe;
} mBuf;

이렇게 선언되어 있습니다. DEFe는 또 다른 구조체이구요.

messageBuffer가 구조체를 가짐으로서 생기는 문제점이 있나요?

ymir의 이미지

msgsnd() 내부에서 초기화 되지 않은 영역에 접근한다는 경고가 있군요.
pmBuf 나, pmBuf 내부의 포인터에 대해(포인터가 있다면), NULL 체크를 해보시는게 좋을 것 같습니다.
core 는 확인해 보셨는지..?

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

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

uosarang의 이미지

errno는 어떤 값으로 되어 있나요.

머리를 굴려라! 그래야 먹고 산다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.