컴퓨터 공부/Advanced UNIX System Programming

[4월 29일 1교시] 라이브러리 파일 관련 함수 1

려리군 2009. 4. 29. 09:27

sync(), fsync()

기능 : 버퍼 캐시의 내용을 디스크에 쓰도록 한다.

(실제 메모리와 캐시 사이에 inconsistency가 있을 때 synchronization을 위해 사용)

#include<unistd.h>

void sync(void);

데몬 프로세스에 의해 30초마다 호출.

int fsync(int filedes);

지정된 파일에 대해서만 버퍼 캐시 내용에 대해 I/O작업을 수행. Blocking함수.

참고) O_SYNC Flag


System call vs standard library function

(시스템 호출 vs 표준 라이브러리 함수)

응용 프로그램 ↔ C라이브러리 함수(라이브러리 버퍼)

        ↕                          ↕             ---------------- ↑ 사용자 영역, ↓ 운영체제 영역

        시스템 콜(시스템 버퍼)

                       ↕                          ---------------- ↑ 운영체제 영역, ↓ 하드웨어 영역

                  하드웨어   


C라이브러리 함수가 조금 더 빠르지만 버퍼의 inconsistency가 발생할 가능성이 많다. (시스템 콜을 최소화)

시스템 콜을 직접 호출하면 오버헤드가 발생하지만(모드 변환, 시스템 콜 준비) 메모리는 아낄 수 있다.


setbuf, setvbuf

#include<stdio.h>

int setvbuf(FILE *fp, char *buf, int mode, size_t size);

기능 

버퍼의 관리 기법을 변경한다.

mode 

_IOFBF : Fully Buffered(버퍼가 꽉 찼을 때 입출력 수행)

_IOLBF : Line Buffered(개행 문자가 있을 때 입출력 수행)

_IONBF : Unbuffered(버퍼 없음)

buf

NULL이 아니면, size만큼 사용자 공간 사용

NULL이면, 함수가 적당한 버퍼 크기 할당

mode가 _IONBF면 버퍼 사용 안함.

리턴 : 0이면 성공, 그 외값이면 실패.


void setbuf(FILE *fp, char *buf);

buf 

NULL이 아니면 fully buffered 또는 line buffered, NULL이면 unbuffered


fflush

#include<stdio.h>

int fflush(FILE *fp);

기능 : 출력 버퍼의 내용을 모두 쓴다.

리턴 : 성공시 0, 실패시 EOF(-1)

fp가 NULL이면 모든 출력 스트림에 대해 동작.


fopen

#include<stdio.h>

FILE* open(const char *pathname, const char *type);

기능 : pathname의 파일을 열고 버퍼를 할당

리턴 : 성공시 FILE 포인터, 실패시 NULL

type : 파일의 접근모드

"r" : O_RDONLY, "w" : O_WRONLY | O_CREAT | O_TRUNC, "a" : O_WRONLY | O_APPEND | O_CREAT

"r+" : O_RDWR, "w+" : O_RDWR | O_CREAT | O_TRUNC, "a+" : O_RDWR | O_APPEND | O_CREAT

"b"가 추가될 경우 다음 플랫폼에 따라 출력이 달라진다.

ㅁ 개행문자

UNIX : \n (변화없음)

Windows : \r\n

Mac : \r