linux文件緩沖區


背景

之前在linux下手寫c語言日志庫的時候,遇到日志內容無法及時刷新的情況,百思不得其解;最后查資料才知道是默認的緩沖區設置的問題。‘

與之相關的緩沖區設置函數有setbuf和setvbuf

分析

緩沖區分類:1.行緩沖 2.全緩沖 3.無緩沖

行緩沖特點是:

  • 默認大小:1024字節;
  • 遇換行符或緩沖區滿時,將刷新緩沖區;

比如,標准輸入輸出就是行緩沖類型。

全緩沖特點是:

  • 默認大小:4096字節;
  • 緩沖區滿時,將刷新緩沖區;

比如,普通文件讀寫緩沖區就是全緩沖類型。

無緩沖特點是直接調用系統IO刷新緩沖區,比如標准錯誤的緩沖區

磁盤文件緩沖區

通過setbuf和setvbuf函數,可以對文件緩沖區類型和大小進行修改。

 

測試代碼

#include <stdio.h>                                                                                                                                                                                                       
#include <stdlib.h>
int main()
{
    int i;
    FILE *fp;
    char msg[] = "hello,world\n";
    char buf[128];
    if((fp = fopen("setbuf_nobuff.txt","w")) == NULL)
    {
        perror("file open fail");
        exit(-1);
    }
    setbuf(fp,NULL); // NO_BUFF
    fwrite(msg,7,1,fp);
    printf("test setbuf(NULL)\n");
    printf("press enter to continue\n");
    getchar();
    fclose(fp);
 
    if((fp = fopen("setvbuf_ionbf.txt","w")) == NULL)
    {
        perror("setvbuf_ionbf.txt");
        exit(-1);
    }
    setvbuf(fp,NULL,_IONBF,0);
    fwrite(msg,7,1,fp);
    printf("test setvbuf(_IONBF)\n");
    printf("press enter to continue\n");
    getchar();
    fclose(fp);
    if((fp = fopen("setvbuf_iolbf.txt","w")) == NULL)
    {
        perror("setvbuf_iolbf.txt");
        exit(-1);
    }
    setvbuf(fp,buf,_IOLBF,sizeof(buf));
    fwrite(msg,sizeof(msg),1,fp);
    printf("test setvbuf(_IOLBF)\n");
    printf("press enter to continue\n");
    getchar();
    fclose(fp);
 
    if((fp = fopen("setvbuf_iofbf.txt","w")) == NULL)
    {
        perror("setvbuf_iofbf.txt");
        exit(-1);
    }
    setvbuf(fp,buf,_IOFBF,sizeof(buf));
    for(i = 0;i < 2;i++)
    {
        fprintf(fp, msg);
    }
    printf("test setbuf(_IOFBF)\n");
    printf("press enter to continue\n");
    getchar();
    fclose(fp);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM