[질문] fopen과 fprintf를 이용한 파일 입출력 시 ...
글쓴이: hexascii / 작성시간: 목, 2008/05/29 - 11:47오후
안녕하세요? 파일 입출력 처리하다가 궁금한 점이 있어서 글 올립니다.
일단 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()가 방법 자체로서 잘못된 것이라면 다른 함수로는 어떤 것이 있을까요?
글 읽어 주셔서 감사합니다.
Forums:
죽는다? fopen/fprintf
죽는다?
fopen/fprintf 때문에 죽을 것 같지는 않군요.
기본적으로 파일크기는 검토해보시고(죽을 경우)
다른 문제가 있는지 찾아보세요. fork()를 하신다니, 시그널이라던지, 파이프라던지등등 부터 말입니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
답변감사합니다. 죽
답변감사합니다.
죽는 경우의 파일크기는 매번 다릅니다. 저도 이부분이 이상하게 생각되서 다른 문제를
의심했습니다만, 기본적으로 fork()와 signal, Message Queue를 사용하는데, 매번 다른 지점에서
죽는 것은 이해가 가지 않아서 (정해진 실행 루틴을 따릅니다.)
파일 입출력 문제가 아닌가 했습니다. fopen/fprintf 문제가 아니라면, 다른 부분을 고민해 봐야 겠네요
음...
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 』
System I/O library가
System I/O library가 fprintf 크게 부른다고 죽을만큼 허술하게 짜여져 있지는 않습니다. :P 버퍼가 다 차면 자동으로 OS를 불러서 파일에 씁니다. 따라서 fflush는 불러주실 필요가 없습니다. sync는 더더욱 OS가 죽거나 누가 전원선을 뽑는 사태를 가정하면 모를까 일반적으로는 속도를 저하시키는 것 외의 의미가 없구요.
일단 core를 확인해보시고, valgrind 같은 툴을 활용해보시면 웬만하면 잡을 수 있을 것 같습니다.
valgrind를 이용한 결과
valgrind를 이용한 결과 msgsnd와 관련된 문제가 있음을 알았습니다.
그렇지만 이것이 무엇을 의미하는지는 잘 모르겠습니다.
msgsnd를 래핑하여 사용중인데요
이런 식으로 사용합니다.
이렇게 사용되는 것이 어떤 잠재적인 문제를 갖고 있는 것일까요?
제 프로그램이 실행되다가 안되다가 하는 것의 문제는 이 래핑 함수 인 것 같습니다.
mBuf 구조체를
mBuf 구조체를 보여주셔야 할듯.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
답변
답변 감사합니다.
mBuf는 특별한 사항이 없는데요.
이렇게 선언되어 있습니다. DEFe는 또 다른 구조체이구요.
messageBuffer가 구조체를 가짐으로서 생기는 문제점이 있나요?
음..
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 』
errno
errno는 어떤 값으로 되어 있나요.
머리를 굴려라! 그래야 먹고 산다.
댓글 달기