파일포인터가 열린 상태로 프로그램이 비정상종료되면??
글쓴이: wodnrrns / 작성시간: 금, 2011/09/02 - 12:35오후
안녕하세요.
프로그램밍 하다가 갑자기 궁금해져서요.
우선 제가 작업을 하는것을 주기적으로 파일에다가 로그를 저장하는 모듈을 손보다가 가끔 파일에 아무것도 안남아있을때까 있더라구요.
우선 현재 있는 부분은 (제가 짠건 아닙니다.. 바꿔야할것 같아요.)
initial 하는 부분이 있고 초기에만 호출되어 파일포인터를 열어줍니다. 대략 FILE * temp = fopen( "file_path","at+");
요런식이 되겠구요... 주기적으로 도는 루프에서 값을 확인해서 로그를 저장하는데요.
fprintf(temp,"%s","어쩌구저쩌구"); 이런식이겠지요.
프로그램이 정상종료된다면 계속 쓰다가 파일포인터를 fclose(temp) 할테니까 문제가 없겠지만...
계속 열어놓은 파일포인터에 쓰다가 프로그램이 비정상 종료되면 어떻게 되나요?
개념상으로는 fprintf 해도 메모리(버퍼)에 써놓고 가지고있다가 일정주기별로나 특정인터럽트때 디스크에 쓸꺼같은데..
^^ 아시는분들이 좀 알려주세요. 찾아봤는데 자료가 마땅치가 않네요.
Forums:
fflush(temp);
아니요^^;
플러시를 하자는 이야기가 아니구요^^;
혹시 중간에 그렇게 비정상종료되면 어떤현상이 일어날까 하는 질문입니다.
예측되어지는 현상같은게 있을까하구요..
파일이 망가진다거나, 그냥 쓴데까지 남아있다거나 뭐 근거가있는 예측이 있을까 하고 질문드린거예요.
제가 글을 대강 읽었네요. ^^; fprintf
제가 글을 대강 읽었네요. ^^;
fprintf 계열 함수가 buffered io로 알고 있습니다.
따라서 실제 disk에 write되기전(buffer에 있는 상태)에
시스템이 죽으면 당연히 파일(disk)에는 안 남아있지 않을까요???
응용 프로그램이 정상 종료되던 비정상 종료되던 종료될
응용 프로그램이 정상 종료되던 비정상 종료되던 종료될 때에는 시스템이 열려있던 핸들을 닫아줍니다. 그 때 플러시 되겠죠.
컴퓨터가 꺼져버린다거나해서 파일 시스템이 비정상 종료될 때는 데이터가 날라갈 수 있습니다만 응용 프로그램은 상관없습니다.
응용 프로그램이 비정상 종료 할 때 OS가 열린
응용 프로그램이 비정상 종료 할 때 OS가 열린 파일을 닫아주는 건 맞지만 fclose()를 호출하는 건 아닙니다. 따라서 플러싱이 이뤄지지 않습니다.
$PWD `date`
파일 시스템이 뭔가요? fclose를 안부르더라도
파일 시스템이 뭔가요?
fclose를 안부르더라도 시스템이 파일을 닫으면서 파일 시스템 드라이버로 Close가 들어올텐데, Close핸들러에서 아직 플러시 안된 데이터가 있는데도 플러시 하지 않고 그냥 닫기 처리만 하도록 구현되어있는걸까요?
OS level 까지 못가는 것 아닌가요?
stdio의 buffer는 user level에서 구현되었을텐데요.
예 그렇겠네요. 시스템 함수를 직접 불러서 커널
예 그렇겠네요. 시스템 함수를 직접 불러서 커널 버퍼를 이용할 때 어떻게 되는지 궁금하네요.
CRT를 사용하지 말고 시스템 함수를 사용하면 잘
CRT를 사용하지 말고 시스템 함수를 사용하면 잘 플러시 됩니다.
댓글 달기