缓冲区的一些例子
2014-09-17 21:28
141 查看
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t pid = 0; printf("test\n"); pid = fork(); if (pid == 0) { exit(0); } return 0; }
上面这段代码运行的结果输出:
test
但如果运行./fork > out.txt
你会发现在out.txt内容是:
test
test
这是因为pintf()函数自己维护了一个缓冲区,在输出到终端时,为行缓冲,而其他的情况下则是全缓冲。这样在输出到终端时,虽然fork出了新进程,但是因为是输出到终端,所有是行缓冲,输出一行后,刷新缓冲区并输出到屏幕,那么缓冲中在就没有任何数据了,所以在fork子进程退出后,虽然会刷新缓冲区,但是缓冲区没有内容,所有,只输出了一个test。但是当输出被重定向到out.txt时,那么printf()是全缓冲区,在父进程空间运行时,printf();的test并没有输出,而是保留在缓冲区中,当fork之后,产生子进程,我们知道子进程复制父进程的一切,只是换了一个进程ID。这样缓冲区的内容也被复制出来。这样在父进程退出时,刷新缓冲区,输出一个test,在子进程退出时,刷新缓冲区,我们刚才已经描述了,在fork子进程时,父进程的缓冲区也别完全复制过来,那么子进程的缓冲区中也有一个test,所以子进程也输出一个test。
当然在linux中要注意的是exit()和_exit()的区别,除了exit()要执行atexit()注册的退出函数外,还会比_exit()多做一个操作就是刷新缓冲区,
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid = 0;
printf("test\n");
pid = fork();
if (pid == 0) {
_exit(0);
}
return 0;
}
改成上面这样后,编译在运行代码。在开始的例子中的两种方式运行代码,结果都只输出一个test。
相关文章推荐
- Sqlserver中存储过程和游标的一些使用例子
- jquery设置html的一些常用例子
- 一些sql语句的例子
- JFreechart 的一些用法 例子
- Thymeleaf教程 (十一) 一些商店的过多的模板页面例子
- fork()子进程复制父进程的缓冲区的一个例子
- 一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
- svg dom 的一些例子
- Web Services 指南之:Web Services 的一些例子
- getaddrinfo使用例子和socket编程的一些参考文章
- 最大子序列求解及分治算法的一些例子
- [zz]一些KVM xml 例子
- Linux之Sed命令详解(总结一些实用例子)
- 关于Flex的一些例子
- ASP.NET中调用存储过程带(输入/输出)参数和返回值的一些常用的例子
- Java IO学习【6】字符缓冲区BufferWriter小例子
- Java 正则表达式学习总结和一些小例子
- java接口的一些生动的例子
- spring一些方法和用法例子
- 缓冲区的一些测试代码