Linux_进程控制

news2025/2/24 23:06:57

一:进程创建

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.coloradmin.cn/o/2214840.html

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

相关文章

分享一些毕业论文答辩的ppt模板啦

优秀的论文需要有更精炼的载体呈现&#xff0c;如何提炼论文之中的精华并将其完整传递给听众&#xff08;你的导师或同学&#xff09;是每位毕业生的必学功课。PPT作为图文格式的集大成者&#xff0c;能够在一定程度上满足上面的需求&#xff0c;所以&#xff0c;学会利用ppt&a…

关乎于电子地图

文章目录 一、OGC与OpenGIS二、google map三、瓦片坐标系统四、可用地图图源汇总4.1Google Map4.2天地图4.3 必应地图4.4 高德公开地图4.5 星图地球4.6 ArcGIS可用的图源 一、OGC与OpenGIS OGC&#xff08;Open Geospatial Consortium&#xff09;——开放地理信息联盟&#x…

HCIE-Datacom题库_01_防火墙【18道题】

一、单选题 1.相比较于路由器、交接机&#xff0c;防火墙转发独有的模块为? 交换网板 MPU LPU SPU 解析&#xff1a; SFU&#xff08;Switch Fabric Unit&#xff09;&#xff1a;交换网板&#xff0c;负责整个系统的数据平面数据平面提供高速无阻塞数据通道&#xff0…

Linux系统:配置Apache支持CGI(Ubuntu)

配置Apache支持CGI 根据以下步骤配置&#xff0c;实现Apache支持CGI 安装Apache&#xff1a; 可参照文章&#xff1a; Ubuntu安装Apache教程。执行以下命令&#xff0c;修改Apache2配置文件000-default.conf&#xff1a; sudo vim /etc/apache2/sites-enabled/000-default.con…

【深度学习量化交易2】财务自由第一步,三个多月的尝试,找到了最合适我的量化交易路径

在上一篇文章中&#xff0c;我讲到了尝试开展量化交易的一些初步的想法&#xff1a;Mr.看海&#xff1a;【深度学习量化交易1】一个金融小白尝试量化交易的设想、畅享和遐想 一晃三个多月时间过去了&#xff0c;十一前后股市突然爆火&#xff0c;行情也像过山车一样&#xff0…

面对服务器掉包的时刻困扰,如何更好的解决

在数字化时代&#xff0c;服务器的稳定运行是企业业务连续性的基石。然而&#xff0c;服务器“掉包”现象&#xff0c;即数据包在传输过程中丢失或未能正确到达目的地的情况&#xff0c;却时常成为IT运维人员头疼的问题。它不仅影响用户体验&#xff0c;还可能导致数据不一致、…

spring boot热部署

使用热部署解决了每次都需要重新启动的问题&#xff0c;但不过热部署的在对于改动比较小时速度可能快一些&#xff0c;改动大的话尽量停止 1.使用热部署之前需要在pom.xml文件中导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifa…

基于SpringBoot+vue学生成绩管理系统

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的学生成绩管理系统&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL…

网关Gateway作用介绍和快速入门

目前架构问题分析 这里有很多微服务&#xff0c;每个微服务都需要晚上访问数据库去完成各自的业务&#xff0c;并且需要在nacos进行注册和管理&#xff0c;每一个微服务之间需要相互调用的时候&#xff0c;可以用Feign进行调用&#xff0c;当外部需要访问的时候&#xff0c;就直…

Linux操作系统——外存的管理(实验报告)

实验 Linux系统外存管理 一、实验目的 熟练Linux系统外存管理的方法与命令。 二、实验环境 硬件&#xff1a;PC电脑一台&#xff0c;网络正常。 配置&#xff1a;win10系统&#xff0c;内存大于8G 硬盘500G及以上。 软件&#xff1a;VMware、Ubuntu16.04。 三、实验内容 …

Type-c取点诱骗方案

如今随着这几年的USB-C PD适配器的普及&#xff0c;消费者手上的PD协议适配器越来越普遍&#xff0c;如何让微软surface 充电器线支持使用PD适配器快充&#xff1f;加入一颗受电端PD协议取电芯片——LDR6328能够完美的兼容市面上的PD适配器&#xff0c;支持不同的电压输出。 1…

javaweb以html方式集成富文本编辑器TinyMce

前言&#xff1a; 单一的批量图片上传按钮&#xff0c;禁用tinymce编辑器&#xff0c;但是还可以操作图片编辑&#xff1b; 多元化格式的富文本编辑要求&#xff1b; 采用tinymce实现。 附&#xff1a; tinymce中文手册网站&#xff1a; http://tinymce.ax-z.cn/download-all.…

Jmeter监控服务器性能

目录 ServerAgent 安装 打开Jmeter ServerAgent 在Jmeter上监控服务器的性能比如CPU&#xff0c;内存等我们需要用到ServerAgent&#xff0c;这里可以下载我分享 ServerAgent-2.2.3.zip 链接: https://pan.baidu.com/s/1oZKsJGnrZx3iyt15DP1IYA?pwdedhs 提取码: edhs 安装…

考研C语言程序设计_编程题相关(持续更新)

目录 零、说明一、程序设计经典编程题(C语言实现)T1 求1~100的奇数T2 求n!T3 求1!2!3!...10!T4 在一个有序数组中查找具体的某个数字n(二分查找)T5 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚T6 模拟用户登录(三次机会)T7 输入三个数 并从大到小输出T8…

实战篇:(四)Vue2 + Three.js 创建可交互的360度全景视图,可控制旋转、缩放完整代码

Vue2 Three.js 创建可交互的360度全景视图&#xff0c;可控制旋转、缩放 引言 在现代网页开发中&#xff0c;三维图形技术已经成为提升用户体验的重要工具。本文将展示如何使用 Three.js 创建一个简单的可交互360度全景视图。通过这一项目&#xff0c;你将能够学习到基本的场…

使用 KVM 在 Xubuntu 上创建 Windows 10 虚拟机

目录 前言说明注意准备 iso官网思博主(嘻嘻)拖动到虚拟机里面启动 virt-manager创建虚拟机选择本地安装介质选择 iso配置 内存 和 CPU选择 创建的虚拟机 保存的位置启动虚拟机看到熟悉的 Win10界面点击现在安装点击我没有产品密钥选择 Win10 专业工作站版勾选接受许可条款选择自…

grafana 配置prometheus

安装prometheus 【linux】麒麟v10安装prometheus监控&#xff08;ARM架构&#xff09;-CSDN博客 登录grafana 访问地址&#xff1a;http://ip:port/login 可以进行 Grafana 相关设置&#xff08;默认账号密码均为 admin&#xff09;。 输入账户密码 添加 Prometheus 数据源…

文件上传漏洞-绕过js验证

1.漏洞原理&#xff1a; Web应用系统虽然对用户上传的文件进行了校验&#xff0c;但是校验是通过前端javascript代码完成的。由于恶意用户可以对前端javascript进行修改或者是通过抓包软件篡改上传的文件&#xff0c;就会导致基于js的校验很容易被绕过。 2.判断页面是否存在前…

SpringBoot下的智能健康推荐引擎

3系统分析 3.1可行性分析 通过对本基于智能推荐的卫生健康系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于智能推荐的卫生健康系统采用SSM框架&#…

穷举vs暴搜vs深搜vs回溯vs剪枝(一)

文章目录 全排列子集找出所有子集的异或总和再求和全排列 II电话号码的字母组合 全排列 题目&#xff1a;全排列 思路 通过深度优先搜索的方式&#xff0c;不断枚举每个数在当前位置的可能性&#xff0c;然后回溯到上一个状态&#xff0c;直到枚举完所有可能性得到正确的结果 r…