C & LINUX

C / LINUX setbuf(3) setvbuf(3)

Ocean_ 2022. 5. 1. 17:22

함수 기능

파일의 버퍼를 바꿔주는 함수

 

setvbuf

setbuf와 동일하나 버퍼링의 타입과 크기지정가능

함수 원형

#include <stdio.h>
void setbuf(FILE *fp, char *buf);
int setvbuf(FILE *fp, char *buf, int mode, size_t size);

리턴 값 : 성공시 0 에러시 0이아닌값 리턴

함수 파라메터

fp

파일 포인터

buf

버퍼

mode

_IOFBF FULL 버퍼- 입출력이 버퍼 단위로 이루어짐

_IOLBF 라인버퍼- 개행문자를 만날때 마다 버퍼의 내용 출력 

_IONBF NON버퍼 - 입출력이 버퍼를 사용하지 않게 됨.

함수 예제

setbuf1

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#define BUFFER_SIZE 1024

int main(void){
    char buf[BUFFER_SIZE];
    setbuf(stdout,buf);
    printf("Hello,");
    sleep(1);
    printf("OSLAB!!");
    sleep(1);
    printf("\n");
    sleep(1);
    setbuf(stdout,NULL);
    printf("How");
    sleep(1);
    printf("are");
    sleep(1);
    printf("you?");
    sleep(1);
    printf("\n");
    exit(0);
}

setbuf2

#include<stdio.h>
#include<stdlib.h>

#define BUFFER_SIZE 1024
int main(void){
    char buf[BUFFER_SIZE];
    int a,b;
    int i;

    setbuf(stdin,buf);
    scanf("%d %d",&a,&b);
    
    for(i=0;buf[i] != '\n'; i++){
        putchar(buf[i]);
    }

    putchar('\n');
    exit(0);
}

setvbuf

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#define BUFFER_SIZE 1024

void ssu_setbuf(FILE *fp, char *buf);
int main(void){
    char buf[BUFFER_SIZE];
    char *fname="/dev/pts/1";
    FILE *fp;

    if((fp=fopen(fname,"w"))==NULL){
        fprintf(stderr,"fopen error for %s",fname);
        exit(1);
    }

    ssu_setbuf(fp,buf);
    fprintf(fp,"Hello,");
    sleep(1);
    fprintf(fp,"UNIX!!");
    sleep(1);
    fprintf(fp,"\n");
    sleep(1);
    ssu_setbuf(fp,NULL);
    fprintf(fp,"HOW");
    sleep(1);
    fprintf(fp,"ARE");
    sleep(1);
    fprintf(fp,"YOU?");
    sleep(1);
    fprintf(fp,"\n");
    sleep(1);
    exit(0);
}

void ssu_setbuf(FILE *fp, char *buf){
    size_t size;
    int fd;
    int mode;
    fd =fileno(fp);
    if(isatty(fd))
        mode =_IOLBF;
    else
        mode=_IOFBF;
    
    if(buf==NULL){
        mode=_IONBF;
        size=0;
    }
    else
        size=BUFFER_SIZE;

    setvbuf(fp,buf,mode,size);
}

함수 결과

setbuf1

setbuf2

setvbuf

 

 

리눅스시스템 프로그래밍 - 홍지만 저

교재 내에 있는 예제를 바탕으로 작성한 글 입니다.