zoukankan      html  css  js  c++  java
  • 刷新缓存区方式和刷新内存到磁盘方式总结。

      首先聊这个话题,我们先了解两个函数:

      1.printf函数

      2.write函数

      

      .首先了解缓冲区的概念,Linux下的缓冲区分为以下三种:

      1.全缓冲,顾名思义,除非你主动刷新缓冲区,不然只能等到缓冲区满,才能刷新缓冲区。比如写入磁盘。

      2.行缓冲,当遇到' '时,刷新缓冲区,比如 C库函数。

      3.无缓冲,接受多少给多少,比如stderr。

      今天主要讲述的是行缓冲,如果想在不使用' '的情况下刷新缓存区,有下列手段——

      1.fflush()函数。

      函数原型:int fflush(FILE *stream),在这里的stream就是所要清除缓存区的文件。

      举个很简单的例子,我想模拟实现一个shell界面就会用如下方式:

    printf("Myshell$[");
    fflush(stdout):

      

      2.getchar()和scanf()函数。

      当我想要使用键盘与屏幕终端时,printf也会主动刷新缓冲区。

      比如:

      

      在暂停下,输出毫无反应。

      如果我加入getchar,则会出现如下情况:

      

      屏幕终端在等待我的键盘输入。同时他也刷新了输出缓冲区。

      需要说明的是,千万不要认为输入输出是同一块缓冲区,虽然可能有该系统存在,但是Linux下并不是这样的。

      

      3.setbuf()函数。

      函数原型:void setbuf(FILE* stream, char *buf);

      该函数作用就是关闭缓存区并将缓存区指向buf区域。

      看下列代码:

      

    int main(void)
    {
        setbuf(stdout,NULL);
        printf("hello");
    
        sleep(15);
        return 0;
    }

      

      可以看到 在sleep过程中,也就是进程还没结束的时候,stdout缓冲区关闭且无跳转,所以直接输出。

      二.接下来再了解刷新内存内容到磁盘的几大方式:

      write()函数,它与read不同,read是直接系统调用将磁盘中的内容读到内存中。而write仅仅只是将内存中的东西写到磁盘文件的缓冲区中,至于何时将这些内容放入磁盘,得看操作系统的心情——CPU的调度,队列的优先级都是关键。

      当然也会有如下情况,我们意图立即将内容刷新至磁盘,因为可能现在在一个多用户条件下,磁盘内容极有可能马上要被别人获取。

      以下情况会立即刷新数据到磁盘:

      1.exit函数,而非_exit函数,

      exit函数的主要步骤有下面三项:

        1.调用退出处理函数。

        2.刷新输出缓存。

        3.调用_exit函数。

       

      2.return时。

      这个不用解释,当进程结束,PCB回收,当然会释放文件描述符表中的文件。

      3.缓存区满。

      4.fsync()函数。

      函数原型:int fsync(int fd);//成功返回0,出错返回-1.

      《UNIX高级环境编程》如下简单描述:

      

      

  • 相关阅读:
    并发编程-process对象的其他属性方法
    Python json格式处理
    msf制作反弹shell
    Windows渗透备忘录
    WPF listbox实现多列显示数据
    Postgresql插入或更新操作upsert
    Windows 10 IoT Core Samples
    物联网平台开源
    实现领域驱动设计
    wpf Visibility 动画
  • 原文地址:https://www.cnblogs.com/shy0322/p/9192578.html
Copyright © 2011-2022 走看看