当前位置: 首页 > article >正文

【计算机网络】fork()+exec()创建新进程(僵尸进程及孤儿进程)

文章目录

  • 一、基本概念
    • 1. fork() 系统调用
    • 2. exec() 系列函数
  • 二、典型使用场景
    • 1. 创建子进程执行新程序
    • 2. 父子进程执行不同代码
  • 三、核心区别与注意事项
  • 四、组合使用技巧
    • 1. 重定向子进程的输入/输出
    • 2. 创建多级子进程
  • 五、常见问题与解决方案
    • 僵尸进程(Zombie Process)
    • 孤儿进程(Orphan Process)
  • 六、总结

在UNIX/Linux系统中,fork() 和 exec() 是创建和运行新进程的核心系统调用。以下是它们的详细解释和典型用法。

一、基本概念

1. fork() 系统调用

功能:创建当前进程的一个子进程,子进程是父进程的几乎完全复制(包括内存空间、文件描述符等)。
返回值:
父进程:返回子进程的进程ID(PID,正整数)。
子进程:返回0。
错误:返回-1(如内存不足或进程数达到上限)。

2. exec() 系列函数

功能:用新程序替换当前进程的内存空间、代码段和数据段,执行新程序。
常见函数:

execl(const char *path, const char *arg, ...);
execv(const char *path, char *const argv[]);
execle(const char *path, const char *arg, ..., char *const envp[]);
execve(const char *path, char *const argv[], char *const envp[]);
execlp(const char *file, const char *arg, ...);
execvp(const char *file, char *const argv[]);

区别:l 表示参数列表(list),v 表示参数数组(vector),p 表示自动搜索PATH路径,e 表示自定义环境变量。

二、典型使用场景

1. 创建子进程执行新程序

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid = fork();  // 创建子进程if (pid < 0) {       // 错误处理perror("fork failed");exit(EXIT_FAILURE);} else if (pid == 0) {  // 子进程// 执行新程序(如/bin/ls)execl("/bin/ls", "ls", "-l", NULL);// 如果exec返回,说明执行失败perror("exec failed");exit(EXIT_FAILURE);} else {  // 父进程int status;waitpid(pid, &status, 0);  // 等待子进程结束printf("Child process exited with status %d\n", WEXITSTATUS(status));}return 0;
}

执行流程:

父进程调用 fork() 创建子进程。
子进程调用 execl() 加载 /bin/ls 程序,替换自身代码。
父进程通过 waitpid() 等待子进程结束,并获取退出状态。

2. 父子进程执行不同代码

#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork failed");} else if (pid == 0) {  // 子进程printf("Child process (PID=%d)\n", getpid());// 子进程逻辑...} else {  // 父进程printf("Parent process (PID=%d, Child PID=%d)\n", getpid(), pid);// 父进程逻辑...}return 0;
}

关键点: 父子进程通过 fork() 的返回值区分执行逻辑。 子进程继承父进程的文件描述符和内存状态(但后续修改互不影响)。

三、核心区别与注意事项

在这里插入图片描述

四、组合使用技巧

1. 重定向子进程的输入/输出

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>int main() {pid_t pid = fork();if (pid == 0) {  // 子进程// 重定向标准输出到文件int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);dup2(fd, STDOUT_FILENO);  // 将标准输出(1)替换为文件描述符fdclose(fd);// 执行ls命令,输出会写入文件而非终端execl("/bin/ls", "ls", "-l", NULL);perror("exec failed");} else {wait(NULL);  // 等待子进程结束printf("Output redirected to output.txt\n");}return 0;
}

2. 创建多级子进程

#include <stdio.h>
#include <unistd.h>int main() {pid_t pid1 = fork();if (pid1 == 0) {  // 一级子进程printf("First child (PID=%d)\n", getpid());pid_t pid2 = fork();if (pid2 == 0) {  // 二级子进程printf("Second child (PID=%d, Parent=%d)\n", getpid(), getppid());} else {wait(NULL);  // 一级子进程等待二级子进程}} else {wait(NULL);  // 父进程等待一级子进程}return 0;
}

五、常见问题与解决方案

僵尸进程(Zombie Process)

问题:子进程结束后,父进程未调用 wait() 获取其退出状态,导致子进程残留进程表项。
解决方案:
父进程通过 wait() 或 waitpid() 回收子进程资源。
信号处理:捕获 SIGCHLD 信号并在处理函数中调用 wait()。

孤儿进程(Orphan Process)

问题:父进程先于子进程结束,子进程被init进程(PID=1)收养。
影响:孤儿进程仍可正常运行,但可能导致资源管理复杂化。
exec() 失败处理
原因:路径错误、权限不足、文件损坏等。
检查方法:调用 exec() 后立即检查返回值(若返回则表示失败),并通过 errno 获取具体错误码。

六、总结

fork() 用于创建新进程,父子进程并行执行相同代码(通过返回值区分逻辑)。
exec() 用于加载并执行新程序,替换当前进程的内存空间。
组合使用:先 fork() 创建子进程,再在子进程中 exec() 执行新程序,实现多任务处理。
理解这两个系统调用是掌握UNIX/Linux进程管理的基础,在开发多进程应用(如服务器、shell脚本解释器)时尤为重要。

相关文章:

【计算机网络】fork()+exec()创建新进程(僵尸进程及孤儿进程)

文章目录 一、基本概念1. fork() 系统调用2. exec() 系列函数 二、典型使用场景1. 创建子进程执行新程序2. 父子进程执行不同代码 三、核心区别与注意事项四、组合使用技巧1. 重定向子进程的输入/输出2. 创建多级子进程 五、常见问题与解决方案僵尸进程&#xff08;Zombie Proc…...

QPS 和 TPS 详解

QPS 和 TPS 是性能测试中的两个核心指标&#xff0c;用于衡量系统的吞吐能力&#xff0c;但关注点不同。以下是具体解析&#xff1a; 1. QPS&#xff08;Queries Per Second&#xff09; 定义&#xff1a;每秒查询数&#xff0c;表示系统每秒能处理的请求数量&#xff08;无论…...

Word表格怎样插入自动序号或编号

在Word文档中编辑表格时&#xff0c;经常需要为表格添加序号或编号&#xff0c;可以设置为自动序号或编号&#xff0c;当删除行时&#xff0c;编号会自动变化&#xff0c;不用手工再重新编号。如图所示。 序号数据1数据21300300230030033003004300300 一&#xff0c;建立word表…...

数据结构:导论

目录 什么是“第一性原理”&#xff1f; 什么是“数据结构”&#xff1f; 数据结构解决的根本问题是什么&#xff1f; 数据结构的两大分类 数据结构的基本操作 数据结构与算法的关系 学习数据结构的底层目标 什么是“第一性原理”&#xff1f; 在正式进入数据结构之前&…...

青少年编程与数学 02-020 C#程序设计基础 13课题、数据访问

青少年编程与数学 02-020 C#程序设计基础 13课题、数据访问 一、使用数据库1. 使用ADO.NET连接数据库连接SQL Server示例连接其他数据库 2. 使用Entity Framework (EF Core)安装EF Core示例代码 3. 数据绑定到WinForms控件DataGridView绑定简单控件绑定 4. 使用本地数据库(SQLi…...

无人机仿真环境(3维)附项目git链接

项目概述 随着无人机技术在物流、测绘、应急救援等领域的广泛应用&#xff0c;其自主导航、避障算法、路径规划及多机协同等核心技术的研究需求日益迫切。为降低实地测试成本、提高研发效率&#xff0c;本项目旨在构建一个高精度、可扩展的​​无人机三维虚拟仿真环境​​&…...

湖北理元理律师事务所:债务优化中的“生活锚点”设计

在债务重组领域&#xff0c;一个常被忽视的核心矛盾是&#xff1a;还款能力与生存需求的冲突。过度压缩生活支出还债&#xff0c;可能导致收入中断&#xff1b;放任债务膨胀&#xff0c;又加剧精神压力。湖北理元理律师事务所通过“三步平衡法”&#xff0c;尝试在法理框架内破…...

Python 训练营打卡 Day 30-模块和库的导入

模块和库的导入 1.1标准导入 import mathprint("方式1: 使用 import math") print(f"圆周率π的值: {math.pi}") print(f"2的平方根: {math.sqrt(2)}\n") 1.2从库中导入特定项 from math import pi, sqrtprint("方式2&#xff1a;使用 f…...

前端实现图片压缩:基于 HTML5 File API 与 Canvas 的完整方案

在 Web 开发中,处理用户上传的图片时,前端压缩可以有效减少服务器压力并提升上传效率。本文将详细讲解如何通过<input type="file">实现图片上传,结合 Canvas 实现图片压缩,并实时展示压缩前后的图片预览和文件大小对比。 一、核心功能架构 我们将实现以…...

【Docker管理工具】部署Docker管理面板DweebUI

【Docker管理工具】部署Docker管理面板DweebUI 一、DweebUI介绍1.1 DweebUI 简介1.2 主要特点1.3 使用场景 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载DweebUI镜像五、…...

【后端高阶面经:架构篇】50、数据存储架构:如何改善系统的数据存储能力?

一、数据存储架构设计核心原则 (一)分层存储架构:让数据各得其所 根据数据访问频率和价值,将数据划分为热、温、冷三层,匹配不同存储介质,实现性能与成本的平衡。 热数据层:访问频率>100次/秒。采用Redis集群存储高频访问数据(如用户登录态、实时交易数据),配合…...

编程之巅:语言的较量

第一章&#xff1a;代码之城的召集令 在遥远的数字大陆上&#xff0c;有一座名为“代码之城”的神秘都市。这里居住着各种编程语言的化身&#xff0c;他们以拟人化的形态生活&#xff0c;每种语言都有独特的性格与技能。Python是个优雅的学者&#xff0c;C是个硬核战士&#x…...

STM32 通过 ESP8266 通信详解

✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢迎关注我的知乎&#xff1a;对error视而不见 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领…...

Qt/C++开发监控GB28181系统/sip协议/同时支持udp和tcp模式/底层协议解析

一、前言说明 在gb28181-2011协议中&#xff0c;只有udp要求&#xff0c;从2016版本开始要求支持tcp&#xff0c;估计也是在多年的实际运行过程中&#xff0c;发现有些网络环境差的场景下&#xff0c;一些udp交互指令丢失导致功能异常&#xff0c;所以后面修订的时候增加了tcp…...

晨控CK-FR03与汇川H5U系列PLC配置MODBUS TCP通讯连接操作手册

晨控CK-FR03与汇川H5U系列PLC配置MODBUS TCP通讯连接操作手册 CK-FR03-TCP是一款基于射频识别技术的高频RFID标签读卡器&#xff0c;读卡器工作频率为13.56MHZ&#xff0c;支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读取。 读卡器同时支持标准工业通讯协…...

山海鲸轻 3D 渲染技术深度解析:预渲染如何突破多终端性能瓶颈

在前期课程中&#xff0c;我们已系统讲解了山海鲸两大核心渲染模式——云渲染与端渲染的技术特性及配置方法。为满足复杂场景下的差异化需求&#xff0c;山海鲸创新推出轻3D渲染功能&#xff0c;本文将深度解析该技术的实现原理与操作实践。 一、轻3D功能研发背景 针对多终端协…...

t014-项目申报管理系统 【springBoot 含源码】

项目演示视频 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;项目信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行…...

阻止H5页面中键盘收起的问题

在移动端H5开发中&#xff0c;当输入框失去焦点时&#xff0c;键盘会自动收起&#xff0c;但有时我们需要阻止这种行为。以下是几种解决方案&#xff1a; 常见原因 输入框失去焦点触发键盘收起页面滚动或触摸其他区域导致键盘收起某些浏览器(特别是iOS Safari)的默认行为 解…...

将 AI 解答转换为 Word 文档

相关说明 DeepSeek 风靡全球的2025年&#xff0c;估计好多人都已经试过了&#xff0c;对于理科老师而言&#xff0c;有一个使用痛点&#xff0c;就是如何将 AI 输出的 mathjax 格式的符号转化为我们经常使用的 mathtype 格式的&#xff0c;以下举例说明。 温馨提示&#xff1…...

AI 产品的 MVP 构建逻辑:Prompt 工程 ≠ 产品工程?

一、引言&#xff1a;技术细节与系统工程的本质分野 在 AI 产品开发的战场中&#xff0c;Prompt 工程与产品工程的边界模糊正在引发深刻的认知革命。当工程师们沉迷于优化 “请用三段式结构分析用户需求” 这类提示词时&#xff0c;产品经理却在思考如何通过用户行为数据验证 …...

Go语言开发的GMQT物联网MQTT消息服务器(mqtt Broker)支持海量MQTT连接和快速低延时消息传输-提供源码可二次开发定制需求

关于GMQT物联网MQTT消息平台 GoFly社区推出《GMQT物联网MQTT消息平台》&#xff0c;完全使用高性能的Go语言编写&#xff0c;内嵌数据库(不依赖三方库)&#xff0c; 全面支持MQTT的v3.0.0、v3.1.1以及完全兼容 MQTT v5 功能。利用Go语言高并发性、高效利用服务器资源、跨平台支…...

JavaScript es6 语法 map().filter() 链式调用,语法解析 和常见demo

摘要&#xff1a; map&#xff1a;遍历数组并对每个元素执行回调函数&#xff0c;返回一个新数组 filter&#xff1a;对 map 返回的数组进行过滤&#xff0c;返回满足条件的元素组成的新数组 1.数字数组处理 const numbers [1, 2, 3, 4, 5];// 先平方&#xff0c;再筛选偶数…...

leetcode2221. 数组的三角和-medium

1 题目&#xff1a;数组的三角和 官方标定难度&#xff1a;中 给你一个下标从 0 开始的整数数组 nums &#xff0c;其中 nums[i] 是 0 到 9 之间&#xff08;两者都包含&#xff09;的一个数字。 nums 的 三角和 是执行以下操作以后最后剩下元素的值&#xff1a; nums 初始…...

Express教程【001】:Express创建基本的Web服务器

文章目录 1、初识express1.1 什么是Express1.2 主要特点1.3 Express的基本使用1.3.1 安装1.3.2 创建基本的Web服务器 1、初识express 目标&#xff1a; 能够使用express.static()快速托管静态资源能够使用express路由精简项目结构能够使用常见的express中间件能够使用express创…...

asio之async_result

简介 async_result用来表示异步处理返回类型 async_result 是类模板 type&#xff1a;为类模板中声明的类型&#xff0c;对于不同的类型&#xff0c;可以使用类模板特例化&#xff0c;比如针对use_future...

代码随想录算法训练营 Day60 图论Ⅹ Bellmen_ford 系列算法

图论 题目 94. 城市间货物运输 I Bellmen_ford 队列优化算法 SPFA 大家可以发现 Bellman_ford 算法每次松弛 都是对所有边进行松弛。 但真正有效的松弛&#xff0c;是基于已经计算过的节点在做的松弛。 本图中&#xff0c;对所有边进行松弛&#xff0c;真正有效的松弛&#…...

独立机构软件第三方检测:流程、需求分析及电商软件检验要点?

独立机构承担着对软件进行第三方检测的任务&#xff0c;这一环节对于提升软件的质量和稳定性起到了极其关键的作用。检测过程拥有一套完善的流程&#xff0c;目的在于确保检测结果的精确性&#xff0c;并保障软件达到高标准。 需求分析 确保软件测试需求清晰十分关键。我们需…...

Java构建Tree并实现节点名称模糊查询

乐于学习分享… 大家加油努力 package com.tom.backtrack;import lombok.Data; import lombok.Getter;import java.util.ArrayList; import java.util.List; import java.util.Objects;/*** 树节点** author zx* date 2025-05-27 19:51*/ Data public class TreeNode {private …...

shadcn/ui

文章目录 前言✅ 核心特点&#x1f4e6; 支持组件&#xff08;常用&#xff09;&#x1f680; 安装使用&#xff08;框架支持&#xff09;初始化&#xff08;Next.js 项目为例&#xff09;添加一个组件 &#x1f9e0; 对比其他组件库&#x1f4d8; 官方资源✅ 总结✅ 功能特性&…...

华为FreeArc能和其他华为产品共用充电线吗?

最近刚买的FreeArc终于到手啦&#xff0c;看到网上有朋友说&#xff0c;这次的耳机是不附带充电线&#xff0c;开箱后发现果真如此&#xff0c;那FreeArc到底用什么规格的充电线&#xff0c;能不能和华为的Type-C数据线通用&#xff0c;我来给大家解答一下吧&#xff01; Free…...