C언어에서 파일을 처리하는 함수군은 크게 두가지가 있습니다. System call 함수를 이용한 file I/O와 Library call 함수를 이용한 file I/O입니다. 이들 함수군의 장단점과 어떤 경우에 이들 그룹을 선택해야 할 지에 대해서 알아보겠습니다.

 


 

System Call File I/O 함수

System call 함수를 이용한 file I/O는 unistd.h에 포함된 함수들로 open / create / read / write / close / lseek 등의 함수들로 구성되어 있습니다. 이들 함수는 UNIX/LINUX manual page section 2번의 함수입니다. unistd.h는 UNIx StanDard header file로 UNIX/LINUX 계열의 표준 system call 함수들이 선언되어 있는 header file입니다.

 

이들 함수는 데이터량에 관계없이 함수를 호출할 때마다 kernel I/O가 일어나는 함수로 저수준(Low level) 입출력 함수라고도 합니다.

 

장점
파일 입출력 시 즉시 처리되며 fcntl(2) 함수 등을 통하여 파일 lock과 같은 특수기능을 사용할 수 있습니다.


단점

System Call 함수들은 printf(3)함수와 같은 formatting을 담당하는 함수가 없으며 오로지 read / write 두개의 함수로 읽기할 수 있으므로 사용이 매우 불편합니다. 또는 kernel I/O가 잦아서 시스템 성능을 떨어뜨릴 수 있습니다.

 


Library Call File I/O 함수

Library call 함수를 이용한 file I/O는 stdio.h에 포함된 함수들로 fopen / fread / write / fclose / fprintf / fscanf / fflush / ftell / fseek / fgets / fpus .... 등 다양한 함수들로 구성되어 있습니다.

이들 함수는 모두 UNIX/LINUX manual page section 3번의 함수들입니다.

stdio.h는 STanDard Input / Ouput header file로 표준 입출력 함수들이 선언되어 있는 header file입니다.

 

이들 함수는 여러번 호출하더라도 데이터량이 적으면 일정 size(BUFSIZE 상수값의 크기)의 데이터가 쌓이면 그 때 한번의 Kernel I/O를 발생시킵니다. 이들 함수들을 stream I/O 함수 또는 고수준(High level) 입출력 함수라고도 합니다.

 

장점
파일 입출력에 대한 다양한 형태의 함수를 제공합니다. 데이터 formatting을 위한 fprintf/fscanf와 라인단위 읽고 쓰기를 위한 fgets / fputs 등 사용의 편리함을 제공합니다. 또한 내부 buffering을 통한 Kernel I/O를 최소화하여 시스템 resource를 효율적으로 사용케합니다. 비록 메모리에 buffering을 하면서 지연쓰기를 하더라도 실수로 fclose(3)를 하지 않고 프로그램 종료하면 exit(3)함수가 열려진 모든 파일을 fclose(3)하면서 파일에 기록을 합니다. 또한 new line이 포함시켜 write하면 바로 저장이 됩니다.(라인단위는 바로 write됨)

 

단점
프로그램의 비정상적인 종료나 시스템 다운시에 데이터가 Disk에 기록되지 않을 수 있습니다.

 


이 두 그룹중에서 어떤 것을 사용하는 것이 좋을까요?

 

System Call I/O를 사용해야 하는 경우

- 시스템이 비정상적으로 종료되거나 프로그램 비정상적으로 종료되더라도 파일에 정확하게 기록되어야 하는 경우

- File lock과 같은 특수 기능을 사용해야 하는 경우

- 하나의 파일을 2개 이상의 프로세스가 read/write를 해야 하는 경우 (한쪽은 write만 하고, 한쪽은 read만 하는 경우에는 제외)

 

Library Call I/O를 사용해야 하는 경우

- 왠만하면 그냥 library call 함수를 사용합시다.

 

 


see also :  Stream File I/O Library   System Call File I/O Library

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

Tag , , ,

댓글을 달아 주세요