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

【Linux】进程控制-----进程创建与进程终止

目录

前言:

一、进程创建:

1、fork函数

2、创建多个进程:

3、写时拷贝:

二、进程终止:

进程退出码:

退出方式:

​编辑

进程异常退出:

缓冲区:


前言:

在将进程创建之后还要对其进行合理的管理,使用进程控制相关的知识对进程进行管理就能够解决很多其他问题

一、进程创建:

1、fork函数

fork函数就是在当前进程中创造一个新进程,这个新进程就是当前进程的子进程,当前进程就是新进程的父进程,子进程的代码和数据就是剩余父进程的代码和数据

返回值:

这个返回值的类型是pid_t这个是typedef int,使用与进程的,fork函数会有两个返回值:

创建成功:子进程返回0,父进程返回子进程的pid

创建失败:返回-1

为什么要给子进程返回0,父进程返回子进程的pid

这样有两个返回值是为了区分子进程和父进程,我们不妨想想,为什么要有子进程和父进程呢?这样的原因主要是为了让子进程执行和父进程不一样的代码块,所以就需要不同的返回值来区分子进程和父进程。

这样就可以用if 、else if、 else进行分流操作,来完成子进程完成和父进程不一样的操作

并且一个子进程是只有一个父进程的,一个父进程可能有许多子进程,所以就需要给子进程一个返回0来标记,给父进程返回子进程的PID来管理子进程。

还有其他几个问题在下面文章中所写了,如

1、fork函数究竟干了什么?

2、一个函数是如何做到返回两次的,这怎么理解?

3、同一个变量怎么会有不同的内容,如何理解?

【Linux】进程概念与PCB,父子进程与foke函数-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/2303_80828380/article/details/143607556?spm=1001.2014.3001.5501

2、创建多个进程:

如上代码就是使用for循环创建多个进程,最后的sleep(1000)是不让父进程结束,如果父进程结束了就会使子进程变成孤儿进程,然后在调用函数child里面打印子进程的pid和ppid进行观察

如上,左边就是每次子进程的调用,可以看到,子进程的调用是毫无规律的,也就是说在多进程的调用中,哪一个进程被调用是不知道的,这是由调度器决定的,看调度器把哪一个进程先放入调度队列中谁就先进行调度

3、写时拷贝:

写时拷贝实际上是通过页表的方式,对不同的进程进行空间寻址,达到出现改写行为时,父子进程指向的数据就会不同的机制

当进行写时拷贝前:

当进行写时拷贝后:

如上,无论是父进程还是子进程进行数据的修改都会进行写时拷贝,就会在物理空间中开辟一块新空间,然后就会重新映射物理地址到新开辟的空间,这就是写时拷贝原理

二、进程终止:

如果进程终止的话,那么就必然是下述的三种情况

代码运行完毕,结果正确
代码运行完毕,结果不正确
代码异常终止(进程崩溃)

进程退出码:

在命令行解释器中可以用
echo   $?来进行查看上一个进程的退出码

当我们的代码运行起来就变成了进程,当进程结束后main函数的返回值实际上就是该进程的进程退出码,这个退出码对应着相应的退出信息,所谓的退出信息就是以退出码的形式作为main函数的返回值返回,这样就能够知道是因为 什么而导致进程崩溃,一般main函数的退出码是0的话就是正常运行结束,如果不是0的话就是异常退出,

 

这样echo看到的就是正常结束

strerror函数可以通过打印出退出码对应的信息:(这个函数在string文件中)

在Linux中有133个退出码(不同环境下退出码的个数和对应的含义也可能会不同)

如下:当进程中被热键ctrl + c终止后对应的退出码就是130在上面看到就是 自我退出 的

如上,如果在进行echo $?的话就是看的echo这个进程的退出码了,所以看一个指令的退出码,一般都是0,

我们也可以模拟实现一个错误码

这样的话也可以实现错误码(数组下标)对应的错误信息了

退出方式:

1、return退出

一般return退出就是退出当前函数到上一级

2、热键退出(ctrl+c)

如果是热键退出的话就属于外部退出,这样退出的话在Linux中就属于130号退出码,

返回码137通常表示命令或进程被强制终止,具体原因包括以下几种‌,命令被另一个程序或脚本通过发送SIGKILL信号终止‌:在Linux系统中,SIGKILL信号(值为9)是一个强制终止进程的信号‌

3、exit与_exit

这两个退出函数,本质上来说,没有区别,都是退出进程,但是exit()是对_exit()做的封装实现,推荐一般使用exit毕竟这个函数还会多做一点事比如冲刷缓冲区等等

看看如下代码:

运行结果是如下的:
原因:exit是终止进程的,当执行完exit之后就会结束这个进程就不会继续往下进行了

_exit与exit区别:

当执行如下的代码的时候,就会刷新缓冲区,这样的话就可以看见所打印的内容了

同样的代码当是 _exit 的时候就看不到所打印的内容

原因:

exit()是对_exit()做的封装实现
_exit()就只是单纯的退出程序
而exit()在退出之前还会做一些事,比如冲刷缓冲区,再调用 _exit()

进程异常退出:

当进程异常退出的时候,再看退出码就没有意义了

在Linux中,进程异常退出可能有以下几种情况:

接收到信号导致的异常退出:常见的信号如kill -9 ,热键ctrl + c

资源耗尽:例如,CPU时间、内存等资源用尽

程序代码错误:例如,数组越界、无效指针引用等

系统调用错误:进程执行了非法的系统调用

缓冲区:

由于_exit函数是一个系统调用,直接由操作系统内核提供,所以如果缓冲区也在内核中的话,那么在_exit结束进程的时候就可以刷新缓冲区了,但是_exit却不能够刷新缓冲区,所以缓冲区不在内核中

相关文章:

【Linux】进程控制-----进程创建与进程终止

目录 前言: 一、进程创建: 1、fork函数 2、创建多个进程: 3、写时拷贝: 二、进程终止: 进程退出码: 退出方式: ​编辑 进程异常退出: 缓冲区: 前言&#xff1…...

【软考速通笔记】系统架构设计师③——信息安全技术基础知识

文章目录 一、前言二、信息安全基础知识2.1 信息安全的基本要求2.2 信息安全的范围2.3 网络安全表现2.4 安全措施包括 三、信息安全系统的组成框架3.1 技术体系:3.2 组织机构体系:3.3 管理体系 四、信息加解密技术4.1 对称密钥加密算法4.2 非对称密钥加密…...

AI安全:从现实关切到未来展望

近年来,人工智能技术飞速发展,从简单的图像识别到生成对话,从自动驾驶到医疗诊断,AI技术正深刻改变着我们的生活。然而,伴随着这些进步,AI的安全性和可控性问题也日益凸显。这不仅涉及技术层面的挑战&#…...

YOLO格式数据集介绍

yolo数据集 yolo数据集标注格式主要是 yolov5 项目需要用到。 标签使用txt文本进行保存。yolo的目录如下所示: dataset ├─images │ ├─train │ │ ├─ flip_mirror_himg0026393.jpg │ │ ├─ flip_mirror_himg0026394.jpg │ │ ├─ flip_…...

Doris 数据集成 LakeSoul

Doris 数据集成 LakeSoul 作为一种全新的开放式的数据管理架构,湖仓一体(Data Lakehouse)融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势,帮助用户更加便捷地满足各种数据处理分析的需求,在企业的大数据体系中已经得到越来越多的应用。 在过去多个版本…...

Navicat 预览变更sql

需求 用了Flyway(数据库迁移工具)后,需要记录变更sql,所以要知道变更sql。 查看方式 Navicat提供了预览变更sql功能,右击表---->设计表,比如修改字段后,点击SQL预览标签页, 顺…...

深入理解下oracle 11g block组成

深层次说,oracle数据库的最少组成单位应该是块,一般默认情况下,oracle数据库的块大小是8kb,其中存储着我们平常所需的数据。我们在使用过程中,难免会疑问道:“oracle数据块中到底是怎样组成的,平…...

Qt Graphics View 绘图架构

Qt Graphics View 绘图架构 "QWGraphicsView.h" 头文件代码如下&#xff1a; #pragma once#include <QGraphicsView>class QWGraphicsView : public QGraphicsView {Q_OBJECTpublic:QWGraphicsView(QWidget *parent);~QWGraphicsView();protected:void mouseM…...

大数据-234 离线数仓 - 异构数据源 DataX 将数据 从 HDFS 到 MySQL

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…...

零基础学安全--shell脚本学习(1)脚本创建执行及变量使用

目录 学习连接 什么是shell shell的分类 查看当前系统支持shell 学习前提 开始学习 第一种执行脚本方法 ​编辑 第二种执行脚本方法 第三种执行脚本方法 变量声明和定义 ​编辑 查看变量 删除变量 学习连接 声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣…...

C#对INI配置文件进行读写操作方法

#region 读写ini配置文件/// <summary>/// 对INI文件进行读写/// </summary>class INIHelper{/// <summary>/// 从INI文件中读取数据/// </summary>/// <param name"filePath">INI文件的全路径</param>/// <param name"…...

华为鸿蒙内核成为HarmonyOS NEXT流畅安全新基座

HDC2024华为重磅发布全自研操作系统内核—鸿蒙内核&#xff0c;鸿蒙内核替换Linux内核成为HarmonyOS NEXT稳定流畅新基座。鸿蒙内核具备更弹性、更流畅、更安全三大特征&#xff0c;性能超越Linux内核10.7%。 鸿蒙内核更弹性&#xff1a;元OS架构&#xff0c;性能安全双收益 万…...

请求响应(学习笔记)

请求响应 文章目录 请求响应请求Postman简单参数实体参数数组集合参数数组参数集合参数 日期参数JSON参数路径参数 响应响应数据统一响应结果 分层解耦三层架构分层解耦IOC & DI 入门IOC详解DI详解 请求响应&#xff1a; 请求(HttpServeltRequest)&#xff1a;获取请求数据…...

JavaScript核心语法(5)

这篇文章讲一下ES6中的核心语法&#xff1a;扩展运算符和模块化。 目录 1.扩展运算符 数组中的扩展运算符 基本用法 合并数组 对象中的扩展运算符 基本用法 合并对象 与解构赋值结合使用 数组解构中的剩余元素 对象解构中的剩余属性 2.模块化 基本概念 1.扩展运算符…...

2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现

目录 第一题握手&#xff0c;这个直接从49累加到7即可&#xff0c;没啥难度&#xff0c;后面7个不握手就好了&#xff0c;没啥讲的&#xff0c;(然后第二个题填空好难&#xff0c;嘻嘻不会&#xff09; 第三题.好数​编辑 第四题0R格式 宝石组合 数字接龙 最后一题:拔河 第…...

MongoDB 和 Redis 是两种不同类型的数据库比较

MongoDB 和 Redis 是两种不同类型的数据库&#xff0c;设计目标和应用场景各有侧重&#xff0c;因此性能对比需要结合具体需求场景进行评估。 1. MongoDB 性能特点 类型: 文档型数据库&#xff08;NoSQL&#xff09;。适合场景: 复杂查询&#xff1a;支持丰富的查询语法和索引…...

CLIP-Adapter: Better Vision-Language Models with Feature Adapters 论文解读

abstract 大规模对比视觉-语言预训练在视觉表示学习方面取得了显著进展。与传统的通过固定一组离散标签训练的视觉系统不同&#xff0c;(Radford et al., 2021) 引入了一种新范式&#xff0c;该范式在开放词汇环境中直接学习将图像与原始文本对齐。在下游任务中&#xff0c;通…...

Spring Boot 开发环境搭建详解

下面安装spring boot的详细步骤&#xff0c;涵盖了从安装 JDK 和 Maven 到创建和运行一个 Spring Boot 项目的全过程。 文章目录 1. 安装 JDK步骤 1.1&#xff1a;下载 JDK步骤 1.2&#xff1a;安装 JDK步骤 1.3&#xff1a;配置环境变量 2. 安装 Maven步骤 2.1&#xff1a;下载…...

网络安全中的数据科学如何重新定义安全实践?

组织每天处理大量数据&#xff0c;这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难&#xff0c;常常导致疏忽。以前&#xff0c;公司依靠 FUD 方法&#xff08;恐惧、不确定性和怀疑&#xff09;来识别潜在攻击。然而&#xff0c;将数据科学集成到网络安全中…...

安装数据库客户端工具

如果没有勾选下面的&#xff0c;可以运行下面的两个命令 红框为自带数据库 新建数据库 右键运行mysql文件&#xff0c;找到数据库&#xff0c;并刷新...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...

WinUI3开发_使用mica效果

简介 Mica(云母)是Windows10/11上的一种现代化效果&#xff0c;是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果&#xff0c;Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...