Linux操作系统--进程的创建和终止

目录

1.进程创建

1.1fork()函数初识

1.2写时拷贝

1. 提升系统效率

2. 隔离错误影响

3. 支持并行计算

2.进程终止:

2.1进程退出场景:

2.2进程常见退出方法:

2.3_exit()系统调用接口

2.4exit函数

2.5return退出


1.进程创建

1.1fork()函数初识

在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原就进程为父进程

#include<unistd.h>
pid_t fork(void);
返回值:子进程返回0,父进程返回子进程的pid,创建失败返回-1

进程调用fork,当同志转移到内核中的fork代码后,内核做:

  • 分配新的内存块和内核数据结构给子进程
  • 将父进程部分数据结构内容拷贝至子进程
  • 添加子进程到系统进程列表当中
  • fork返回,开始调度器调度

当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程,看如下程序:

##include<unistd.h>
#include<stdio.h>
#include <sys/types.h>
#include<stdlib.h>
int main()
{pid_t pid;printf("Before: pid is %d\n", getpid());if((pid=fork())==-1){perror("fork()");exit(1);}printf("After:pid is %d, fork return %d\n",getpid(),pid);sleep(1);return 0;
}

这里看到了三行代码,一行befor,进程28791先打印before消息,然后它有打印after。另一个after消息有28791打印的。注意到进程28791没有打印before,为什么呢?如下图

所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。注意,fork之后,谁先执行完全由调度器决定。

(小扩展:在Linux操作系统中,调度器是一个负责分配CPU资源给不同进程的子系统。调度器的主要作用是根据不同的调度算法,决定哪个进程可以获得CPU时间片,以实现进程间的公平竞争和高效利用CPU资源。Linux操作系统中有多种调度器可供选择,如CFS (Completely Fair Scheduler)、O(1)调度器等。通过调度器的工作,Linux操作系统能够有效地管理进程的运行顺序,提高系统性能和响应速度.)

1.2写时拷贝

了解写时拷贝之前,我们得先知道,为什么要在一个进程之中,创建一个子进程?子进程的作用是什么?

1. 提升系统效率

当父进程需要完成多个独立的任务时,它可以创建若干个子进程分别执行这些任务。这种方式使得父进程无需等待某个任务完成后才能继续下一个任务,而是可以在等待期间执行其他工作或者进入休眠状态以节省资源。

2. 隔离错误影响

子进程与父进程之间存在一定的隔离机制。即使子进程中出现了致命错误(如段错误),通常也不会直接影响到父进程及其正常运行流程。这种设计有助于增强整个程序架构的安全性和稳定性。

3. 支持并行计算

现代计算机硬件大多具备多核处理器能力,利用子进程可以让不同CPU核心同时处理不同的数据集或算法部分,进而充分利用硬件资源达到加速目的。

所以:子进程需要与执行与父进程不同的代码段。例如:父进程等待客户端申请,生成子进程来处理请求。

于是,我们就需要写时拷贝。

通常、父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。

2.进程终止:

2.1进程退出场景:

  1. 代码运行完毕,结果正确
  2. 代码运行完毕,结果不正确
  3. 代码异常终止

1、2中,统一会采用进程的退出码进行判定结果是否正确。

进程退出码有什么作用?(一般而言,父进程会关心子进程的完成情况,所以需要子进程退出码来判断子进程完成情况)

2.2进程常见退出方法:

正常终止(可以通过echo $? 查看进程退出码---最后一次进程的退出码):

  1. 从main返回
  2. 调用exit
  3. _exit

main函数的返回值,本质表示:进程运行完成时是否是正常的结果,如果不是,可以用不同的数字,表示不同的出错原因

异常退出:ctrl + c,信号终止

进程出现异常,本质是我们的进程收到了对应的信号

2.3_exit()系统调用接口

参数:status定义了进程的终止状态,父进程通过wait来获取该值

说明:虽然status是int,但是仅有低8位可以被父进程所用。所以_exit(-1)时,在终端执行$?发现返回值是255(下一章--进程等待会详细讲关于status的存储)

2.4exit函数

#include<unistd.h>
void exit(int status);

exit最后也会调用_exit,但在调用_exit之前,还做了其他工作

  1. 执行用户通过atexit或on_exit定义的清理函数
  2. 关闭所有打开的流,所有的缓存数据均被写入
  3. 调用_exit

#include <stdio.h>
#include <stdlib.h>void cleanup_function(){printf("Cleanup function called.\n");
}int main(){atexit(cleanup_function);puts("Before calling exit.");exit(0); // This will call the registered 'cleanup_function'
}

#include <stdio.h>
#include <unistd.h> int main(void){char buffer[]="This message may be lost\n";fwrite(buffer , sizeof(char), strlen(buffer)-1 , stdout );_exit(0); // No flushing occurs here so output might get discarded.
}

2.5return退出

return是一种更常见的退出进程的方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当作exit参数

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

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

相关文章

OSPF综合实验——企业边界路由器、LSA收敛

IP划分粗略记号&#xff0c;方便后续配置 配置IP和环回--->ISP的IP配置和cheat认证---->配置OSPF和RIP---->企业边界路由网段汇总---->特殊区域---> 缺省路由&#xff0c;重分发---->nat配置---->实现全网通 路由器配置IP和环回地址 <Huawei>sys…

Java【网络原理】(4)HTTP协议

目录 1.前言 2.正文 2.1自定义协议 2.2HTTP协议 2.2.1抓包工具 2.2.2请求响应格式 2.2.2.1URL 2.2.2.2urlencode 2.2.3认识方法 2.2.3.1GET与POST 2.2.3.2PUT与DELETE 2.2.4请求头关键属性 3.小结 1.前言 哈喽大家好啊&#xff0c;今天来继续给大家带来Java中网络…

Android学习总结之APK打包流程

一、预处理阶段&#xff08;编译前准备&#xff09; 1. AIDL 文件处理&#xff08;进程间通信基础&#xff09; 流程&#xff1a; 用于实现 Android 系统中不同进程间的通信&#xff08;IPC&#xff09;。在项目构建时&#xff0c;AIDL 编译器会将 .aidl 文件编译为 Java 接口…

BDO分厂积极开展“五个一”安全活动

BDO分厂为规范化学习“五个一”活动主题&#xff0c;按照“上下联动、分头准备 、差异管理、资源共享”的原则&#xff0c;全面激活班组安全活动管理新模式&#xff0c;正在积极开展班组安全活动&#xff0c;以单元班组形式对每个班组每周组织一次“五个一”安全活动。 丁二醇单…

【音视频】FLV格式分析

FLV概述 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式&#xff0c;由于其封装后的⾳视频⽂件体积⼩、封装简单等特点&#xff0c;⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。 FLV封装格式是由⼀个⽂件头(file header)和…

Java表达式1.0

Java开发工具 在当今的Java开发领域&#xff0c;IntelliJ IDEA已然成为了众多开发者心目中的首选利器&#xff0c;它被广泛认为是目前Java开发效率最快的IDE工具。这款备受瞩目的开发工具是由JetBrains公司精心打造的&#xff0c;而JetBrains公司总部位于风景如画的捷克共和国首…

Map遍历

第一种遍历方式键找值&#xff1a; 增强for循环&#xff1a; 通过获取元素中的键&#xff0c;get到对应的值&#xff0c;通过增强for循环获取集合里的键&#xff0c;然后用get方法通过键获取值 代码演示&#xff1a; import java.text.ParseException; import java.util.*;…

内网穿透服务器—FRP

某天某刻空闲的时候跟同事聊的本地的存储服务如果我想让其他公网内的用户使用&#xff08;这个存储服务只是一个临时文件传递站&#xff0c;碎文件&#xff0c;安全低的&#xff09;&#xff0c;然后我们就探讨到了FRP一个比较久远的技术&#xff0c;来做内网穿透&#xff0c;下…

力扣每日打卡16 781. 森林中的兔子(中等)

力扣 781. 森林中的兔子 中等 前言一、题目内容二、解题方法1. 哈希函数&#xff08;来自评论区大佬的解题方法&#xff09;2.官方题解2.1 方法一&#xff1a;贪心 前言 这是刷算法题的第十六天&#xff0c;用到的语言是JS 题目&#xff1a;力扣 781. 森林中的兔子 (中等) 一、…

基于深度学习的线性预测:创新应用与挑战

一、引言 1.1 研究背景 深度学习作为人工智能领域的重要分支&#xff0c;近年来在各个领域都取得了显著的进展。在线性预测领域&#xff0c;深度学习也逐渐兴起并展现出强大的潜力。传统的线性预测方法在处理复杂数据和动态变化的情况时往往存在一定的局限性。而深度学习凭借…

黑马点评redis改 part 3

优惠券秒杀 全局唯一id 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a;实际开发中数据库ID一般不会参与业务逻辑 增加一个订单号字段就好…

低代码开发平台:企业数字化转型的加速器

一、引言 在数字化时代&#xff0c;企业的转型需求日益迫切。为了在激烈的市场竞争中保持领先地位&#xff0c;企业需要快速响应市场变化、优化业务流程、提升运营效率。然而&#xff0c;传统的软件开发模式往往面临开发周期长、成本高、灵活性差等问题&#xff0c;难以满足企业…

个人所得税

文章目录 一、名词解释二、个人所得税计算方法 (举例)1.累计预扣预缴应纳税所得额、本期应预扣预缴税额2.个人所得税预扣率表一3.个人所得税计算举例 三、专项附加扣除政策介绍四、年度汇算清缴政策介绍五、常见问答 一、名词解释 累计预扣法是指扣缴义务人在一个纳税年度内预…

二进制和docker两种方式部署Apache pulsar(standalone)

#作者&#xff1a;闫乾苓 文章目录 1、二进制安装部署Pulsar(standalone)1.1 安装配置JDK1.2 下载解压pulsar安装包1.3 启动独立模式的Pulsar 集群1.4 创建主题测试1.5 向主题写入消息测试1.6 从主题中读取消息测试 2.docker安装部署Pulsar(standalone)2.1 使用docker 启动Pul…

如何在 Go 中创建和部署 AWS Lambda 函数

AWS Lambda 是一个无服务器计算平台&#xff0c;您可以使用自己喜欢的编程语言编写代码&#xff0c;无需担心设置虚拟机。 您只需为 Lambda 函数的调用次数和运行时间&#xff08;毫秒&#xff09;付费。 我们大多数人都了解 JavaScript 和 Python&#xff0c;但它们的内存效率…

STM32配置系统时钟

1、STM32配置系统时钟的步骤 1、系统时钟配置步骤 先配置系统时钟&#xff0c;后面的总线才能使用时钟频率 2、外设时钟使能和失能 STM32为了低功耗&#xff0c;一开始是关闭了所有的外设的时钟&#xff0c;所以外设想要工作&#xff0c;首先就要打开时钟&#xff0c;所以后面…

[安全实战]逆向工程核心名词详解

逆向工程核心名词详解 一、调试与执行类 1. 断点&#xff08;Breakpoint&#xff09; 定义&#xff1a;在代码中设置标记&#xff0c;使程序执行到此处时暂停类型&#xff1a; 普通断点&#xff1a;通过INT3指令实现条件断点&#xff1a;满足特定条件时触发内存断点&#xf…

Mac mini 安装mysql数据库以及出现的一些问题的解决方案

首先先去官网安装一下mysql数据库&#xff0c;基本上都是傻瓜式安装的流程&#xff0c;我也就不详细说了。 接下来就是最新版的mysql安装的时候&#xff0c;他就会直接让你设置一个新的密码。 打开设置&#xff0c;拉到最下面就会看到一个mysql的图标&#xff1a; 我设置的就是…

聚宽策略----国九条后中小板微盘小改,年化135.40%

最近在研究的聚宽策略&#xff0c;一般技术分析的我直接转qmt了&#xff0c;财务因子有一点麻烦&#xff0c;我直接利用我开发强大的服务器系统&#xff0c;直接读取信号&#xff0c;最近在优化一下系统&#xff0c;最近在开发对接bigquant的交易系统&#xff0c;完成了api数据…

C语言状态字与库函数详解:概念辨析与应用实践

C语言状态字与库函数详解&#xff1a;概念辨析与应用实践 一、状态字与库函数的核心概念区分 在C语言系统编程中&#xff0c;"状态字"和"库函数"是两个经常被混淆但本质完全不同的概念&#xff0c;理解它们的区别是掌握系统编程的基础。 1. 状态字&…