zoukankan      html  css  js  c++  java
  • 全缓冲和行缓冲

    一、在linux系统中,标准的I/O提供了三种类型的缓冲。

    1、全缓冲:在这种情况下,在填满I/O缓冲区后再进行实际的I/O操作。对于驻留在磁盘上的文件通常由标准I/O库实施全缓冲。调用fflush函数冲洗一个流。冲洗意味着将缓冲区的内容写到磁盘上。

    2、行缓冲:在这种情况下,当在输入和输出遇到换行符时,标准I/O执行I/O操作。允许我们一次输出一个字符。涉及一个终端时,通常使用行缓冲。

    对于行缓冲,有两个限制。第一,因为标准I/O库收集每一行的缓冲区的长度是固定的,所以只有填满的了缓冲区,那么即使没有换行符,也会进行I/O的操作。第二,任何时候只要通过标准I/O库要求从a一个布袋缓冲的流,或者b一个行缓冲的流(它要求从内核得到数据)得到输入数据,那么就会造成冲洗所有行缓冲输出流。在b中带了一个在括号中的说明,其理由是,所需的数据可能已在缓冲区中,他并不需求在需要数据时才从内核读数据。很明显,从不带缓冲的一个流中进行输入要求当时从内核得到数据。

    3、不带缓冲的。标准I/O不对字符进行缓冲处理。例如:如果标准I/O函数fputs写15个字符到不带缓冲的流上,就会调用write的相关的函数立即写入打开的文件上。

    二、通过下面的代码,可以更清楚的了解全缓冲和行缓冲的区别。

    #include<stdio.h>
    #include<unistd.h>
    int glob=6;
    char buf[]="a write ro stdout
    ";
    int main()
    {
            int var;
    		
            pid_t pid;
            printf("a write to stdout
    ");
            //fflush(NULL);
            if((pid=fork())<0)
            {
                    printf("fork error");
            }
            else
            {
                    if(pid==0)
                    {
                            glob++;
                            var++;
                    }
                    else
                    {
                            sleep(2);
    						//i++;
                    }
            }
            printf("pid=%d,glob=%d,var=%d
    ",getpid(),glob,var);
            exit(0);
    }
    

    编译后运行结果:

    gcc buff.c -o buff

    ./buff


    再者,运行./buff>temp

    cat temp




    第一种编译的时候,因为采用的是交互式终端,所以采用的是行缓冲 ,在printf之后立即刷新缓冲区。

    第二种编译,将I/O重定向在temp文件中,查看temp的文件,会有两次输出a write to stdout,因为它采用的是全缓冲。

    可以将程序中fflush(NULL)加入,则只会输出一次

     

    a write to stdout

    因为flush即时刷新了缓冲区


  • 相关阅读:
    python的进阶--爬虫小试
    【centos 7】搭FTP服务和web访问
    centos 7 安装python3.5
    centos 6.5 安装mysql 5.6.35--libc.so.6(GLIBC_2.14)(64bit)
    windows 10 下安装python 2.7
    centos7-硬盘坏道检测
    centos7 默认进入系统命令行模式修改
    zabbix安装配置(2.4.5)
    Centos 7 mysql 安装使用记
    docker部署angular和asp.net core组成的前后端分离项目
  • 原文地址:https://www.cnblogs.com/riasky/p/3363496.html
Copyright © 2011-2022 走看看