반응형

fflush(3)

#include <stdio.h>

int fflush(FILE *stream);

file에 write되지 않은 stream buffer에 저장되어 있는 데이터를 file에 write합니다. 만약 fflush(3)를 수행하지 않으면, fclose(3)를 호출할 때에 fflush(3)가 수행됩니다. 만약 fclose(3)를 수행하지 않고 프로그램을 종료하면 main()함수나 exit(3)함수가 fclose(3)를 실행하면서 file에 write됩니다.

만약 비정상적으로 프로그램이 종료되었을 때(signal이 발생하여 죽었다든지, kill -9 등으로 프로세스를 죽인 경우)는 file에 기록되지 않고 사라질 수 있습니다.

Input stream의 경우에는 일반적으로 fseek로 파일의 위치를 이동할 수 있는 disk 등에서는 정상동작하지만, pipe나  terminal(키 입력)등에서는 fflush가 제대로 동작하지 않습니다. 

 

system call I/O (open, read, wite, close)함수는 kernel에 직접 I/O를 수행하기 때문에 fflush(3)에 대응하는 함수가 없습니다.

 

 

파라미터

stream
     - fopen(3) 등으로 open한 file stream.
      stream은 "r"로 open되면 안됩니다. 쓰기 stream이어야 합니다.

 

RETURN

0
     - 정상적으로 파일에 write되었습니다.

EOF
    - 오류가 발생한 경우이며 상세한 오류는 errno에 설정됩니다.
     내부적으로 write(2)를 수행하므로 write(2)를 수행시에 발생한 오류들이 발생할 수 있습니다.

 EAGAIN : file을 open할 때에 O_NONBLOCK flag이 설정되었으며, 쓰기 상태가 block되었을 때
 EAGAIN or EWOULDBLOCK : fd가 socket이고 socket에 O_NONBLOCK으로 설정되었으며, 쓰기가 block되었을 때
 EBADF :  stream이 유효하지 않거나 또는 stream 내부의 fd가 유효하지 않은 file descriptor임. 
 EDESTADDRREQ : fd가 상대주소가 설정되지 않은 Datagram socket인 경우. 
             즉, connect로 접속된 socket이 아닌경우
 EDQUOT : 사용자별로 할당된 file system의 disk quot가 찼을 때.
 EFAULT : buf가 access할 수 없는 영역의 데이터 buffer임. 
             주로 변수를 pointer로 설정한 후에 malloc(3)하지 않은 경우
 EFBIG : 파일의 크기가 최대 제한보다 크게 write를 하려고 할 때
 EINTR : signal이 발생하여 interrupt됨.
 EINVAL : fd, buf, count 등의 변수가 잘못 설정된 경우. (예, count가 -값이 설정된 경우 등)
 EIO : I/O 오류. background process에서 terminal에 대한 I/O를 시도했다든 지...
 ENOSPC : 저장하려는 공간이 부족한 경우
 EISDIR : open된 fd가 directory인 경우
 EPIPE : pipe 또는 socket에서 상대 reading end가 close된 경우, SIGPIPE signal이 발생하여야 하는 데,
           signal이 ignore하였을 경우 errno에 EPIPE가 설정됨

 


활용 예제

 

Sample

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    FILE *fp;
    int   file_size;

    if(argc != 2) {
        return 1;
    }

    if((fp = fopen(argv[1], "w")) == NULL) {
        fprintf(stderr, "%s file open error: %s\n", argv[1], strerror(errno));
        return 1;
    }

    ......

    /* 
    * 비정상적으로 종료되었을 때도 처리된 곳까지 파일의 데이터를 잘 보존해야 한다면
    * file write 중간 중간에 fflush(2)를 수행합니다.
    */

    fflush(fp);

    ......

    fclose(fp);

    return 0;
}

 


see also :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,