Linux_进程控制

一:进程创建

fork()函数创建新进程

#include <unistd.h>
pid_t fork(void);
返回值:自进程中返回0,父进程返回子进程id,出错返回-1

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

1.为新进程分配一个唯一的进程标识符(PID)。复制父进程的相关信息,创建一个新的进程控制块(PCB)。指向同一块内容

2.内核不会立即复制父进程的整个地址空间,而是标记这些页面为只读,当父进程或子进程尝试写入时会触发系统错误,再由系统判断是野指针问题,还是写时拷贝,如果是写时拷贝,就新开辟空间来拷贝再修改。(为什么不直接修改?因为count++,需要原数据)

再把进行修改的进程的页表更改,并把父子进程权限恢复。(只读->可读写)

3.对父进程而言,fork返回新创建进程的PID;对子进程而言,返回0。

4.新进程加入调度队列.

二:进程终止

退出码作用:

通常,退出码为0表示进程成功执行,而非零值表示错误或异常情况。

不同的非零值可以代表不同类型的错误。(退出码也可以用自己定义的)

echo $? 

查看最近一次进程退出码

char *strerror(int errnum);

用于根据错误码返回对应的错误信息字符串。

进程终止的方式

1.main函数return 

2.exit()

3._exit()

void exit(int status);

函数用于终止进程,并可以返回一个状态码给操作系统。它定义在 <stdlib.h> 头文件中。

#include <stdio.h>
#include <stdlib.h>int main() {printf("Starting the program...\n");// 假设发生了错误if (/* some error condition */ 1) {printf("An error occurred. Exiting the program.\n");exit(1); // 以状态 1 退出}printf("Program completed successfully.\n");exit(0); // 以状态 0 正常退出
}

void _exit(int status);

是一个系统调用,用于立即终止进程,而不执行任何清理工作。它定义在 <unistd.h> 头文件中。

exit和_exit不同

1.exit,退出时会刷新缓冲区,而_exit不会刷新缓冲区.

2.exit:适合在程序正常结束时使用,或者在需要进行资源清理时使用。_exit通常在子进程中使用,特别是在调用 fork 后,如果子进程出现错误或者需要立即终止而不影响父进程的状态时使用。

exit 会在内部调用 _exit 来完成终止进程的操作,但在此之前会执行清理工作。因此,可以认为 exit 是对 _exit 的封装。

三:进程等待

当我们fork创建子进程,等子进程结束后会进入僵尸状态,此时就需要父进程来回收子进程。父进程可以用wait waitpid来回收子进程获取退出信息。

pid_t wait(int *status)

父进程调用wait会阻塞,直到其任一子进程终止。参数status可以用来获取子进程的退出状态。

等待成功返回子进程pid,反之-1,并设置errno

解释:int*status是位图,看低16位,8~15位代表子进程的退出码。0~7退出信号的值。

进程退出情况:

1.代码跑完,结果正确return 0

   代码跑完,结果错误return !0    返回退出码 退出信号为0

2.进程异常,(越界访问 栈溢出)系统用信号提前终止进程。  返回退出信号

进程因接收到信号而终止,它不会返回正常的退出码。

1.获取退出码

WIFEXITED(status) 来检查子进程是否正常退出,

如果子进程正常退出,则可以调用 WEXITSTATUS(status) 来获得退出码。

2.获取退出信息

 WIFSIGNALED(status) 检查子进程是否因信号而终止,

如果子进程是因为信号终止的,可以使用 WTERMSIG(status) 来获取导致终止的信号编号。

pid_t waitpid (pid_t pid, int *status, int options)

pid_t waitpid(pid_t pid, int *status, int options);
1.pid 指定等待子进程的pid,为-1等待任意子进程。为 0,则等待与调用进程相同组的任何子进程。

2.status 输出型参数,带回子进程退出信息

3.options参数可以设定为 0,或者使用一些特定的选项来控制等待行为。

可以while循环重复调用直到子进程结束

  1. WNOHANG

    • 如果没有子进程结束,waitpid 会立即返回,而不是阻塞父进程。
    • 返回值:
      • 若有子进程结束,返回该子进程的 PID。
      • 若没有子进程结束,返回 0。

返回值:

1.成功时,返回子进程的进程ID。

2.子进程没有结束,返回0。

3.出错时,返回 -1,且设置 errno

四:进程替换

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

execl

int execl(const char *path, const char *arg0, ..., (char *) NULL);

execl是系统调用,是用新程序替换当前进程的映像。
path要执行程序的路径    

arg0 arg1 ... 执行方法 

最后以NULL结尾

eg. exel("bin/ls","ls","-l",nullptr);

1.execl是替换进程,并不是新建进程。

2.execl成功不返回 失败返回-1

execv

execv(const char *path, char *const argv[]);

和execl不同的是path后面不是可变参数列表,而是指针数组。

execle

execle(const char *path, const char *arg0, ..., NULL, char *const envp[]);

和execl一致,但可以传环境变量

execve

execve(const char *path, char *const argv[], char *const envp[]);

最底层的版本,允许传递参数和环境变量。

execlp 和 execvp

execlp(const char *file, const char *arg0, ..., NULL);

execvp(const char *file, char *const argv[]);

不同的是它可以在环境变量(PATH)的默认路径下查找

eg. execlp("ls", "ls", "-l", NULL); // 在 PATH 中查找 ls

execlpe 和 execvpe

int execvpe(const char *file, char *const argv[], char *const envp[]);
int execlpe(const char *file, const char *arg0, ..., NULL, char *const envp[]);
在execlp execvp基础上可以指定特定的环境变量

envp[]环境变量数组,以 NULL 结尾。如果传递 NULL,则使用当前进程的环境变量。

putenv 新增环境变量

#include <stdlib.h>int putenv(char *string);
  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno。

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

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

相关文章

Spring Boot Web框架:智慧社区设计新思路

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

cocos Creator + fairyGUI 快速入门

版本 Creator 3.8.x&#xff0c;FairyGUI 2022 大部分内容来自 https://en.fairygui.com/docs/sdk/creator 1.新建cocos项目&#xff0c;根目录运行 npm install --save fairygui-cc 引入 fairyGUI库 2.assets目录之外新建fairyGUI项目 3.fairyGUI中编辑UI 完成后发布到Creato…

uniapp,获取头部高度

头部自定义时候&#xff0c;设置获取安全区域&#xff0c;可以用 uni.getSystemInfoSync();接口。 <view class"statusBar" :style"{height:statusBarHeightpx}"> let SYSuni.getSystemInfoSync(); let statusBarHeightref(SYS.statusBarHeight) …

Python基础——类与对象

类与对象的理解&#xff1a; 在程序中我们将类看作是设计图纸&#xff0c;对象则是根据这个图纸生产的产品。面向对象编程就是使用对象编程&#xff0c;在类中我们定义成员属性和方法。 来看下面这个例子&#xff0c;创建student类&#xff0c;定义对象并对属性赋值。 class S…

解决linux服务器磁盘占满问题(详细,有效,100%解决)

应用场景&#xff1a; 在我们的日常开发中&#xff0c;我们的服务器总是在不知不觉中磁盘莫名奇妙少了很多空间&#xff0c;或者被占满了&#xff0c;如果这时候要想要存储什么文件&#xff0c;突然发现空间不够了。但我们通常也不知道那些文件占用的空间大&#xff0c;这时候…

Vue是一套构建用户界面的渐进式框架,常用于构建单页面应用

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

红黑树的理解与实现(详解)

相关的数据结构&#xff1a; 搜索二叉树-CSDN博客 AVL树的创建与检测-CSDN博客 个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 目录 一、红黑树规则&#xff1a; 二、红黑树的插入 1.变色 2.单旋变色 3.双旋变色 三、…

WebGoat SQL Injection (intro) 源码分析

首先了解 java 中 mysql 的连接&#xff1a;java连接Mysql WebGoat SQL Injection (intro) 10 根据提示&#xff1a;下面两个输入框只有一个受到 sql 注入攻击。题目要求是检索到所有数据 发现请求路径为 SqlInjection/assignment5b 定位到所在文件如下&#xff0c;根据代码…

【uniapp】使用Promise封装request

目录 1、创建config目录 2、创建settings.js 3、创建目录utils 4、创建request.js 5、创建api目录 6、创建apis.js文件 7、业务系统调用 7.1 业务系统banner 7.2 业务系统荣誉页面&#xff08;传参&#xff09; 前言&#xff1a;使用Promise封装request 1、创建config…

UNIX网络编程-传输层

概述 传输层主要包括&#xff1a;TCP、UDP、SCTP&#xff08;流控制传输协议&#xff09;&#xff01; 绝大多数客户端/服务器网络应用都使用TCP/UDP。SCTP是一个较新的协议&#xff0c;最初设计用于跨因特网传输电话信令。 这些传输协议都转而使用网络协议IP&#xff1a;或是…

2023年华为杯数学建模竞赛题F论文和代码

强对流降水临近预报建模与优化 对问题一&#xff0c;为了实现基于前一小时&#xff08;10帧&#xff09;的实测雷达观测量&#xff08;ZH、ZDR、KDP&#xff09;&#xff0c;对后续一小时&#xff08;10帧&#xff09;的ZH进行预报&#xff0c;本文首先建立了线性拟合与RMSE双驱…

matlab相位图

% 清空工作空间和命令窗口 clear; clc; % 模拟生成时间t&#xff0c;位移y(t)和角位移theta(t) t linspace(0, 100, 1000); % 时间从0到100&#xff0c;包含1000个点 y 1e-5 * sin(2 * pi * 0.1 * t) .* exp(-0.01 * t); % 位移y(t) 振荡衰减 theta 1e-6 * cos(2 * pi * …

Qt第十三天:网络编程:TCP和UDP的使用

我发现了有些人喜欢静静看博客不聊天呐&#xff0c; 但是ta会点赞。 这样的人呢帅气低调有内涵&#xff0c; 美丽大方很优雅。 说的就是你&#xff0c; 不用再怀疑哦 ❤️TCP&#xff1a; 一、创建项目&#xff0c;命名为Server&#xff0c;继承QWidget 二、添加Qt设计师…

如何进行数学家式的学习思考?

如何进行数学家式的学习思考&#xff1f; 学生阶段的数学学习是非常重要的&#xff0c;对这一点很少有人质疑。一提起数学学习&#xff0c;一些学生、家长甚至一些教师认为&#xff0c;学生的数学学习往往侧重于掌握基本概念、公式和解题技巧&#xff0c;通过做题来巩固知识和提…

【飞腾加固服务器】全国产化解决方案:飞腾FT2000+/64核,赋能关键任务保驾护航

在信息安全和自主可控的时代背景下&#xff0c;国产化设备的需求与日俱增&#xff0c;尤其是在国防、航空航天、能源和其他关键行业。高可靠性和极端环境设计的国产加固服务器&#xff0c;搭载强大的飞腾FT2000/64核处理器&#xff0c;全面满足国产自主可控的严苛要求。 性能强…

【Linux探索学习】第六弹——Linux的工具(一):Ubuntu系统下的软件包管理器

前言&#xff1a; 在Ubuntu系统中&#xff0c;Linux工具为用户提供了强大的命令行操作能力。这些工具不仅使日常任务的自动化成为可能&#xff0c;还大幅提升了生产力。本文将重点介绍一些常用的Linux工具&#xff1a;软件包管理器 注意&#xff1a;本文是所讲解的内容是在Ubun…

【C++基础篇】——逐步了解C++

【C基础篇】——逐步了解C 文章目录 【C基础篇】——逐步了解C前言一、C的第一个程序二、命名空间1.namespace的价值2.namespace的定义3.命名空间的使用 三、C的输入&输出四、缺省参数五、函数重载六、引用1.引用的概念和定义&#xff1a;2.引用的特性3.引用的使用4.const引…

使用LangGraph构建多Agent系统架构!

0 前言 Agent是一个使用大语言模型决定应用程序控制流的系统。随着这些系统的开发&#xff0c;它们随时间推移变得复杂&#xff0c;使管理和扩展更困难。如你可能会遇到&#xff1a; Agent拥有太多的工具可供使用&#xff0c;对接下来应该调用哪个工具做出糟糕决策上下文过于…

51单片机的超声波视力保护仪【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器光照传感器超声波传感器按键、LED、蜂鸣器等模块构成。适用于视力保护仪、坐姿矫正器、超声波防近视等相似项目。 可实现功能: 1、LCD1602显示温度、光照、距离和学习时间 2、超声波传感器采集头部与探…

【计算机网络】HTTP报文详解,HTTPS基于HTTP做了哪些改进?(面试经典题)

HTTP协议基本报文格式 在计算机网络中&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;是应用层的一种协议&#xff0c;用于客户端&#xff08;通常是浏览器&#xff09;和服务器之间的通信。HTTP报文分为请求报文和响应报文&#xff0c;以下是它们的基本格式。 1. H…