您的位置:首页 > 运维架构 > Linux

简单探索Linux的缓冲机制

2016-06-08 11:34 351 查看
先来看段代码:


//test.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
printf("hello world\n");
sleep(3);
return 0;
}
正常情况下,屏幕上首先会输出"hello world",然后等待3秒后才出现命令提示符,是这样吗?
显然是这样的!




接着看下面的代码:
//test.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
printf("hello world");
sleep(3);
return 0;
}
好像没什么不同,仔细看,"hello world" 后面少了一个 "\n",这段代码的运行结果是什么呢?



3秒过后。。。




通过结果可以发现,程序先执行了 sleep(3),休眠3秒后再输出"hello world"


这是什么原因呢?

,会不会就是'\n' 的原因呢?
不完全是!原因如下:

很简单,stdout(标准输出)的缓冲区是需要刷新的,当程序执行到 printf() 函数时,系统会先将输出内容暂存到缓冲区中,直到以下几种情况出现时,才会刷缓冲区,从而输出到控制台:


遇到 '\n' (换行符)时刷新


缓冲区满的时候刷新


程序结束时刷新


调用scanf()时刷新

下面简单说一下 '\n' 与 '\r' (注意:这两个是字符,因此要用单引号)


'\n'(0x0a=10):换行符,将光标移动到下一行,但并不是行首
(如果只换行,打印的东西会在下一行的先一个位置继续。)


'\r'(0x0d=13):回车符,将光标移动到最左侧即行首
如果只回车,打印的东西会覆盖同行以前的内容。

在linux下的回车键只代表\n
windows下的回车键表示\r\n

下面写一个简单程序:模拟进度条


#include<stdio.h>
#include<string.h>
#include<unistd.h>

void proc()
{
char a[102];
char b[4]={'|','/','-','\\'};
memset(a,'\0',sizeof(a));

int i = 0;
while(i<101)
{
a[i] = '=';
printf("[%-101s][%d%][%c]\r",a ,i++,b[i%4]);
fflush(stdout);
usleep(100000);
}
printf("\n");

}

int main()
{
proc();
return 0;
}


现在大家应该很容易理解上面的代码了吧


程序运行结果如下:

进度增长中。。。


进度完成



(说明:进度条最右边会有一个滚动的光标哦

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux 机制 缓冲