Linux 创建进程 fork()、vfork() 与进程管理
Linux 创建进程 fork、vfork、进程管理
- 一、Linux的0号、1号、2号进程
- 二、Linux的进程标识
- 三、fork() 函数
- 1、基本概念
- 2、函数特点
- 3、用法以及应用场景
- (1)父子进程执行不同的代码
- (2)进程执行另一个程序
- 4、工作原理
- 四、vfork() 函数
- 1、基本概念
- 2、函数特点
- 3、用法以及应用场景
- 4、工作原理
- 五、fork 与 vfork 的比较
- 六、父子进程共享文件的场景
- 示例:父子进程共享文件描述符

在Linux操作系统中,进程是资源分配的基本单位。进程的创建是系统正常运行的重要组成部分。通过理解进程创建的机制,开发者能够更高效地控制系统的资源和多任务处理
一、Linux的0号、1号、2号进程
在Linux操作系统中,进程以树状结构组织。最重要的进程包括0号、1号和2号进程,它们具有特殊的意义:
- 0号进程(系统进程):也被称为swapper或idle进程,是所有进程的祖先,负责初始化系统的基本工作。
- 1号进程(systemd):是系统的初始化进程,负责系统的启动、硬件初始化以及进程管理。它是所有其他进程的父进程。
- 2号进程(kthreadd):是内核线程的管理者,负责内核级线程的创建、管理和调度。
这些进程在系统启动时就已经存在,确保了系统的正常运行。
二、Linux的进程标识
每个进程在Linux系统中都有一个唯一的进程标识符(PID)。进程标识符用于标识和管理进程。除了PID外,还有一些相关的进程标识符:
- PPID(父进程ID):指向父进程的PID。
- PGID(进程组ID):用于管理进程组,多个进程可以组成一个进程组。
- SID(会话ID):代表一组进程的会话标识,通常与终端的会话关联。
在Linux中,进程的创建通常使用fork()系统调用来实现。
三、fork() 函数
1、基本概念
fork()是Unix/Linux系统中用于创建新进程的一个系统调用。调用fork()时,当前进程(父进程)会复制一份新的进程(子进程)。子进程将继承父进程的大部分资源(如文件描述符、环境变量等)。
2、函数特点
- 进程复制:
fork()会复制父进程的虚拟地址空间,但父子进程的实际物理地址不同。 - 内存副本:父进程的堆栈空间和数据空间会被复制到子进程中,父子进程的数据并不共享。
- 顺序不确定:
fork()调用后,父子进程的执行顺序是不可预知的。父进程可能先执行,也可能子进程先执行。
3、用法以及应用场景
(1)父子进程执行不同的代码
在调用fork()后,父子进程各自从fork()返回的位置继续执行代码。父进程和子进程通常执行不同的操作。
#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {// 错误处理perror("fork failed");return 1;}if (pid == 0) {// 子进程执行printf("This is the child process. PID: %d\n", getpid());} else {// 父进程执行printf("This is the parent process. PID: %d\n", getpid());}return 0;
}
运行该代码时,父子进程会并行执行,打印各自的进程ID。
(2)进程执行另一个程序
父进程可以通过fork()创建子进程,然后使用exec()系列函数来让子进程执行不同的程序。这在处理多任务时非常常见。
#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork failed");return 1;}if (pid == 0) {// 子进程执行新的程序execlp("/bin/ls", "ls", "-l", NULL);// 如果 execlp 调用成功,下面的代码不会执行perror("execlp failed");} else {printf("Parent process is running. PID: %d\n", getpid());}return 0;
}
在此示例中,子进程通过execlp()调用执行ls命令。
4、工作原理
fork()系统调用的工作原理基于复制父进程的虚拟内存空间并为子进程创建一个新的进程。虽然父子进程的虚拟地址空间相同,但它们是不同的物理地址。
四、vfork() 函数
1、基本概念
vfork()函数和fork()类似,也用于创建子进程。但是,vfork()不会复制父进程的虚拟内存,而是让父进程暂时停止执行,直到子进程调用exec()或_exit()。这种行为使得vfork()比fork()更高效,尤其在子进程即将调用exec()时。
2、函数特点
- 共享内存空间:
vfork()创建的子进程共享父进程的地址空间,直到子进程调用exec()或_exit()。 - 父进程暂停:父进程会暂停执行,直到子进程完成某些操作(通常是执行新程序或退出)。
3、用法以及应用场景
vfork()通常用于需要子进程快速调用exec()的场景,能够提高效率。
#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = vfork();if (pid < 0) {perror("vfork failed");return 1;}if (pid == 0) {// 子进程执行execlp("/bin/ls", "ls", "-l", NULL);perror("execlp failed");} else {printf("Parent process is waiting. PID: %d\n", getpid());}return 0;
}
4、工作原理
vfork()会让子进程与父进程共享内存空间,父进程在子进程调用exec()或_exit()之前会被挂起,从而避免了不必要的内存复制操作。
五、fork 与 vfork 的比较
| 特性 | fork() | vfork() |
|---|---|---|
| 内存复制 | 复制父进程的内存 | 子进程和父进程共享内存空间 |
| 父进程执行 | 父子进程并行执行 | 父进程暂停,直到子进程执行完毕 |
| 性能 | 较低(内存复制开销) | 较高(减少内存复制,提高效率) |
| 适用场景 | 适用于父子进程都需要独立运行的情况 | 适用于子进程会调用exec()的情况 |
六、父子进程共享文件的场景
在Linux中,父进程和子进程共享文件描述符,这意味着它们对同一个文件的操作可能相互影响。例如,如果父进程和子进程都操作同一个文件描述符,文件的偏移量可能会改变,从而导致输出混合。为了避免这种情况,必须显式地同步文件操作。
示例:父子进程共享文件描述符
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>int main() {int fd = open("test.txt", O_RDWR | O_CREAT, 0644);if (fd == -1) {perror("File open failed");return 1;}pid_t pid = fork();if (pid < 0) {perror("fork failed");return 1;}if (pid == 0) {// 子进程写入文件write(fd, "Hello from child\n", 17);} else {// 父进程写入文件write(fd, "Hello from parent\n", 18);}close(fd);return 0;
}
在这个示例中,父进程和子进程共享fd文件描述符。如果没有适当的同步机制,写入可能会交替进行,从而产生不一致的结果。
相关文章:
Linux 创建进程 fork()、vfork() 与进程管理
Linux 创建进程 fork、vfork、进程管理 一、Linux的0号、1号、2号进程二、Linux的进程标识三、fork() 函数1、基本概念2、函数特点3、用法以及应用场景(1)父子进程执行不同的代码(2)进程执行另一个程序 4、工作原理 四、vfork() 函…...
2025web寒假作业二
一、整体功能概述 该代码构建了一个简单的后台管理系统界面,主要包含左侧导航栏和右侧内容区域。左侧导航栏有 logo、管理员头像、导航菜单和安全退出按钮;右侧内容区域包括页头、用户信息管理内容(含搜索框和用户数据表格)以及页…...
鸿蒙NEXT API使用指导之文件压缩和邮件创建
鸿蒙NEXT API 使用指导 一、前言二、邮件创建1、拉起垂类应用2、 UIAbilityContext.startAbilityByType 原型2.1、wantParam2.2、abilityStartCallback 与 callback 3、拉起邮箱类应用3.1、单纯拉起邮箱应用3.2、传入带附件的邮件 三、压缩文件1、认识 zlib2、压缩处理2.1、单文…...
javaEE-10.CSS入门
目录 一.什么是CSS 编辑二.语法规则: 三.使用方式 1.行内样式: 2.内部样式: 3.外部样式: 空格规范 : 四.CSS选择器类型 1.标签选择器 2.类选择器 3.ID选择器 4.通配符选择器 5.复合选择器 五.常用的CSS样式 1.color:设置字体颜色 2.font-size:设置字体大小 3…...
Spring Boot牵手Redisson:分布式锁实战秘籍
一、引言 在当今的分布式系统架构中,随着业务规模的不断扩大和系统复杂度的日益增加,如何确保多个服务节点之间的数据一致性和操作的原子性成为了一个至关重要的问题。在单机环境下,我们可以轻松地使用线程锁或进程锁来控制对共享资源的访问,但在分布式系统中,由于各个服务…...
制药行业 BI 可视化数据分析方案
一、行业背景 随着医药行业数字化转型的深入,企业积累了海量的数据,包括销售数据、生产数据、研发数据、市场数据等。如何利用这些数据,挖掘其价值,为企业决策提供支持,成为医药企业面临的重大挑战。在当今竞争激烈的…...
[学习笔记] Kotlin Compose-Multiplatform
Compose-Multiplatform 原文:https://github.com/zimoyin/StudyNotes-master/blob/master/compose-multiplatform/compose.md Compose Multiplatform 是 JetBrains 为桌面平台(macOS,Linux,Windows)和Web编写Kotlin UI…...
ubutun系统常用配置
目录 1. 更新系统 2. 安装 vim 文本编辑器 3. 扩展文件系统 4. 设置静态IP地址(可选) 5. 安装图形驱动 6. 安装常用软件 7. 调整启动项 8. 清理系统 9. 配置SSH 10. 安装VNC服务器(可选) 11. 安装桌面环境(…...
PHP函数介绍—get_headers(): 获取URL的响应头信息
概述:在PHP开发中,我们经常需要获取网页或远程资源的响应头信息。PHP函数get_headers()能够方便地获取目标URL的响应头信息,并以数组形式返回。本文将介绍get_headers()函数的用法,以及提供一些相关的代码示例。 get_headers()函…...
web前端录制canvas视频和video的声音,并合并成一个文件进行下载
一、captureStream captureStream是一个Web API方法,用于捕获指定元素的媒体流。该方法通常用于从<video>、<audio>或<canvas>元素中捕获实时视频流或音频流,以便进行进一步的处理,如直播、录制或分析。 captureStr…...
Golang 并发机制-7:sync.Once实战应用指南
Go的并发模型是其突出的特性之一,但强大的功能也带来了巨大的责任。sync.Once是由Go的sync包提供的同步原语。它的目的是确保一段代码只执行一次,而不管有多少协程试图执行它。这听起来可能很简单,但它改变了并发环境中管理一次性操作的规则。…...
【AI实践】Cursor上手-跑通Hello World和时间管理功能
背景 学习目的:熟悉Cursor使用环境,跑通基本开发链路。 本人背景:安卓开发不熟悉,了解科技软硬件常识 实践 基础操作 1,下载安装安卓Android Studio 创建一个empty project 工程,名称为helloworld 2&am…...
深度学习 视频推荐
以下为你呈现一个基于深度学习实现视频推荐的简化代码示例。这里我们使用的是协同过滤思想结合神经网络的方式,借助 TensorFlow 和 Keras 库来构建模型。在这个示例中,假设已有用户对视频的评分数据,目标是预测用户对未评分视频的评分,进而为用户推荐可能感兴趣的视频。 1…...
缓存组件<keep-alive>
缓存组件<keep-alive> 1.组件作用 组件, 默认会缓存内部的所有组件实例,当组件需要缓存时首先考虑使用此组件。 2.使用场景 场景1:tab切换时,对应的组件保持原状态,使用keep-alive组件 使用:KeepAlive | Vu…...
SpringBoot单机模式的极限是什么?为什么会引入分布式?
Spring Boot 单机模式的极限 Spring Boot 单机模式的极限主要体现在以下几个方面: 硬件资源限制: CPU:单机性能受限于 CPU 核心数和主频,无法无限扩展。内存:内存容量有限,无法应对大规模数据处理或高并发…...
【多模态大模型】系列4:目标检测(ViLD、GLIP)
目录 1 ViLD2 GLIP 1 ViLD OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION 从标题就能看出来,作者是把CLIP模型当成一个Teacher,去蒸馏他自己的网络,从而能Zero Shot去做目标检测。 现在的目标检测数据…...
计算机网络结课设计:通过思科Cisco进行中小型校园网搭建
上学期计算机网络课程的结课设计是使用思科模拟器搭建一个中小型校园网,当时花了几天时间查阅相关博客总算是做出来了,在验收后一直没管,在寒假想起来了简单分享一下,希望可以给有需求的小伙伴一些帮助 目录 一、设计要求 二、…...
从零到一:基于Rook构建云原生Ceph存储的全面指南(下)
接上篇:《从零到一:基于Rook构建云原生Ceph存储的全面指南(上)》 链接: link 六.Rook部署云原生CephFS文件系统 6.1 部署cephfs storageclass cephfs文件系统与RBD服务类似,要想在kubernetes pod里使用cephfs&#…...
mysql的语句备份详解
使用mysqldump工具备份(适用于逻辑备份) mysqldump是 MySQL 自带的一个非常实用的逻辑备份工具,它可以将数据库中的数据和结构以 SQL 语句的形式导出到文件中。 1. 备份整个数据库 mysqldump -u [用户名] -p [数据库名] > [备份文件名].…...
AutoMQ 如何实现没有写性能劣化的极致冷读效率
前言 追赶读(Catch-up Read,冷读)是消息和流系统常见和重要的场景。 削峰填谷:对于消息来说,消息通常用作业务间的解耦和削峰填谷。削峰填谷要求消息队列能将上游发送的数据堆积住,让下游在容量范围内消费…...
【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列
目录 一.TTL ???1.设置消息的TTL 2.设置队列的TTL 3.俩者区别? 二.死信队列 定义: 消息成为死信的原因: 1.消息被拒绝(basic.reject 或 basic.nack) 2.消息过期(TTL) 3.队列达到最大长度? …...
【Java】多线程和高并发编程(三):锁(中)深入ReentrantLock
文章目录 3、深入ReentrantLock3.1 ReentrantLock和synchronized的区别3.2 AQS概述3.3 加锁流程源码剖析3.3.1 加锁流程概述3.3.2 三种加锁源码分析3.3.2.1 lock方法3.3.2.2 tryLock方法3.3.2.3 lockInterruptibly方法 3.4 释放锁流程源码剖析3.4.1 释放锁流程概述3.4.2 释放锁…...
Unity 高度可扩展的技能与多 Buff 框架详解
一、框架设计 1.1 核心思想 组件化设计: 将技能和 Buff 抽象为可复用的组件,通过组合不同的组件实现复杂的效果。 数据驱动: 使用 ScriptableObject 或 JSON 等数据格式定义技能和 Buff 的属性,方便配置和修改。 事件驱动: 利用 Unity 的事件系统或自…...
电路笔记(元器件):AD 5263数字电位计(暂记)
AD5263 是四通道、15 V、256位数字电位计,可通过SPI/I2C配置具体电平值。 配置模式: W引脚作为电位器的抽头,可在A-B之间调整任意位置的电阻值。也可将W与A(或B)引脚短接,A-W间的电阻总是0欧姆,通过数字接口调整电位器…...
《大规模动画优化(一):GPU 顶点动画的生成》
GPU 顶点动画(Vertex Animation Texture, VAT) GPU 顶点动画(Vertex Animation Texture, VAT)烘焙的核心思想是: 在 CPU 端预先计算动画顶点数据,并存储到纹理(Texture2D)中…...
webpack【初体验】使用 webpack 打包一个程序
打包前 共 3 个文件 dist\index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Webpack 示例&…...
VMware安装CentOS 7(全网超详细图文保姆版教程)
文章目录 一、下载及安装 VMware1.1 VMware下载1.2 CentOS下载 二、搭建虚拟机环境2.1 创建新虚拟机2.2 选择自定义2.3 选择虚拟机硬件兼容性2.4 选择稍后安装操作系统2.5 选择Linux系统 版本选择 centos 7 64位2.6 设备你虚拟机的名字和保存位置(保存位置建议在编辑…...
mysql BUG 导致 show processlist 有大量的show slave stauts 处于init状态
一、详细报错信息: 1、执行show slave status\G 卡住 && stop slave也卡住 2、show processlist 发现 Waiting for commit lock NULL 锁 3、错误日志报错主备同步用户认证失败 二、报错原因(分析过程): 1、排查备库日志…...
机器学习在癌症分子亚型分类中的应用
学习笔记:机器学习在癌症分子亚型分类中的应用——Cancer Cell 研究解析 1. 文章基本信息 标题:Classification of non-TCGA cancer samples to TCGA molecular subtypes using machine learning发表期刊:Cancer Cell发表时间:20…...
从MySQL优化到脑力健康:技术人与效率的双重提升
文章目录 零:前言一:MySQL性能优化的核心知识点1. 索引优化的最佳实践实战案例: 2. 高并发事务的处理机制实战案例: 3. 查询性能调优实战案例: 4. 缓存与连接池的优化实战案例: 二:技术工作者的…...
