简单探索Linux的缓冲机制
2016-06-08 11:34
351 查看
先来看段代码:
显然是这样的!
接着看下面的代码:
3秒过后。。。
通过结果可以发现,程序先执行了 sleep(3),休眠3秒后再输出"hello world"
这是什么原因呢?
,会不会就是'\n' 的原因呢?
不完全是!原因如下:
很简单,stdout(标准输出)的缓冲区是需要刷新的,当程序执行到 printf() 函数时,系统会先将输出内容暂存到缓冲区中,直到以下几种情况出现时,才会刷缓冲区,从而输出到控制台:
遇到 '\n' (换行符)时刷新
缓冲区满的时候刷新
程序结束时刷新
调用scanf()时刷新
下面简单说一下 '\n' 与 '\r' (注意:这两个是字符,因此要用单引号)
'\n'(0x0a=10):换行符,将光标移动到下一行,但并不是行首
(如果只换行,打印的东西会在下一行的先一个位置继续。)
'\r'(0x0d=13):回车符,将光标移动到最左侧即行首
如果只回车,打印的东西会覆盖同行以前的内容。
在linux下的回车键只代表\n
在windows下的回车键表示\r\n
下面写一个简单程序:模拟进度条
现在大家应该很容易理解上面的代码了吧
程序运行结果如下:
进度增长中。。。
进度完成
(说明:进度条最右边会有一个滚动的光标哦
)
//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 socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍