某公司笔试题——Linux fork()
2016-04-04 12:17
267 查看
直接来源代码:
进程关系如下图:
图.1 进程关系示意图
由上图,一看可以看到输出结果是6.
可是,少年,Too young,too simple啊。
fork一个进程会发生什么事?大多数人都知道会复制程序调用栈,环境变量等等,程序代码段当然不会复制了。
但是,遗漏了一个重要的东西,那就是缓冲区,缓冲区在fork的时候也要被复制一份!!!
那知道会发生什么了吧,上面程序是调用c标准输出函数输出k,也就是printf,而标准输出是基于行缓冲的;第一次调用fork的时候,父子进程的K并没有输出,而是在缓冲区里面。
如果是:
因为输出缓冲区没被刷新,所以程序执行就像这样:
图.2 程序fork输出示意图
所以,针对这条题目,是输出8个K。
最后,感谢,学习了!
#include <stdio.h> #include <unistd.h> #include <wait.h> int main() { for (int i = 0; i < 2; ++i) { fork(); printf("K"); } wait(NULL); return 0; }请问会输出多少个K?
进程关系如下图:
图.1 进程关系示意图
由上图,一看可以看到输出结果是6.
可是,少年,Too young,too simple啊。
fork一个进程会发生什么事?大多数人都知道会复制程序调用栈,环境变量等等,程序代码段当然不会复制了。
但是,遗漏了一个重要的东西,那就是缓冲区,缓冲区在fork的时候也要被复制一份!!!
那知道会发生什么了吧,上面程序是调用c标准输出函数输出k,也就是printf,而标准输出是基于行缓冲的;第一次调用fork的时候,父子进程的K并没有输出,而是在缓冲区里面。
如果是:
... printf("K\n"); ...或者:
... write(STDOUT_FILENO, "K", 1); ...那么缓冲区就将被刷新,此时就是输出6个K.
因为输出缓冲区没被刷新,所以程序执行就像这样:
图.2 程序fork输出示意图
所以,针对这条题目,是输出8个K。
最后,感谢,学习了!
相关文章推荐
- Linux rpm 命令参数使用详解[介绍和应用]
- linux 文件权限
- Linux USB 驱动开发实例 (三)—— 基于USB总线的无线网卡浅析
- Linux内核如何装载和启动一个可执行程序
- Linux下常用文件操作命令总结
- Linux Container(LXC)容器隔离实现机制
- Linux下安装ActiveMQ CPP
- Linux 学习_mysql
- CentOS6.5安装卸载MySql
- linux下使用gitHub环境搭建
- linux下mysql基本的操作
- 浅谈linux性能调优之十二:红帽优化策略Tuned
- linux图形界面和文本界面的切换操作方法
- linux系统中内存爆满之后会如何?
- linux系统中内存爆满之后会如何?
- linux系统中内存爆满之后会如何?
- centos6配置本地光盘yum源、rhel7修改网卡名称为eth0
- Linux 备份脚本
- 转载的linux中wget命令的使用方法详解
- linux下创建库函数