unix环境高级编程——库函数的缓冲区
来源:互联网 发布:千里眼淘宝插件手机版 编辑:程序博客网 时间:2024/04/30 09:28
#include <stdio.h>int main(int argc, char *argv[]){printf("hello world");while(1);}
将上面的函数编译,运行不会在屏幕上打印出hello world。是因为
1.对于库函数,如果标准输出连到终端设备,则它是行缓冲的(遇到回车换行符或者是缓冲区满了才输出);否则是全缓冲的(缓冲区填满或者是程序运行结束了才输出)。
2.程序运行结束时,会刷新所有的缓冲区。
修改程序,在hello world后面加上\n,编译运行后hello world会输出到终端。
#include <stdio.h>int main(int argc, char *argv[]){printf("hello world\n");while(1);}修改程序去掉最后的while(1),由于程序正常运行结束了,此时会刷新所有缓冲区,即使我们没有在后面加\n,也会输出到终端。
#include <stdio.h>int main(int argc, char *argv[]){printf("hello world");}
修改程序让缓冲区填满,下面的程序一直输出,这样会使缓冲区填满,所以屏幕一样会有打印。
#include <stdio.h>int main(int argc, char *argv[]){while(1)printf("hello world");}
从上面的列子我们可以看出,如果标准输出连到终端设备,则它是行缓冲的;
下面验证如果标准输出不是连接到终端的时候,则是全缓冲的。
#include <stdio.h>int main(int argc, char *argv[]){printf("hello world\n");while(1);}
以这个程序为例,我们知道这个程序如果连接到的是终端的话,是会输出的,因为终端是行缓冲的,这里也提供了回车换行。
但是如果这样运行这个程序:a.out > out.txt。其中a.out为上面程序编译出来的可执行文件,我们将a.out的输出重定向到out.txt。
运行后我们会发现out.txt文件中不会出现hello world。这是因为如果我们在运行这个程序时将它从定向到一个文件的话,则标准输出变成了全缓冲的,即要等到缓冲充满后,或是程序正常退出后才会刷新缓冲区。
由于上面的缓冲机制,也给我们编写程序时带来了一些奇怪的问题。解决办法有如下两种:
1.任何时候我们都可以使用fflush(stdout)来刷新标准输出缓冲区。
2.使用不带缓冲的系统调用write替代printf输出。
1 0
- unix环境高级编程——库函数的缓冲区
- UNIX环境高级编程——标准I/O库缓冲区和内核缓冲区的区别
- UNIX环境高级编程——标准I/O库缓冲区和内核缓冲区的区别
- UNIX环境高级编程——标准I/O库函数和Unbuffered I/O函数
- 《unix环境高级编程》 有关I/O库函数--3
- UNIX环境高级编程——pthread_create的问题
- UNIX环境高级编程——pthread_create的问题
- UNIX环境高级编程——信号
- UNIX环境高级编程——线程
- UNIX环境高级编程——死锁
- UNIX环境高级编程——进程
- UNIX环境高级编程——IPC
- UNIX环境高级编程——线程
- UNIX环境高级编程——线程
- UNIX环境高级编程——信号
- Unix环境高级编程—进程关系
- UNIX高级环境编程——UNIX基础知识笔记
- UNIX环境高级编程——UNIX基础知识
- python笔记13--多线程
- lavaral5:实验楼构建大型网站(未完)
- DBCP连接池配置参数说明
- VC++ 声音处理
- 关于IOS开发是用xib/storyboard还是纯代码开发
- unix环境高级编程——库函数的缓冲区
- 使用Python的元类实现AOP监控类方法调用过程
- RFID作业(第三次)
- java的xml学习[JDOM方式解析XML文档]
- leetCode | Add Two Numbers
- STM32Fxx系列CAN总线配置总结
- Java获取本机ip的方法
- LeetCode(034) Search For a Range (Java)
- Linux下使用Shell脚本实现ftp的自动上传下