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、

产品经理如何运用AI提升工作效率

AI技术的应用为产品经理的工作流程带来了显著的效率提升。从需求收集到产品上线,AI可以在多个阶段提供智能化支持,帮助产品经理更好地理解用户需求、优化产品设计、提高开发和测试效率。在未来,随着AI技术的不断发展,产品经理将能够更加高效地管理产品生命周期,为用户提供更优质的产品体验。应用 | AI + 千行百业欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

不想宅的冷同学 1337

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

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

m0_62689947的博客 462

移远EC800M CAT1模块HTTP POST实战:从AT指令到OneNet平台数据上报(附STM32代码)

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报到OneNet平台的完整流程,包含STM32实战代码。内容涵盖PDP上下文激活、HTTP服务配置、JSON数据包构建等关键技术要点,并提供硬件连接、状态机设计和错误处理等实用方案,助力开发者快速实现物联网设备稳定数据传输。

weixin_42565652的博客 508

面试题目--fork

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

weixin_75188368的博客 412

Android 中 app freezer 原理详解(二):S 版本

在之前的两篇博文《Android 中app内存回收优化(一)》和《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理,为什么叫这个名字,而不叫 AppCompact 等?freezer,一个针对应用进程长期处于 Cached 状态的优化。在之前博文《app freezer 原理 R 版本》

私房菜 3611

从苏宁电器到卡巴斯基(第二部)第14篇:我在卡巴的日子 XIV

目录 WannaCry 我的感慨 邻里矛盾 WannaCry 如果大家对于科技互联网圈子的新闻比较感兴趣的话,相信会对2017年5月的“WannaCry勒索病毒”事件记忆犹新,因为这个病毒在当时的全世界范围内掀起了极大的波澜,众多的企事业单位深受其害,造成的金钱和数据损失难以估量,从某种意义上来说,它甚至引领了勒索病毒新一轮的爆发浪潮。而通过这样的一次爆发,也让我对于卡巴斯基的技术实力有了更进一步的了解。 我记得很清楚,爆发的那天是周六,没记错的话Seth那天有事,就请假没来,只有我自己在公司值

Gleam的专栏 4919

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

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

aoeaoao的博客 357

国科大学习资料--机器人智能控制_袁如意老师PPT后习题答案(学长精心整理)

人工神经元激活函数的作用是什么? 答:激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。 人工神经网络的学习规则有哪些?各有何特征? 答:大类可以分为无监督学习算法、有监督学习算法和强化学习。其中无监督学习算法指只有输入信息,没有期望的输出信息,如Hebb学习规则,神经元连接强度的变化与两个相互连接的神经元的激活水平成正比。竞争学习法则:网络各输出单元相互竞争,最后达到只有一个最强者激活。有监督学习算法指同时提供输入信息和对应的期望输出信息,如误差学习(Delta学

无名何许人的博客 1486

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

TIA Portal (博图) -两台不同网段S7-1200通信(上)

因为不同网段意味着它们默认不在同一个广播域,并且没有网关设备来处理路由,所以标准的 TCP/IP 通信(如 `TSEND_C`/`TRCV_C`)无法直接建立连接。S7 通信 (PUT/GET): 最简单,配置好连接后,在客户端 PLC 使用 `PUT` 指令发送数据到服务器 PLC,使用 `GET` 指令从服务器 PLC 读取数据。* 在地址详细信息中,确保 本地连接端点是客户端 PLC 的接口,远程连接端点是服务器 PLC 的接口和 IP (`192.168.2.20`)。

电工 2680

STC单片机 普通 I/O 口中断功能介绍和使用

STC32单片机 普通 I/O 口中断功能介绍和使用

perseverance51博客 3048

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

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

2301_78626750的博客 793

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

sheji510的博客 431

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

wck0617 1万+

秒杀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

通过一道面试题谈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、付费专栏及课程。

余额充值