파일포인터가 열린 상태로 프로그램이 비정상종료되면??

wodnrrns의 이미지

안녕하세요.
프로그램밍 하다가 갑자기 궁금해져서요.

우선 제가 작업을 하는것을 주기적으로 파일에다가 로그를 저장하는 모듈을 손보다가 가끔 파일에 아무것도 안남아있을때까 있더라구요.
우선 현재 있는 부분은 (제가 짠건 아닙니다.. 바꿔야할것 같아요.)

initial 하는 부분이 있고 초기에만 호출되어 파일포인터를 열어줍니다. 대략 FILE * temp = fopen( "file_path","at+");
요런식이 되겠구요... 주기적으로 도는 루프에서 값을 확인해서 로그를 저장하는데요.

fprintf(temp,"%s","어쩌구저쩌구"); 이런식이겠지요.

프로그램이 정상종료된다면 계속 쓰다가 파일포인터를 fclose(temp) 할테니까 문제가 없겠지만...
계속 열어놓은 파일포인터에 쓰다가 프로그램이 비정상 종료되면 어떻게 되나요?

개념상으로는 fprintf 해도 메모리(버퍼)에 써놓고 가지고있다가 일정주기별로나 특정인터럽트때 디스크에 쓸꺼같은데..
^^ 아시는분들이 좀 알려주세요. 찾아봤는데 자료가 마땅치가 않네요.

ktd2004의 이미지

fflush(temp);
wodnrrns의 이미지

플러시를 하자는 이야기가 아니구요^^;
혹시 중간에 그렇게 비정상종료되면 어떤현상이 일어날까 하는 질문입니다.

예측되어지는 현상같은게 있을까하구요..

파일이 망가진다거나, 그냥 쓴데까지 남아있다거나 뭐 근거가있는 예측이 있을까 하고 질문드린거예요.

ktd2004의 이미지

제가 글을 대강 읽었네요. ^^;

fprintf 계열 함수가 buffered io로 알고 있습니다.
따라서 실제 disk에 write되기전(buffer에 있는 상태)에
시스템이 죽으면 당연히 파일(disk)에는 안 남아있지 않을까요???

익명 사용자의 이미지

응용 프로그램이 정상 종료되던 비정상 종료되던 종료될 때에는 시스템이 열려있던 핸들을 닫아줍니다. 그 때 플러시 되겠죠.
컴퓨터가 꺼져버린다거나해서 파일 시스템이 비정상 종료될 때는 데이터가 날라갈 수 있습니다만 응용 프로그램은 상관없습니다.

wariua의 이미지

응용 프로그램이 비정상 종료 할 때 OS가 열린 파일을 닫아주는 건 맞지만 fclose()를 호출하는 건 아닙니다. 따라서 플러싱이 이뤄지지 않습니다.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
 
int
main(int argc, char *argv[])
{
	FILE *fp = fopen("a.txt", "wt");
 
	fprintf(fp, "Can you see this?\n");
 
	raise(SIGTERM);
 
	exit(EXIT_SUCCESS);
}

$PWD `date`

익명 사용자의 이미지

파일 시스템이 뭔가요?
fclose를 안부르더라도 시스템이 파일을 닫으면서 파일 시스템 드라이버로 Close가 들어올텐데, Close핸들러에서 아직 플러시 안된 데이터가 있는데도 플러시 하지 않고 그냥 닫기 처리만 하도록 구현되어있는걸까요?

winner의 이미지

stdio의 buffer는 user level에서 구현되었을텐데요.

익명 사용자의 이미지

예 그렇겠네요. 시스템 함수를 직접 불러서 커널 버퍼를 이용할 때 어떻게 되는지 궁금하네요.

익명 사용자의 이미지

CRT를 사용하지 말고 시스템 함수를 사용하면 잘 플러시 됩니다.

int main(int argc, char** argv) {
    int fd = open("a.txt", O_CREAT|O_TRUNC|O_WRONLY);
    char buf[3];
    memset(buf, 'A', 3);
    size_t result = write(fd, buf, 3);
 
    raise(SIGTERM);
    exit(EXIT_SUCCESS);   
    return 0;
}

댓글 달기

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