服务器进程为何通常fork()两次

fork的使用和多次fork产生的一系列问题 看这样一道题:这个程序有几个进程,输出几个'-'? #include #include int main() { int i; for(i = 0; i < 2; ++i) { fork(); printf("-"); fflush(stdout); } return 0; } 要判断几个进程必须知道程 阅读详情

 前几天接到某互联网公司的电话面试,面试官问我两次fork()的作用,我一头雾水,说不知道。知识面还是太窄了。下面就总结下两次fork()的作用。

 

首先,要了解什么叫僵尸进程,什么叫孤儿进程,以及服务器进程运行所需要的一些条件。两次fork()就是为了解决这些相关的问题而出现的一种编程方法。

 孤儿进程

        孤儿进程是指父进程在子进程结束之前死亡(return 或exit)。如下图1所示:

图1  孤儿进程

但是孤儿进程并不会像上面画的那样持续很长时间,当系统发现孤儿进程时,init进程就收养孤儿进程,成为它的父亲,child进程exit后的资源回收就都由init进程来完成。

 

僵尸进程

         僵尸进程是指子进程在父进程之前结束了,但是父进程没有用wait或waitpid回收子进程。如下图所示:

     

图2   僵尸进程

         父进程没有用wait回收子进程并不说明它不会回收子进程。子进程在结束的时候会给其父进程发送一个SIGCHILD信号,父进程默认是忽略SIGCHILD信号的,如果父进程通过signal()函数设置了SIGCHILD的信号处理函数,则在信号处理函数中可以回收子进程的资源。

      事实上,即便是父进程没有设置SIGCHILD的信号处理函数,也没有关系,因为在父进程结束之前,子进程可以一直保持僵尸状态,当父进程结束后,init进程就会负责回收僵尸子进程。

      但是,如果父进程是一个服务器进程,一直循环着不退出,那子进程就会一直保持着僵尸状态。虽然僵尸进程不会占用任何内存资源,但是过多的僵尸进程总还是会影响系统性能的。黔驴技穷的情况下,该怎么办呢?

         这个时候就需要一个英雄来拯救整个世界,它就是两次fork()技法。

两次fork()技法

         两次fork()的流程如下所示:

图3    两次fork的控制流

       如上图3所示,为了避免子进程child成为僵尸进程,我们可以人为地创建一个子进程child1,再让child1成为工作子进程child2的父进程,child2出生后child1退出,这个时候child2相当于是child1产生的孤儿进程,这个孤儿进程由系统进程init回收。这样,当child2退出的时候,init就会回收child2的资源,child2就不会成为孤魂野鬼祸国殃民了。

 

   <unix环境高级编程>这本书里提供了两次fork的一个例子,代码如下:

[cpp]  view plain copy
  1. int main(void)  
  2. {  
  3.     pid_t        pid;  
  4.   
  5.     if ( (pid = fork()) < 0)  
  6.           err_sys("fork error");  
  7.     else if (pid == 0)   
  8.         {                /* first child */  
  9.            if ( (pid = fork()) < 0)  
  10.                         err_sys("fork error");  
  11.            else if (pid > 0)  
  12.                  exit(0);        /* parent from second fork == first child */  
  13.   
  14.                 /* We're the second child; our parent becomes init as soon 
  15.                    as our real parent calls exit() in the statement above. 
  16.                    Here's where we'd continue executing, knowing that when 
  17.                    we're done, init will reap our status. */  
  18.   
  19.             sleep(2);  
  20.             printf("second child, parent pid = %d\n", getppid());  
  21.             exit(0);  
  22.         }  
  23.   
  24.     if (waitpid(pid, NULL, 0) != pid)        /* wait for first child */  
  25.             err_sys("waitpid error");  
  26.   
  27.         /* We're the parent (the original process); we continue executing, 
  28.            knowing that we're not the parent of the second child. */  
  29.   
  30.     exit(0);  
  31. }  
  32.        理所当然,第二个子进程的父进程是进程号为1的init进程。  

         一言以蔽之,两次fork()是人为地创建一个工作子进程的父进程,然后让这个人为父进程退出,之后工作子进程就由init回收,避免了工作子进程成为僵尸进程。

服务器两次fork()的目的 下面总结下两次fork()的作用。 首先,要了解什么叫僵尸进程,什么叫孤儿进程,以及服务器进程运行所需要的一些条件。两次fork()就是为了解决这些相关的问题而出现的一种编程方法。 孤儿进程         孤儿进程是指父进程在子进程结束之前死亡(return 或exit)。如下图1所示: 2013-8-15 14:15:06 上传 下载附件 (9.72 KB) 阅读详情

相关推荐

Linux fork()函数原理与多进程创建分析

进程创建是操作系统核心功能之一,Linux通过fork()系统调用实现进程复制。其核心原理采用写时复制技术,在保持进程隔离性的同时优化性能。fork()的独特之处在于一次调用两次返回,通过返回值区分父子进程执行流。这种机制在服务器并发处理、Shell命令执行等场景有重要应用价值。以经典的三重fork()面试题为例,通过进程树分析可以深入理解多级进程创建过程,每个fork()调用会使进程数翻倍,最终形成满二叉树结构。掌握这些原理对Linux系统编程和面试准备都至关重要。

weixin_35757191的博客 554

僵死进程,孤儿进程,wait

一,僵死进程: 子进程先于父进程结束, 产生条件:父进程没有使用wait()调用子进程的退出码,那么子进程就成为僵 死进程; 解决办法:在父进程中使用wait(); 产生僵死进程: #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<assert.h> int main() { char *s=NULL; pid_t pid=fork(); int n=0;

weixin_45510561的博客 470

SRA数据库

简介 序列读取存档(sequence Read Archive,SRA)数据是可通过多个云提供商和NCBI服务器获得的,它是最大的可公开获得的高通量测序数据存储库。 SRA接受来自生活各个部门以及宏基因组学和环境调查的数据。 SRA存储原始测序数据和比对信息,以提高可重复性并通过数据分析促进新发现。 NCBI网站储存二代测序原始数据的数据库 SRA官网 从Entrez搜索结果中下载SRA序列 例如查找SRA Entrez中BALB / c小鼠淋巴结组织的RNA-Seq记录 获取搜索结果 SRA se

qq_44520665的博客 5907

守护进程为什么需要两次fork

linux守护进程为什么需要两次fork

jinking01的专栏 461

Matlab蒙特卡洛模拟二维伊辛模型相变过程

一、什么是伊辛模型 伊辛(Ising)模型是描述磁系统相变最简单的模型,但模型里自旋之间的相互作用赋予了它奇妙的特性,最有趣的就是对称性破缺。这一模型可以被推广用于研究连续的量子相变、基本粒子超弦理论、动力学临界行为等,甚至被认为可以描述深林火灾、交通拥堵、舆论传播等社会经济现象。 如图,每个格点的方向只有向上或向下两者状态,但临近的自旋之间有相互作用,而且点阵可以是一维、二维、三维、甚至更高维...

http://www.icfgblog.com/ 2万+

166、电流环带宽测试

本文分享了电流环带宽测试的实战经验,揭示了常见误区:误将系统其他环节(如PWM、ADC、传感器)的延迟当作电流环性能。强调带宽测试需先断开速度/位置环,采用扫频法注入正弦信号,结合伯德图分析幅值与相位响应。关键点包括:控制频率步进为对数、确保采样时序精准、避免传感器带宽限制影响结果。文中指出“假带宽”现象(如鼓包、增益超0dB)多源于非线性或机械共振,建议遵循“先开环后闭环”“带宽非越高越好”“阶跃验证”三原则,并建立出厂基准曲线以支持后期故障诊断。

2401_88858637的博客 175

关于两次fork

两次fork()的作用 首先,要了解什么叫僵尸进程,什么叫孤儿进程,以及服务器进程运行所需要的一些条件。两次fork()就是为了解决这些相关的问题而出现的一种编程方法。 孤儿进程     孤儿进程是指父进程在子进程结束之前死亡(return 或exit)。如下图1所示:     在一定时间内,当系统发现孤儿进程时,init进程就收养孤儿进程,成为它的父亲,child进程exit

狂客队长 1356

【2026最新版】PCL点云处理算法汇总(C++长期更新版)

PCL学习目录。博客长期更新,最近一次更新时间为:2026年10月4日。

点云侠的博客 63万+

服务器进程fork()两次的原因

作为一个服务器进程,是需要不断运行的,不能够 退出的进程,但是如何保证服务器进程运行过程中不会因为子进程而影响服务器的性能呢?这里来阐述服务器进程父进程创建子进程之后会带来的一些问题,以及如何解决这些问题。 服务器进程fork()一次,产生一个子进程,作为工作进程,当这个工作进程运行结束之后,向父进程发送SIGCHILD信号,默认情况下,父进程会忽略这个信号,除非采用signal()信号处理函数

xwact的专栏 748

3D iToF深度分辨率测量

本文展示了RGB-D传感器在三维测量中的高精度表现。标靶深度图显示其具备清晰、低噪、无干扰的特性,点云数据完整度高且轮廓分明。该技术已成功应用于物流(体积测量误差<1%)、工业(高反光部件装配检测)和农业(果蔬成熟度分级)等领域,验证了其硬件和算法的可靠性,能够满足不同场景下的三维测量需求。

dream it possible 252

国家自然基金研究方向选定后,关键词只能下拉吗?——不是的,国家自然科学基金(NSFC)的关键词并不是只能下拉选择,而是:[特殊字符] “可选 + 可填”的混合模式(但以规范词为主)

你可以手动输入关键词用于表达新兴方向或细分领域✔ 适用情况:新概念(如“电场调控纳米流体”)交叉领域(如“电流体力学传热耦合”)电场调控电流体力学可以自己填,但必须以系统标准关键词为主,自定义为辅如果你愿意,我可以帮你做一件更关键的事:👉根据你题目,反向设计“最容易中标”的关键词组合 + 学科代码搭配这个比写内容本身还更影响送审质量。你可以手动输入关键词用于表达新兴方向或细分领域✔ 适用情况:新概念(如“电场调控纳米流体”)交叉领域(如“电流体力学传热耦合”)电场调控电流体力学。

qq_15963745的博客 81

linux服务器进程为何通常fork()两次

首先,要了解什么叫僵尸进程,什么叫孤儿进程,以及服务器进程运行所需要的一些条件。两次fork()就是为了解决这些相关的问题而出现的一种编程方法。 孤儿进程 孤儿进程是指父进程在子进程结束之前死亡(return 或exit)。如下图所示: 但是孤儿进程并不会像上面画的那样持续很长时间,当系统发现孤儿进程时,init进程就收养孤儿进程,成为它的父亲,child进程exit后的

黎明前的沉睡 636

【个人学习总结】CRC校验原理及实现

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 ..................

星Yeah 的博客 7967

进程fork()两次---解决一个进程不必等待子进程终止,也不希望子进程处于僵死状态(一般是服务器进程fork())

首先,要了解什么叫僵尸进程,什么叫孤儿进程,以及服务器进程运行所需要的一些条件。两次fork()就是为了解决这些相关的问题而出现的一种编程方法。  孤儿进程         孤儿进程是指父进程在子进程结束之前死亡(return 或exit)。如下图1所示: 图1  孤儿进程 但是孤儿进程并不会像上面画的那样持续很长时间,当系统发现孤儿进程时,init进程就收养孤儿进

想法驱动实践! 2652

大数据领域数据产品的交通运输行业应用

您是否经历过早高峰被堵在桥上,看着导航显示“前方5公里缓行”却无能为力?是否见过货车司机绕远路导致成本飙升?这些“交通痛点”的背后,是传统交通管理依赖经验决策的局限。本文将聚焦“大数据数据产品”这一核心工具,从技术原理到实际应用,全面解析它如何为交通运输行业“开天眼”,解决从城市拥堵到物流效率的一系列难题。本文将按照“问题引入→概念拆解→技术原理→实战案例→应用场景→未来趋势”的逻辑展开,用生活化比喻降低理解门槛,用代码和数学模型提升专业性,最终帮您建立“大数据+交通”的完整认知框架。交通数据。

操作系统内核探秘的博客 236

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

进程fork两次---解决一个进程不必等待子进程终止,也不希望子进程处于僵死状态

总结下两次fork()的作用 首先,要了解什么叫僵尸进程,什么叫孤儿进程,以及服务器进程运行所需要的一些条件。两次fork()就是为了解决这些相关的问题而出现的一种编程方法。 孤儿进程 孤儿进程是指父进程在子进程结束之前死亡(return 或exit)。如下图1所示: 图1 孤儿进程 但是孤儿进程并不会像上面画的那样持续很长时间,当系统发现孤儿进程时,ini...

Arthas的博客 700

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

守护进程及其编程流程

脱离终端、在 Linux 后台长期稳定运行的进程,关闭终端不会导致进程退出,不受终端信号影响(如 nginx、sshd 都是守护进程)

m0_56799144的博客 632

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 集中优势兵力,单点突破
下一篇: 条件变量pthread_cond_t怎么用
flymachine
博客等级 码龄23年 253粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值