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

进程的那些事--进程控制

目录

前言

一、创建进程

二、退出进程

void exit (int retval) 

三、进程等待 

四、进程替换


前言

提示:这里可以添加本文要记录的大概内容:

       前面我们认识了进程,现在让我们认识几个进程的接口


提示:以下是本篇文章正文内容,下面案例可供参考

一、创建进程

接口

        pid_t fork(void)

功能:通过复制父进程创建一个子进程

返回值:对于父进程返回子进程的pid,对子进程成功返回0,失败返回-1;

特点:父子进程,数据独有、代码共享。

数据独有,代码共享

        创建一个进程pcb,pcb中有一个指针指向虚拟地址空间(内存指针),指向的所以地址都会同页表映射到物理内存中,而代码中的g_val通过映射在物理内存中存储数据,当我们创建子进程,它就会复制子进程,它就会复制父进程(复制了所有的地址,映射关系,页表,若子进程修改g_val的数据,那么他会生成一个新的数据放到物理内存中,若不修改继续使用父进程的数据)。

目的:提高子进程的创建效率、节省了空间内存的申请与大量数据拷贝的过程。

        

接口

        pid_t vfork(void);
        创建出了的子进程与父进程共用一个虚拟地址空间与fork相比较少了拷贝,提高了效率

缺点

        父进程调用vfork创建了子进程后会阻塞、只有等到子进程exit退出,或子进程进行了程序替换(程序替换后子进程会有自己的虚拟地址空间,页表等)

二、退出进程

退出进程的三种方法

        1:在main函数中return ;

        2:使用库函数:void exit(int retval);

        3:系统调用接口:void_exit(int retval)

void exit (int retval) 

        库函数exit作用:在程序退出前刷新缓冲区,将缓冲区中数据写入文件中;

        系统调用接口exit:直接释放资源;

缓冲区:缓冲区是内存空间的一部分,当我们进行IO操作的时候不会理解IO,要先将数据放到缓                  冲区中,大量的小的数据累计到缓冲区中,当缓冲区满了。就累积成了大数据,再进行                  IO操作就可以达到,一次IO操作就写入了多次IO数据,减少了大量的IO操作,提高了效率

普通文件和标准输出(显示器设备文件)是不一样的:

        1.普通文件是全缓冲(缓冲区满的时候刷新缓冲区)

        2.显示器设备文件是行缓冲(数据在有换行就会刷新缓冲区)

        指令:echo$?  (获取进程返回值)

三、进程等待 

 作用

        创建一个子进程后,等待子进程的退出,获取子进程的退出状态,避免僵尸进程的产生

接口

   int wait (int *statu);  -- 阻塞接口

        阻塞:为了完成某个操作,发起调用。若不具备操作的完成条件,则调用一直等待

        非阻塞:为了完成某个操作,发起调用。若不具备操作的完成条件,立即报错返回。

        功能:等待一个子进程退出,若当前没有子进程退出,一直等待直到成功退出。

        返回值:返回值大于0代表退出成功,表示的是退出子进程的pid,出错返回-1

        参数:int *statu--表示整形空间的地址,报错退出子进程的退出状态。

   int waitpid (pid_t pid, int *statu, int option);  -- 阻塞接口

        功能:若pid参数设置为-1,表示等待任意子进程退出,否则就是等待指定子进程退出

        参数:

           pid:-1等待任意子进程,大于0表示等待指定子进程

           statu:获取退出子进程的退出状态

           option:0-默认阻塞操作,WNOHANG——非阻塞操作

statu:

        对于返回值用了一个字节来保存,在大多计算机在8位为一个字节,int类型是4个字节,及32位,其中前16位没有用到,后十六位中,前8位存储的是进程的退出码(进程的退出码只有一个字节)。低8位中的高1位有一个比特位的core dump标志,标记是否开启了核心转储功能。

        核心转储功能:

                core dump:程序异常退出时,保存程序的运行数据。

                目的:能够进行程序运行崩溃后的事后调试

        低7位:存储异常退出的信号值(崩溃)

                由于一个程序只有正常退出,返回值才是有意义的,所以问你获取返回退出码时,

                要先判断进程是否正常退出

        判断方法:低7位存储的是进程异常退出的信号值,低7位为0正常退出,非0表示异常                              退出

        低7位获取方法:statu & 0x7F

        中8位获取:(statu >> 8) & 0xFF

判断进程是否正常:

        接口:WIFEXITED(statu) 正常为真,否则为假——0为假,非0为真

                   WEXITSTATUS(statu) 提取statu的退出码——宏定义在<sys/ait.h>头文件中

                   例:printf("statu: %d\n", WEXITSTATUS(statu) );

四、进程替换 

        概念:替换进程的描述信息,让当前进程描述另一个进程(程序的运行过程) 

        功能:让一个进程运行另一个程序

接口:

        int execve(char* path, char* argv[], char* env[]);

功能:程序替换

参数:

        path:一个新的进程的路径名

        argv:要运行的新程序的运行参数

        env:要运行的新程序的环境变量

返回值:替换成功返回-1,失败没有返回值

相关文章:

进程的那些事--进程控制

目录 前言 一、创建进程 二、退出进程 void exit (int retval) 三、进程等待 四、进程替换 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 前面我们认识了进程&#xff0c;现在让我们认识几个进程的接口 提示&#xff1a;以下是本篇文章正文内容…...

FortiOS SSL VPN 用户访问权限配置

简介 使用不同用户组或用户登录 SSL VPN 隧道模式后&#xff0c;可配置不同的访问权限。 本文介绍为不同用户组分配不同访问权限的配置方法。 相关组件 FortiGate&#xff1a;FortiOS v6.4.14 build2093 (GA) 客户端&#xff1a;Windows11&#xff0c;安装 FortiClient VPN 7.…...

C++_vector类

欢迎来到本期节目- - - vector类 本期直接先上代码&#xff0c;然后以代码为例介绍需要注意的问题. 模拟实现&#xff1a; #pragma once #include<iostream> #include<assert.h> using namespace std;namespace my_room {template<class T>class vector{p…...

Spring Boot入门到精通:网上购物商城系统

第3章 系统分析 3.1 可行性分析 在系统开发之初要进行系统可行分析&#xff0c;这样做的目的就是使用最小成本解决最大问题&#xff0c;一旦程序开发满足用户需要&#xff0c;带来的好处也是很多的。下面我们将从技术上、操作上、经济上等方面来考虑这个系统到底值不值得开发。…...

在Vue.js中,你可以使用Element UI的el-input组件结合计算属性来实现模糊查询

<template><div><el-input v-model"searchQuery" placeholder"请输入查询内容"></el-input><div v-for"item in filteredList" :key"item">{{ item }}</div></div> </template><s…...

delphi制作漂亮的农历窗体(IntraWeb+Layui的完美结合)

delphi制作漂亮的农历窗体&#xff08;IntraWebLayui的完美结合&#xff09; 不需要安装服务器&#xff0c;Apache和IIS都不需要&#xff0c;自带企业级服务器。 运行exe服务器就架好了&#xff0c;直接打开手机浏览器或者电脑浏览器&#xff0c;网页就出来了&#xff0c;如果…...

发票OFD格式转换成PDF

引入依赖&#xff0c;低版本的报错&#xff0c;2.0.2能够实现转换 <dependency><groupId>org.ofdrw</groupId><artifactId>ofdrw-converter</artifactId><version>2.0.2</version><exclusions><exclusion><groupId&g…...

高通AI应用程序开发3:网络模型(一)

1. 支持的网络模型 Qualcomm神经处理SDK支持下表所列的网络模型。 有关支持的运行时和单个图层类型的限制和约束的详细信息&#xff0c;请参阅 限制 。 GPU运行时中支持的所有层对两种GPU模式都有效&#xff1a;GPU_FLOAT32_16_HYBRID和GPU_FLAAT16。GPU_FLOAT32_16_HYBRID-…...

03. 前端面试题之ts : typescript 的数据类型有哪些?

文章目录 一、typescript是什么二、typescript有哪些数据类型booleannumberstringarraytupleenumanynull 和 和 undefinedvoidneverobject 三、总结 一、typescript是什么 typescript 和 javascript几乎一样&#xff0c;拥有相同的数据类型&#xff0c;另外在javascript基础上…...

PyCharm和VS Code 安装通义灵码,可本地安装包安装,解决插件安装不上问题

PyCharm和VS Code 安装通义灵码&#xff0c;可本地安装包安装&#xff0c;解决插件安装不上问题 PyCharm、VS Code 安装通义灵码介绍主要应用场景支持编程语言安装指南JetBrains IDEs 中安装指南步骤 1&#xff1a;准备工作步骤 2&#xff1a;在 JetBrains IDEs 中安装通义灵码…...

机器人速度雅可比矩阵求解(2自由度平面关节机器人)

关节速度和末端速度空间的映射需要计算雅可比矩阵的逆矩阵,在博途PLC里如何计算一个方阵的逆矩阵,大家可以参考下面这篇文章: 博途PLC矩阵求逆 矩阵求逆 博图SCL_博图矩阵运算-CSDN博客文章浏览阅读839次。本文介绍如何用C语言实现矩阵求逆的过程,详细解析了相关代码,适…...

【AI大模型-文心-思维树解读-开篇】

提问&#xff1a;什么是“”“思维树”“”模型框架 回答&#xff1a;如下 版本&#xff1a;文心大模型3.5 “思维树”&#xff08;Tree of Thoughts, ToT&#xff09;模型框架是一个利用大型语言模型进行问题解决的框架。它借鉴了人类认知研究的成果&#xff0c;特别是关于人…...

2、electron vue3 怎么创建子窗口,并给子窗口路由传参

接上回初始化vue3 electron项目&#xff0c;创建完vue3 electron项目后&#xff0c;现在要实现在渲染进程中点击按钮创建一个新的子窗口 开始 子窗口创建操作只能在主线程内完成&#xff0c;而创建操作是在渲染线程触发&#xff0c;因此就需要进行两者间的通讯。 1、创建子窗…...

8.pod数据持久化

&#x1f482; 个人主页: Java程序鱼 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏(一键三连)和订阅专栏 &#x1f464; 微信号&#xff1a;hzy1014211086&#xff0c;想加入技术交流群的小伙伴可以加我好友&#xff0c;群里会分享学习资料、学习方法…...

C语言 | Leetcode C语言题解之第436题寻找右区间

题目&#xff1a; 题解&#xff1a; typedef struct {int start;int index; } Node;int cmp(const void *pa, const void *pb) {return ((Node *)pa)->start - ((Node *)pb)->start; }int* findRightInterval(int** intervals, int intervalsSize, int* intervalsColSiz…...

SpringBoot3中ymal配置文件(持续更新)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 在SpringBoot项目中,使用application.properties进行配置管理时&#xff0c;…...

Linux 基础IO 2

读取与写入 read与fread 在基础IO 1中我们学会了open和fopen的函数这两个函数是用于为进程打开文件也可以理解为为进程和文件建立了一个链接使其可以交互。那我们建立号链接之后肯定还是需要对文件进行操作&#xff0c;现在我们先来了解读取操作。 read&#xff1a; 这是一…...

图像预处理 图像去噪之常见的去噪方法

图像去噪是图像预处理中的一项关键技术&#xff0c;其目的是从含有噪声的图像中恢复出无噪声的图像&#xff0c;以提高图像质量和后续图像分析的准确性。图像去噪方法众多&#xff0c;本文将介绍几种常见的去噪方法&#xff0c;并提供相应的代码示例。 1. 均值滤波&#xff08…...

代码随想录Day53|102.沉没孤岛 、103.水流问题 、104.建造最大岛屿

102.沉没孤岛 import java.util.*;class Main{public static int[][] dir {{0,1},{1,0},{0,-1},{-1,0}};public static void main (String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int m sc.nextInt();int[][] grid new int[n][m];for(int i 0…...

19c-pfile

经常需要rman恢复测试&#xff0c;创建一个单机pfile&#xff0c;需要时手动修改使用&#xff0c;以20g内存为例 orcl.__data_transfer_cache_size0 orcl.__db_cache_size13824425984 orcl.__inmemory_ext_roarea0 orcl.__inmemory_ext_rwarea0 orcl.__java_pool_size0 orcl._…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...