【转】一个关于fork()的笔试题,考了好几遍,终于找到答案了

笔试至少3次见到这个题,都是瞎编的,今天群里有人问,然后有人放出了这个地址:http://coolshell.cn/articles/7965.html,让我恍然大明白,豁然好脾气。

感谢这位陈皓同学(名字很熟,不记得什么地方见过,好像某本书上看见过)。下面全文转一下:

***************下面全是转的,我是分隔线***************

前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的:

题目:请问下面的程序一共输出多少个“-”?

 1 #include <stdio.h> 
 2 #include <sys/types.h> 
 3 #include <unistd.h>  
 4  int main(void) 
 5 {
 6     int i;
 7     for(i=0; i<2; i++)
 8     {
 9          fork();
10          printf("-");
11     }
12     return 0;
13 } 

如果你对fork()的机制比较熟悉的话,这个题并不难,输出应该是6个“-”,但是,实际上这个程序会很tricky地输出8个“-”。

要讲清这个题,我们首先需要知道fork()系统调用的特性,

  • fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid),这是众为周知的。
  • 还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。

所以,上面的那个程序为什么会输入8个“-”,这是因为printf(“-”);语句有buffer,所以,对于上述程序,printf(“-”);把“-”放到了缓存中,并没有真正的输出(参看《C语言的迷题》中的第一题),在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。

另外,多说一下,我们知道,Unix下的设备有“块设备”和“字符设备”的概念,所谓块设备,就是以一块一块的数据存取的设备,字符设备是一次存取一个字符的设备。磁盘、内存都是块设备,字符设备如键盘和串口。块设备一般都有缓存,而字符设备一般都没有缓存。

对于上面的问题,我们如果修改一下上面的printf的那条语句为:

1 printf("-\n");

或是

1 printf("-"); 
2 fflush(stdout);

就没有问题了(就是6个“-”了),因为程序遇到“\n”,或是EOF,或是缓中区满,或是文件描述符关闭,或是主动flush,或是程序退出,就会把数据刷出缓冲区。需要注意的是,标准输出是行缓冲,所以遇到“\n”的时候会刷出缓冲区,但对于磁盘这个块设备来说,“\n”并不会引起缓冲区刷出的动作,那是全缓冲,你可以使用setvbuf来设置缓冲区大小,或是用fflush刷缓存。

我估计有些朋友可能对于fork()还不是很了解,那么我们把上面的程序改成下面这样:

 1 #include <stdio.h> 
 2 #include <sys/types.h> 
 3 #include <unistd.h>
 4 int main(void) 
 5 {
 6     int i;
 7     for(i=0; i<2; i++)
 8     {
 9          fork();       //注意:下面的printf有“\n”
10       printf("ppid=%d, pid=%d, i=%d \n", getppid(), getpid(), i);
11     }
12     sleep(10); //让进程停留十秒,这样我们可以用pstree查看一下进程树
13    return 0;
14 }

于是,上面这段程序会输出下面的结果,(注:编译出的可执行的程序名为fork)

ppid=8858, pid=8518, i=0 
ppid=8858, pid=8518, i=1 
ppid=8518, pid=8519, i=0 
ppid=8518, pid=8519, i=1 
ppid=8518, pid=8520, i=1
ppid=8519, pid=8521, i=1   $ pstree -p | grep fork |-bash(8858)-+-fork(8518)-+-fork(8519)---fork(8521) |            |            `-fork(8520) 

面对这样的图你可能还是看不懂,没事,我好事做到底,画个图给你看看:

注意:上图中的我用了几个色彩,相同颜色的是同一个进程。于是,我们的pstree的图示就可以成为下面这个样子:(下图中的颜色与上图对应)

这样,对于printf(“-”);这个语句,我们就可以很清楚的知道,哪个子进程复制了父进程标准输出缓中区里的的内容,而导致了多次输出了。(如下图所示,就是我阴影并双边框了那两个子进程)

现在你明白了吧。(另,对于图中的我本人拙劣的配色,请见谅!)

(全文完)


(转载本站文章请注明作者和出处 酷壳 – CoolShell.cn ,请勿用于任何商业用途)

————————============ 感谢 42qu.com 为本站提供 VPS ============————————

转载于:https://www.cnblogs.com/anpengapple/archive/2012/10/13/2722827.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android自定义金额输入键盘_Android 自定义输入支付密码的软键盘实例代码

Android 自定义输入支付密码的软键盘有项目需求需要做一个密码锁功能&#xff0c;还有自己的软键盘&#xff0c;类似与支付宝那种&#xff0c;这里是整理的资料&#xff0c;大家可以看下&#xff0c;如有错误&#xff0c;欢迎留言指正需求&#xff1a;要实现类似支付宝的输入支…

IE6 IE8下背景图片不显示问题

更改background:url()no-repeat; 去掉no-repeat即可解决问题&#xff01;转载于:https://www.cnblogs.com/dream-w/p/4781644.html

C# 选中 DataGridView 控件中的行时显示不同的颜色

可以利用 DataGridView 控件的 SelectionMode、ReadOnly 和 SelectionBackColor 属性实现当选中DataGridView控件中的行时显示不同的颜色。SelectionMode属性用于设置如何选择 DataGridView 的单元格。语法如下:public DataGridViewSelectionMode SelectionMode{get;set;}属性值…

Objective-C( Foundation框架 一 常见的结构体)

常见的结构体 &#xff08;NSPoint&#xff0c;CGPoint&#xff09;、&#xff08;NSRange&#xff0c;CGRange&#xff09;、&#xff08;NSSize&#xff0c;CGSize&#xff09; 苹果官方推荐使用CG开头的结构体 NSRange是Foundation框架中常见的结构体它的定义如下&#xff1…

32岁武汉硕士毕业4年后重新高考,考上本硕需再读8年:“不是一时冲动”

全世界只有3.14 % 的人关注了爆炸吧知识9月5日&#xff0c;程传坤收到了湖北中医药大学的录取通知书。7月8日下午5时10分&#xff0c;32岁的程传坤走出湖北省武汉市新洲一中考点&#xff0c;一脸轻松&#xff0c;拿着准考证特意在新洲一中门前留影。这是他硕士毕业4年后再战高考…

打开本地文件_可以跨软件搜索文件?结构式检索你一定要学会!

面对电脑中日积月累的大量结构式&#xff0c;如何能快速找到自己想要的文件&#xff0c;有时真是一个让人头疼的问题。KingDraw PC版内置的结构式检索功能&#xff0c;可以帮助我们轻松解决这个难题。KingDraw PC版中&#xff0c;我们有两种途径可以检索结构式——右键菜单中检…

C# static readonly 与 const 的区别

static readonly 与 const 的区别&#xff1a; const 表达式的值是在编译时形成的&#xff1b; static readonly 表达式的值直到程序运行时才形成&#xff1b;转载于:https://www.cnblogs.com/xiangfeideshui/archive/2012/10/15/2724260.html

WPF实现雷达图(仿英雄联盟)

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织转载 有小伙伴提出需要实现雷达图。 由于在WPF中没有现成的雷达图控件&#xff0c;所以我们自己实现一个。PS&#xff1a;有更好的方式欢迎推荐。01—代码如…

Emoji:搜索将与您找到表情符号背后的故事

眼下。秉已经开始支持emoji搜索&#xff0c;这意味着&#xff0c;你可以插入或粘贴系列emoji表情&#xff0c;让我们的爱、微笑、食品等。。些表情随意组合&#xff0c;必应总会带给你非常多有趣的但却没有不论什么实际用途的搜索结果。这是一项非常新鲜的东西&#xff0c;并且…

python3 2.00gb怎么去掉单位_最值得期待的Python 3.9的新功能

Python 3.9 beta预计下个月就要发布了&#xff0c;那么3.9有那些让我们期待的新功能和变更呢&#xff1f;本我我们一起来说Python 3.9的新功能的。安装测试版为了能够实际探索Python 3.9 的功能&#xff0c;我们需要先下载一个Python 3.9 alpha/beta并安装。wget https://www.p…

TSQL语句中的Like用法

SQL Server&#xff1a;SQL Like 的特殊用法 %&#xff1a;匹配零个及多个任意字符&#xff1b; _&#xff1a;与任意单字符匹配&#xff1b; []&#xff1a;匹配一个范围&#xff1b; [^]&#xff1a;排除一个范围 SymbolMeaninglike 5[%]5%like [_]n_nlike [a-cdf]a, b, c, d…

C++ virtual笔试

一直在赶场&#xff0c;下面是出了N次的题... 当基础看了 #include <iostream> using namespace std; namespace Torxie { // class CFirst { public: void func() { cout<< "CFirst"&l…

这6部超经典的物理电影,居然还有人没有看过?

全世界只有3.14 % 的人关注了爆炸吧知识开篇警告&#xff1a;这是一篇福利文&#xff01;今天小编给热爱物理及数学的小伙伴们&#xff0c;分享6部豆瓣评分8分以上&#xff0c;与数学和物理领域相关的经典电影&#xff0c;帮助大家在工作、学习之余劳逸结合。这些影片除了涉及数…

产品说,我只需要一个有亿点复杂的查询界面

有的时候&#xff0c;你需要动态构建一个比较复杂的查询条件&#xff0c;传入数据库中进行查询。而条件本身可能来自前端请求或者配置文件。那么这个时候&#xff0c;表达式树&#xff0c;就可以帮助到你。本文我们将通过几个简短的示例来了解如何完成这些操作。你也可能接到过…

PostgreSQL忘记输入where条件update更新整张表的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 虽然出现这个错误很挫&#xff0c;但有时候还是会被你或者你的同事碰到。为了避免这个错误&#xff0c;PostgreSQL数据库中可以通过触发器来解决&#xff0c;这里用的是plpgsql 。 1、修改postgresql.conf配置 增加&…

视觉开发需要什么程度的数学_角度的概念在视觉上非常直观,但其数学定义并不是那么简单...

角的概念是几何学中最基本的概念之一。当我们研究三角形的性质时&#xff0c;我们自然地建立了三角形的边和角之间的联系。这些联系是在三角学中系统地建立起来的。角是什么&#xff1f;我们如何测量它&#xff1f;虽然角度的概念在视觉上很直观&#xff0c;但它的数学定义却不…

轻松搭建Google ADK开发环境

相信很多网友一直有自己DIY机器人的想法&#xff0c;但苦于要使用的各种控制模块品种繁多、成本高昂、且开发难度较高。但是随着Google发布了任何人均可自由开发Android终端外设的协议“Open Accessory Protocol”后&#xff0c;大家可以利用Android手机上的丰富资源以及完善的…

搭建nginx + python + django +memcached+ mysql +fastcgi 环境

Django是一个开放源代码的Web应用框 架,由Python写成,它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。pythondjango也是web开发者最受欢 迎的框架.今天记录下整个搭建开发环境的过程.(说明下环境的系统为 centos 5.2) 一:更新yum仓库(目前这个yu…

别薅了别薅了!!!再薅就真的被薅秃了!!

▲ 点击查看大家好&#xff0c;超模全新的固定栏目「薅羊毛」上线了&#xff01;既然是薅羊毛&#xff0c;怎么能空着手来&#xff1f;毕竟好用的好吃的&#xff0c;啥都要花钱。与其为那些虚幻的包装价值买单&#xff0c;不如跟着超模君狠狠地薅一把羊毛&#xff0c;「花小钱赚…

GitHub Universe 2021|MS Reactor 邀你共聚年度盛会

关注我们GitHub Universe 2021 将于2021年10月27-28日&#xff08;PDT&#xff09;在线直播&#xff0c;MS Reactor 将与 CSDN 合作进行转播&#xff0c;与你一同观看这场全球开发者盛会。 关于 GitHub UniverseGitHub Universe 是 GitHub 面向全球开发者社区举办的年度重要盛会…