fork()函数的面试题

由一道题说起,fork()和wait()两个函数 第一次接触到这俩函数居然是今年小组那心的那个面试题...我总觉得快大三了,应该写点厉害的东西而不是这个那个的函数...么办法,谁让大二落下的太多了,慢慢补吧T_T...   请补足横线,使之输出welcome xiyoulinux if(_____) printf(“xiyoulinux ”); else printf(“welcome”);   大部分人包括我第一眼就想到了直接填 阅读详情
fork()函数的面试题

今天我们分析一下fork()常出现的一些面(笔)试题,以备以后面试或者笔试被提及到,我们知道fork()这个函数是一种特殊的函数,它有两个返回值,一个是子进程的pid,一个是父进程的pid,那么它们的这些特别之处,到底会给它们带来什么样的变化呢,我们接下来开始分析。

fork()函数的标准模式:pid_t pid = fork();

代码一:

面试题一: 

   int i =0;
    for (; i<2; i++)
    {
        fork();
        printf("a\n");
    }

看以上代码,我们接着看图进行分析:


当 i= 0 的时候,fork()执行一次,创建出来了一个子进程,又由fork()函数的特殊性我们知道,当fork()执行的时候,它产生的子进程也会从fork()执行以下的代码继续开始执行,从而创建的子进程也会打印一个a,而父进程本身也会打印一个a,就是上图的 i = 0 的过程;

而当 i= 1 的时候,进行第二次的循环,而这时候,里面存在了两个进程,即i= 0时候代码本身的进程,还有i= 0 的时候创建的新进程,都参与这次的循环,则当第二次fork()的时候以上两个进程都会被作为父进程来参与创建新的进程,则当i= 1 的时候,由原来存在的两个进程fork()成为了四个进程,所以这次要打印四个a,加上i= 0的时候两个a,一共打印了6个a。

Linux平台下结果如下:



代码二:验证:

(1)
printf("a");
fork();

(2)
printf("a\n");
fork();
从上面代码我们可以看出,它们唯一的区别是在printf函数中(1)比(2)少了一个'\n',那么它们这小小的区别会不会影响到它们的运行结果呢,接着我们看看一下两个运行结果:

(1)的结果:


(2)的结果:


从上面我们可以看出,(1)没有'\n'打印两个a,而(2)有'\n'打印了一个a;我们知道fork()这个函数是产生一个子进程,而子进程的数据是和父进程的数据是一样的,那么为什么第一个打印2个a,第二个打印1个a呢。首先,这样分析,printf这个函数它每次把数据打印到我们所看到的屏幕上时,它会先将数据放在缓存区里,而我们这里的'\n'作用就是把缓冲区刷新,所以在我们(1)中,没有'\n'会使得缓冲区没有刷新,导致子进程也会把printf这个函数中的数据给带过去,使得在子进程中也打印一个a,所以这里产生两个a;而在(2)中,有'\n'使的printf打印完,缓冲区立即刷新,而当fork()执行的时候printf这个函数中,也就是缓冲区中已经没有a了 ,相当于被清空了,所以只能打印一个a。这里我间接的在说明缓冲区的刷新这个知识点,那么使得缓冲区刷新的条件还有哪些呢?

缓冲区什么时候刷新条件:
1、 遇到“\n” ,立即刷新缓冲区
2、 程序调用 fflush 这个函数立即刷新缓冲区
3、 程序以 exit 结束, 缓冲区会刷新。 如果以_exit 结束, 缓冲区数据被直接
清空。
4、 缓冲区满, 也会将缓冲区数据刷新出来。 1024 字节


代码三:

面试题二:

 int i =0;
    for (; i<2; i++)
    {
        fork();
        printf("a");
    }

从以上代码我们可以看出,它与我们的本文所述的面试题一的唯一区别也就是少了一个'\n',而我们在代码题2中已经说过了,有'\n'缓冲区会立即刷新,那么我们看一下这个fork()以后的结果是怎么样的,是不是与”面试题一”中的结果一样,也是6个a,还是其他呢,先看图:


由图中所看出,一开始i= 0的时候,fork()函数创建一个新的进程,然后我们不妨把第一次循环的打印为a1,这样,第一次打印两个a1,而当第二次fork()的时候,没有'\n'缓冲区没有刷新,使得进程在复制的时候,把a1也从他们相应的父进程复制了过来,这时候他们自身打印一个a,还有一个在父进程中复制过来的a1,第二次的时候父进程也参与printf打印,所以就是4个a1和4个a,也就是8个a。
Linux平台下结果如下:



代码四:面试题三:

  fork() || fork();
    printf("a\n");

此代码是fork() || fork()那么结果是如何呢,先看图,结合分析:


第一个fork()的时候,fork为真的时候,直接打印a,第二个fork()不参与判断;当第一个参数为假的时候,第二个参数开始进行判断,则第二个fork()有两种情况真和假,所以一共三种情况,所以a要打印三次。

Linux平台下结果如下:



扩充:

由于以下题的类型与上述一样,不做说明。

 扩展题一:与‘面试题’一类型一样

int main()
{
int i = 0;
for(; i < 2; ++i)
{
if(fork())
{
printf(“A\n”);
} 
else
{
printf(“B\n”);
}
}
}
结果:   AAA BBB


扩展题二:与‘代码三’题型一样

int main()
{
int i = 0;
for(; i < 2; ++i)
{
if(fork())
{
printf(“A”);
}
else
{
printf(“B”);
}
}
}
结果:AA BA AB BB


扩展题三:与‘代码四’题型一样

int main()
{
if(fork() || fork())
{
printf(“A\n”);
} 
else
{
printf(“B\n”);
}
}
结果: AAB


Linux下fork()函数 Linux下的fork()函数是系统调用不是C语言内置的库函数,这里mark一下笔试面试中常出现的fork()试题。 程序一: #include "stdio.h" #include "sys/types.h" #include "unistd.h" int main() { int i = 0; for(i = 0; i < 2; i++) 阅读详情

相关推荐

08 - U-Boot 源码目录结构详解

本文以“地图课”视角解析U-Boot源码目录结构,通过“建筑-装修-设备”比喻(arch/、board/、drivers/)帮助理解其分层架构。重点讲解五大核心目录:arch/(架构相关)、board/(板级配置)、cmd/(命令实现)、configs/(defconfig)、drivers/(驱动框架),并解答四大学习目标:修改DDR参数、添加命令、区分arch与board、DM框架与Linux设备模型异同,以及defconfig如何通过Kconfig生成.config,为后续移植与开发奠定基础。

内核笔记 512

计算机系统之深入理解fork()函数(面试题)

最近在深入理解计算机系统(CSAPP)这门课上学到了异常控制流(Exception Control Flow)这一章节,其中书上关于fork()有许多理解。 我们今天就先来做一道面试题目理解理解fork()函数具体的含义。 1.第一题题目描述 请问上图会输出几次Hello? 根据下面的手绘图,我们可以看到总共有6个printf,于是我们不难猜到答案是6个Hello。 所以直接把代码在Ubunt...

qq_44807642的博客 1020

linux面试题看FORK()

linux面试题看FORK()

简述C语言fork()函数用法:

首先了解 fork 的功能: fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值: 1)在父进程中,fork返回新创建子进程的进程ID; 2)在子进程中,fork返回0; 3)如果出现错误,fork返回一个负值; 实例: /*linux下:*/ #include &lt;stdio.h&gt; #include &lt;unistd.h&gt; i...

cuit2016123070的博客 4万+

从一道面试题谈linux下fork的运行机制

今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目:给出如下C程序,在linux下使用gcc编译:1#include"stdio.h"2#include"sys/types.h"3#include"unistd.h"45 intmain()6{7pid_tpid1;8pid_tpid2;910pid1=fork();11pid2=fork();1213printf("pid1:%d,pid2:%d\n",pid1,pid2);14} 要求如下:已知从这个程序执行到这个程序的所有进程结束这个时间段内,没有其它新进程执行。1、请说出执行这个程序后,将一共运行几个进程。2、

2023年5月青少年软件编程Python等级考试四级真题(含答案和解析)

电子学会,2023年5月,青少年软件编程,Python等级考试,四级真题(含答案和解析)

m0_37554648的博客 904

Linux中的fork()函数的面试题目

(1)fork 以后,父进程打开的文件指针位置在子进程里面是否一样?(先open再fork) (2)能否用代码简单的验证一下? (3)先fork再打开文件父子进程是否共享偏移量?父进程打开的文件指针位置在子进程里面是否一样?能否用代码简单验证一下.(先fork再open会怎么样?) 5).malloc和free的三个问题: 思考下面三个问题: (1)申请了一块空间没有free,进程就结束了,那么空间被回收了吗? (2)malloc()申请3G的内存能否成功?判断依据是什么? (3)父进程堆区申请的空间

m0_62689947的博客 462

Linux系统杀毒软件深度评测:8款主流工具对比(2025最新版)

本文针对Linux服务器/桌面环境,实测8款杀毒软件,涵盖开源免费、企业级防护、轻量级工具等类型,附保姆级安装教程和避坑指南,新手也能5分钟选对工具!

awei0916的专栏 1万+

面试题目--fork

文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。(3)先fork再打开文件父子进程是否共享偏移量?在 (1)fork 之前打开的文件,在复制进程后,父子进程共享文件偏移量,所以文件指针在相同位置。(1)fork 以后,父进程打开的文件指针位置在子进程里面是否一样?(3)先fork再打开文件,父子进程各自打开各自的,不共享偏移量;父进程打开文件以后,fork产生子进程,父子进程共享打开的文件,同时共享文件偏移量;

weixin_75188368的博客 412

游戏数据训练世界模型:AI物理规律学习与仿真应用实践

世界模型作为理解现实世界动态的AI工具,通过多模态数据学习物理和空间属性来预测未来状态。其核心原理在于从环境交互中提取物理规律,技术价值体现在能够安全、低成本地训练AI系统应对复杂场景。在应用层面,游戏数据因其结构化环境和内置物理引擎,成为世界模型训练的优质素材。游戏世界中的物体交互、运动轨迹等数据天然包含现实物理规律,特别适合训练物理AI。本文以General Intuition公司获得3.2亿美元融资为切入点,深入探讨游戏数据在世界模型训练中的技术实现路径,涵盖数据提取管道构建、多模态数据融合方法,以及

weixin_29056865的博客 367

用OpenNI2获取奥比中光Astra Pro及 Astra Pro SM输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro,想在windows平台,和linux rk3588 上获取深度信息,之前的驱动下载已经不好用了。

babytiger的专栏 1305

fork的几道面试题 【Linux从基础到进阶】

fork的几道面试题第一题 第一题 请先观察下面代码 再观察下面的执行结果 请问,这个n是同一块空间吗? 答案:不是 那为什么这个两个n打印的地址一样呐? 这两个地址都是虚拟地址,并不是子进程和父进程的n在磁盘中的真实的物理地址。 首先,子进程先复制父进程,同时也把父进程的n变量的虚拟地址空间也复制了,所以此时打印的地址值一样,由于 写时拷贝技术,(我另外一篇博文中大概讲了这个)这两个此时共用一块空间,而当在子进程中执行到 n =3,这句代码时,子进程复制空间, ...

aoeaoao的博客 357

Windows环境Oracle19C安装与配置全攻略

本文详细介绍了在Windows环境下安装与配置Oracle19C数据库的完整流程,包括环境准备、安装步骤、网络配置、客户端工具设置及常见问题解决方案。特别针对Windows 10和Windows Server 2016及以上版本提供了优化建议,帮助用户高效完成Oracle19C的部署与维护。

weixin_28455801的博客 487

Linux fork()函数及典型面试题

首先了解 fork 的功能: fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值: 1)在父进程中,fork返回新创建子进程的进程ID; 2)在子进程中,fork返回0; 3)如果出现错误,fork返回一个负值; 例子: /*linux下:*/ #include <stdio.h> #include <unistd.h> int main() { pid_t pid; pid = fork(); if(pid =

Mi-ronin的博客 1267

[关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱

本文主要讲解Gephi绘制作者间的关系图谱,该软件可以广泛应用于社交网络、知识图谱分析,推荐读者使用。这是非常基础的一篇文章,重点讲解Gephi使用方法,希望对大家有所帮助。

杨秀璋的专栏 1万+

精密加工零件自动报价智能体设计与实现

摘要 本文设计并实现了一个精密加工零件自动报价智能体系统。该系统通过计算机视觉和几何分析技术,自动读取3D图纸(STEP/STL格式),提取影响加工成本的几何特征,实现精准报价。系统采用模块化设计,包含3D模型解析、特征提取、成本计算和报价生成四个核心模块。关键技术包括:使用PythonOCC处理STEP文件,Trimesh处理STL网格;实现体积、表面积、包围盒等基础几何量计算;开发特征提取算法识别复杂曲面、深孔等加工难点;基于规则库进行可加工性评分和成本估算。相比传统人工报价方式,该系统能显著提高报价效

AI的内部世界的博客 112

Linux:fork()函数详解:原理、用法及经典面试题解析

fork()是Linux/Unix系统中用于创建新进程的系统调用。它通过复制当前进程(父进程)来创建一个全新的进程(子进程)。调用一次,返回两次(父进程和子进程各返回一次)子进程是父进程的完整副本通过返回值区分父子进程合理使用wait()避免僵尸进程理解写时复制机制有助于性能优化创建并行处理任务实现网络服务器的并发模型执行外部程序(通常配合exec()系统函数)掌握fork()是Linux系统编程的基础,也是区分初级和中级程序员的重要标志。建议大家多动手实践,加深理解!

2301_78626750的博客 793

zabbix系列:内存VM.MEMORY.SIZE监控之total、free、pused、available 参数说明

free -m buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的. zabbix Web total:1046/1024=1.02G Available:216/1046=20.65% zabbix参数 total- 总物理内存. free- 可用内存. active- 内存当前使用或最近使用,所以它在RAM中。 inactive- 未使用内存. wired- 被标记为始终驻留在RAM中的内...

NIO4444 5668

Linux系统中fork()函数的理解,2024年最新字节跳动+阿里+华为+腾讯等大厂网络安全面试题

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!【完整版领取方式在文末!!

sheji510的博客 431

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

当 fork()遇上for循环, 使用fork()函数的坑,请你注意!

如果不了解什么是fork()函数,欢迎阅读我的另一篇博客 函数可以有两个返回值?初探神奇的fork()函数 warning 1 fork()函数自身不保证子进程和父进程的执行顺序 比如当我们执行几次程序就会发现 虽然每次都是先打印父进程,再打印子进程,但是两次父子进程从属关系都发生了改变 先看第一次执行的结果: PID为2236的父进程创建了一个PID为2237的子进程 但...

wck0617 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

秒杀linux下系统调用fork()面试题

秒杀linux下系统调用fork()面试题 第一道题(在之前博客也写过这道题:http://blog.youkuaiyun.com/chdhust/article/details/8535915): 题目:请问下面的程序一共输出多少个“-”? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #inc

lavendarWang的专栏 855

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

通过一道面试题谈linux下的fork运行机制

fork()的返回值指明的是进程运行的上下文环境。 如: pid_t pid; pid = fork(); if(pid>0) { /*如果返回值大于零,表明处于父进程上下文环境中,返回值是子进程的ID号*/ } else if(pid == 0) { /*返回值为零,表明处于子进程上下文环境中*/ } else { /*表烦调用fork发生了错误,但仍处于父进程的上下文*/

buaa_shang的专栏 1341

fork,vfork,system

1.fork()函数 #include pid_t fork(void); 创建一个子进程。 正确返回:父进程中返回子进程的进程号;子进程中返回0;(返回两次,父进程和子进程中各返回一次) 错误返回:-1;(父进程中返回) 2.vfork()函数 #include pid_t vfork(void); 创建一个子进程,阻塞父进程。vfork创建新进程的主要目的在于用exec函数执

gpengtao的专栏 3447

Linux系统中fork()函数的理解,吐血整理

的主要用途之一是创建新的进程来执行不同的任务,这在多进程编程中非常有用。例如,在服务器编程中,父进程可以监听网络连接,而子进程可以处理实际的客户端请求。都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?5、LVS、Nginx、HAproxy有什么区别?7、Tomcat和Resin有什么区别,工作中你怎么选择?

2401_84141219的博客 607

44-fork()复制进程

一:知识点 1.fork()复制进程(但是不是复制代码) 2.进程:进程就是一个正在执行的程序 3.程序和进程不同 程序:像是菜谱 main.exe/main 进程:照着菜谱在厨房做菜的过程(正在进行) ./main 4.PCB:进程控制块 P进程C控制B块 5.复制出来的子进程并不是从头开始运行的,而是从fork()后面的语句开始执行 6.两个程序同时执行,执行结果交替输出,父进程先打印子进程再打印和子进程先打印父进程再打印没有关系,都是正确的,多进程的运行结果可能是不确定的,但是都是正确的 7

weixin_45964837的博客 584

Linux进程创建及同步实验(fork()函数使用,生产者-消费者问题的p,v操作)

这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?这些函数具体用法大家可以亲自尝试一下,网上都有各种说明,在这不做过多说明;6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?5、LVS、Nginx、HAproxy有什么区别?第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。7、Tomcat和Resin有什么区别,工作中你怎么选择?

m0_57540655的博客 861
上一篇: 进程的创建之fork()函数
下一篇: 定长顺序表
IT_model
博客等级 码龄9年 61粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值