博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于fork的一道经典面试题
阅读量:4496 次
发布时间:2019-06-08

本文共 989 字,大约阅读时间需要 3 分钟。

这是一道面试题,问程序最终输出几个“-”:

1 #include
2 #include
3 #include
4 int main() 5 { 6 int i; 7 for(i = 0; i < 2; i++) 8 { 9 fork();10 printf("-");11 }12 wait(NULL);13 14 return 0;15 }

正确答案是8个,关键在于prinf("-")只是将字符放到了进程的缓冲区而不输出,而fork在产生子进程的时候,会把父进程的缓冲区也拷贝一遍。如下图所示:

如图,一条箭头表示一个进程,箭头边的0 "-"表示此时该进程的输出缓冲区中没有“-”,1 “-”表示有1个。经过fork后,缓冲区被拷贝,而经过一次prinf,则缓冲区中的“-”增加一个,最终当进程结束的时候,将缓冲区的内容输出。

如果将printf("-")换成printf("-\n"),或者在printf("-")后加一句fflush(stdout),则每次printf的时候就将“-”输出,缓冲区里面不再有东西,这样执行多少次prinf就输出多少次“-”,结果是6次。

 

如果将fork()与prinf("-")交换位置,变成

1 #include
2 #include
3 #include
4 int main() 5 { 6 int i; 7 for(i = 0; i < 2; i++) 8 { 9 printf("-");10 fork();11 }12 wait(NULL);13 14 return 0;15 }

则流程图如下:

结果仍然是8次,最后的fork也是有起作用的,因为只有在进程结束后才会输出缓冲区的内容。

 

转载于:https://www.cnblogs.com/ylan2009/p/4321962.html

你可能感兴趣的文章
正则表达式
查看>>
Java集合之LinkedHashSet源码分析
查看>>
David Silver强化学习Lecture1:强化学习简介
查看>>
开源项目
查看>>
unix系统内核优点
查看>>
协议(五)-从电报机到智能手机
查看>>
Solr学习
查看>>
HDU-4628 Pieces 搜索 | DP
查看>>
动态代理
查看>>
蓝瘦香菇
查看>>
关于数组和List之间相互转换的方法
查看>>
Hybrid开发站点
查看>>
2014-软件工程基础-总结
查看>>
[linux]segvcatch简单使用
查看>>
webpack之傻瓜式教程及前端自动化入门
查看>>
Python学习-5.Python的变量与数据类型及字符串的分割与连接
查看>>
【TypeScript】TypeScript 学习 2——接口
查看>>
Failed to sync Gradle project 'XX'错误解决
查看>>
vue-router 重难点总结笔记
查看>>
GDI+绘图
查看>>