刷新缓存区方式和刷新内存到磁盘方式总结。

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

  1.printf函数编程

  2.write函数缓存

  

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

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

  2.行缓冲,当遇到'\n'时,刷新缓冲区,好比 C库函数。操作系统

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

 

  今天主要讲述的是行缓冲,若是想在不使用'\n'的状况下刷新缓存区,有下列手段——code

  1.fflush()函数。blog

  函数原型: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高级环境编程》以下简单描述:

  

相关文章
相关标签/搜索