Linux 进程:父子进程

news2024/12/29 14:30:24

目录

  • 一、了解子进程
  • 二、创建子进程
    • 1.创建子进程
    • 2.区分父子进程
  • 三、理解子进程
  • 四、创建子进程的意义

  进程就是运行中的应用程序,如果一个程序较为庞大,我们可以给这个程序创建多个进程,每个进程负责一部分代码的运行。

  A进程如果创建了B进程,A进程就是B进程的父进程,B进程就是A进程的子进程。当然,B进程还可以接着创建子进程,创建出的子进程又可以创建子进程…… 但一般我们不会这么做的,因为这样太过复杂,控制起来比较难。

一、了解子进程

  简单来说,子进程就是父进程创造的、来帮父进程干活的进程。比如:领导都不亲自干活,干活都是交给下属去做的。父进程就是领导,子进程就是下属。

  子进程在创建出来以后,从创建子进程的那行开始,子进程和父进程运行的是一模一样的代码。

  如图:有10行代码,父进程运行到第5行的时候创建了一个子进程,子进程创建出来以后,就和父进程运行着相同的代码。

父子进程

二、创建子进程

1.创建子进程

  用专门的函数来创建子进程,常使用 pid_t fork(void) 这个函数来创建一个子进程。但并不是只有这个函数才可以创建子进程,还有其他的函数。

2.区分父子进程

  pid_t fork(void)这个函数最终会有一个返回值,返回一个pid_t类型的数据,在返回这个数据之前,子进程就已经创建好了。

  所以在返回数据的时候,父进程就已经创建出来子进程了。因此父进程和子进程都有一个该函数的返回值,并且父子进程的返回值不同,这个一定要记住。

  对于父进程来说,这个函数的返回值是子进程的pid(pid是大于0的),对于子进程来说,这个函数的返回值是0。如果子进程创建失败,函数的返回值就是小于0的数。

  通过父子进程返回值的不同,我们可以区分父子进程,让父子进程进入不同的代码分支执行程序。

  可以看一下下面这段代码:

#include<stdio.h>              
#include<unistd.h>
#include<stdlib.h>
/*
创建子进程,通过父进程和子进程返回值的不同,使得父进程和子进程执行不同的代码分支
*/

int main(){
  //创建子进程
  pid_t val=fork();
  //判断父子进程
  if(val<0){    
  	//返回值小于0,说明子进程创建失败
    printf("create error\n");
  }else if(val==0){          
  	//返回值等于0,说明进入这里的是子进程
    printf("this is son\n");
  }else{                    
  	//返回值大于0,说明进入这里的是父进程
    printf("this is father\n");
  }                            
}  

三、理解子进程

1.创建子进程的本质是什么?

  创建子进程其实是通过复制父进程来创建子进程。因为进程的信息保存在pcb中,因此创建子进程其实就是复制父进程的pcb中的大部分信息,用这些信息来创建子进程的pcb。这些信息有:内存指针、上下文数据等。

2.复制内存指针的意义是什么?

  内存指针指向程序代码在内存中的位置,复制内存指针意味着子进程和父进程运行的代码是一样的。

3.复制上下文的意义是什么?

 (1)上下文代表了程序的执行状态:上文是程序已经执行过的指令和数据,下文是将要执行的指令和数据。

 (2)子进程复制父进程的上下文数据意味着子进程复制了父进程的运行位置,也就是说,子进程知道父进程创建子进程的时候,父进程运行到哪里了。为了方便,我们把这个位置叫做创建点。

 (3)意味着子进程会从创建点开始运行,在创建子进程后,父子进程都会开始运行相同的代码。这一点可以根据上文的图片来理解。

四、创建子进程的意义

 (1)父子进程运行的功能相同,在大量任务处理中,子进程可以用来分担压力。因为我们可以通过函数返回值的不同区分父子进程,从而使父子进程进入不同的代码分支。

 (2)子进程可以用来做危险的事情,即便崩溃,也不会影响到父进程。因此危险的事情可以让子进程做,父进程负责统筹兼顾。

 (3)子进程的作用主要是用在程序替换中,程序替换就是让子进程去运行另一个程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【华为OD机试模拟题】用 C++ 实现 - GPU 调度(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明GPU 调度题目输入输出示例一输入输出说明示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。

动态规划:完全背包基础、518.零钱兑换II、377.组合总和IV

leetcode 518.零钱兑换IIleetcode 377.组合总和IV完全背包基础有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里…

CleanMyMac4.20最新版新增功能及电脑清理垃圾使用教程

CleanMyMac4.20作为知名的Mac清理工具&#xff0c;仅需一键即可快速而安全地清理系统垃圾&#xff0c;释放磁盘空间&#xff0c;因此一直深受Mac用户的喜爱。在不断更新的版本中&#xff0c;CleanMyMac已经不仅仅满足于只做简单的Mac清理工具&#xff0c;而是为Mac用户提供更多…

借助Intune无感知开启Bitlocker

希望使用 Intune 部署 BitLocker&#xff0c;但不知道从哪里开始&#xff1f;这是人们最开始使用 Intune 时最常见的问题之一。在本博客中&#xff0c;你将了解有关使用 Intune 管理 BitLocker 的所有信息&#xff0c;包括建议的设置、BitLocker CSP 在客户端上的工作方式&…

彻底搞懂React-hook链表构建原理

写在前面的小结 每一个 hook 函数都有对应的 hook 对象保存状态信息useContext是唯一一个不需要添加到 hook 链表的 hook 函数只有 useEffect、useLayoutEffect 以及 useImperativeHandle 这三个 hook 具有副作用&#xff0c;在 render 阶段需要给函数组件 fiber 添加对应的副…

Spring Boot系列04--静态资源处理

目录1. 静态资源映射规则2. 欢迎页1. 静态资源映射规则 在项目中双击shift或ctrlN搜索WebMvcAutoConfiguration.class文件&#xff0c;文件中的addResourceHandlers方法如下&#xff1a; public void addResourceHandlers(ResourceHandlerRegistry registry) {if (!this.reso…

运维排查篇 | Redis占用内存过高怎么办

我们知道&#xff0c;Redis是一个key-value数据库&#xff0c;它的数据是运行在内存中的其读写效率比将数据存储到磁盘上的数据库要快很多虽然性能强大&#xff0c;但是如果我们不了解Redis的内存回收策略&#xff0c;就有可能导致Redis消耗内存过高甚至导致内存溢出&#xff0…

[优化]上下游交互策略

书接上文&#xff1a;https://blog.csdn.net/weixin_43303530/article/details/127227147?spm1001.2014.3001.5502&#xff0c;为满足产品提的在24小时内能重试尽量去重试&#xff0c;不计较重试的次数的要求&#xff0c;在第三方电子卡系统无法提升接口并发数量的情况下&…

电脑C盘空间不足?这样做就行了!

一般来说&#xff0c;电脑C盘都是系统盘&#xff0c;它的稳定关系到系统能否正常运行&#xff0c;但是很多朋友的C盘却总是红色的&#xff0c;这也就意味着C盘储存空间不足了&#xff0c;那么我们就需要进行以下操作&#xff0c;来让C盘重新拥有储存空间。方案一&#xff1a;运…

BLE Mesh蓝牙协议学习记录

BLE Mesh蓝牙协议学习 文章目录BLE Mesh蓝牙协议学习前言概述一、蓝牙技术整体框架二、经典蓝牙和低功耗蓝牙mesh协议架构图承载层&#xff08;Bearer Layer&#xff09;网络层&#xff08;Network Layer&#xff09;底层传输层&#xff08;Lower Transport Layer&#xff09;上…

JAVA连接数据库——JDBC的简单使用

JDBC即Java数据库连接.用来实现Java程序对数据库增删查改。 为了对接Java程序和数据库&#xff0c;java.sql提供了很多api包含在java.sql和javax.sql里面 结构: DriverManager接口: 每一个数据库的驱动程序都必须去到DriverManager注册&#xff0c;生成一个Connection Conn…

电商平台的促销活动如何抵御大流量的ddos攻击

每一次活动大促带来的迅猛流量&#xff0c;对技术人而言都是一次严峻考验。如果在活动期间遭受黑产恶意 DDoS 攻击&#xff0c;无疑是雪上加霜。电商的特性是业务常态下通常不会遭受大流量 DDoS 攻击&#xff0c;且对延迟敏感&#xff0c;因此只需要在活动期间按需使用 DDoS 防…

【第五章 AOP概述,底层原理,AOP术语,切入点表达式,AOP操作(基于注解方式,基于xml配置文件)】

第五章 AOP概述&#xff0c;底层原理&#xff0c;AOP术语&#xff0c;切入点表达式&#xff0c;AOP操作&#xff08;基于注解方式&#xff0c;基于xml配置文件&#xff09; 1.AOP概述&#xff1a; &#xff08;1&#xff09;什么是AOP&#xff1a; ①面向切面编程&#xff08;…

11-KMP算法

KMP算法是一个字符串匹配算法&#xff0c;总的意义是在给定的字符串A中利用优化的方法快速地找出字符串B的位置&#xff0c;相比于传统匹配算法&#xff0c;它能有效减少匹配时间&#xff0c;提高效率。 前缀和后缀 在我们看KMP算法前我们先考虑一个问题&#xff1a;假如我们…

基于框架的平台总线式开发

一、总线、设备、驱动 硬编码式的驱动开发带来的问题&#xff1a; 1. 垃圾代码太多 2. 结构不清晰 3. 一些统一设备功能难以支持 4. 开发效率低下 1.1 初期解决思路&#xff1a;设备和驱动分离 struct device来表示一个具体设备&#xff0c;主要提供具体设备相关的资源&am…

Telnet 基础实验2: SSH 实验

Telnet 基础实验2&#xff1a; SSH 实验 本实验只能使用 eNSP中 AR 系统的路由器做 拓扑图 SSH &#xff1a; Secure Shell 是一个网络安全协议&#xff0c;基本于 TCP 协议 22 端口传输数据&#xff0c;通过对网络数据的加密&#xff0c;使其能够在一个不安全的网络环境中&a…

网易新财报:游戏养家,教育维稳、音乐快走

配图来自Canva可画 随着互联网流量红利逐渐消退&#xff0c;互联网大厂们也告别高增长时代&#xff0c;逐渐进入稳定增长阶段。近两年&#xff0c;流量焦虑、业务失速等问题更是成为了一团浓雾&#xff0c;笼罩在互联网大厂周围。不过&#xff0c;面对所遭遇的难题&#xff0c…

力扣-换座位

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;626. 换座位二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结前言 …

读书笔记——《富爸爸穷爸爸》

《富爸爸穷爸爸》&#xff0c;以前不屑读这种书。这种书就是那种走进书店放在门口展销位的成功学著作&#xff0c;一眼看上去没什么实在的内容&#xff0c;看上去很不靠谱&#xff0c;感觉就是骗一些社会底层又做着暴富梦的人来买的&#xff0c;但是由于自身原因或环境局限根本…

Spring Boot + Vue3 前后端分离 实战 wiki 知识库系统<二>---后端架构完善与接口开发

数据库准备&#xff1a; 在上一次Spring Boot Vue3 前后端分离 实战 wiki 知识库系统<一>---Spring Boot项目搭建已经将SpringBoot相关的配置环境给搭建好了&#xff0c;接下来则需要为咱们的项目创建一个数据库。 1、mysql的安装&#xff1a; 关于mysql的安装这里就…