linux缓冲机制,简单探索Linux的缓冲机制

先来看段代码:

536ba42058a408d2235b3a219b79f3d1.png//test.c

#include 

#include 

int main(void)

{

printf("hello world\n");

sleep(3);

return 0;

}

正常情况下,屏幕上首先会输出"hello world",然后等待3秒后才出现命令提示符,是这样吗?

显然是这样的!

71c5ecee6a9d2324531eaaf1d97214d4.png

64a97362f3b28ad05f8714df9c742df9.png

接着看下面的代码://test.c

#include 

#include 

int main(void)

{

printf("hello world");

sleep(3);

return 0;

}

好像没什么不同,仔细看,"hello world" 后面少了一个 "\n",这段代码的运行结果是什么呢?

4f2410457039fc88c3ec30231e615823.png

3秒过后。。。

2d435586fc5c84c2685e1aa67f4df1ef.gif

6e8de6fc35214c64fd79c6ccb6383243.png

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

7697efa0c719257942d22ba410aa3018.png

这是什么原因呢?

722fb55478c4262aded925ac28a13b23.png,会不会就是'\n' 的原因呢?

不完全是!原因如下:

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

3c2498ae2fd026894b1ad0eb83d641ec.png 遇到 '\n' (换行符)时刷新

3c2498ae2fd026894b1ad0eb83d641ec.png 缓冲区满的时候刷新

3c2498ae2fd026894b1ad0eb83d641ec.png 程序结束时刷新

3c2498ae2fd026894b1ad0eb83d641ec.png 调用scanf()时刷新

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

19a3006251071c1e272aa1bd9de0349f.gif'\n'(0x0a=10):换行符,将光标移动到下一行,但并不是行首

(如果只换行,打印的东西会在下一行的先一个位置继续。)

19a3006251071c1e272aa1bd9de0349f.gif'\r'(0x0d=13):回车符,将光标移动到最左侧即行首

如果只回车,打印的东西会覆盖同行以前的内容。

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

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

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

b194115ebd021f7fa86a214661e7a966.gif

#include

#include

#include

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;

}

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

d9d3f70f6650cd1159a13122aae28965.png

程序运行结果如下:

进度增长中。。。

3ae608d54670145754d9d6e6add75cb6.png进度完成

fb211c22f6f5778f4e562e4bf4c075e1.png

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

72c063e9cc723e26686b04497919617b.png)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值