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.rhkb.cn/news/447390.html

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

相关文章

Qt - 地图相关 —— 1、加载百度在线地图(附源码)

效果图 开始加载地图 1、百度地图开发者网站中注册,获取密钥 2、进入开发文档中 将下图内容保存到本地文件中,文件名为"index.html"文件即可。接着将内容中的“您的密钥”改为刚刚创建应用出来的AK密钥即可。 然后双击打开若在浏览器中正常看到下图右侧地图则说明没…

解压包软件下载:选择合适的解压软件

在日常办公和生活中&#xff0c;解压包软件扮演着至关重要的角色。首先&#xff0c;它极大地便利了文件管理。 随着数字化时代的发展&#xff0c;我们每天都会接触到大量的文件&#xff0c;包括文档、图片、音频、视频等。 这些文件如果不进行有效的管理&#xff0c;很容易变…

element plus的el-select分页

摘要&#xff1a; el-select的数据比较多的时候&#xff0c;必须要分页&#xff0c;处理方案有全部数据回来&#xff0c;或者添加搜索功能&#xff0c;但是就有个问题就是编辑的时候回显问题&#xff0c;必须要保证select的数据有对应的id与name匹配回显&#xff01; <el-fo…

如何在 WinCC Runtime Professional 中自动调整画面分辨率适应窗口的大小?

通过在组态中修改窗口和运行设置&#xff0c;可以使在窗口中显示画面的尺寸自动适应新窗口的尺寸。 问题描述 设备硬件改变&#xff0c;例如更换显示器&#xff0c;会引起 WinCC Runtime Professional 分辨率变化。在WinCC Runtime Professional中分辨率的变化会导致画面显示尺…

安装R和RStudio:开始你的数据分析之旅

数据分析是当今世界中一个非常热门的领域&#xff0c;而R语言是进行数据分析的强大工具之一。R是一种编程语言和软件环境&#xff0c;用于统计计算和图形表示。RStudio是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;它为R语言提供了一个更加友好和高效的工作环境。…

架构设计笔记-19-大数据架构设计理论与实践

知识要点 案例分析 1.Lambda架构优缺点 2.web架构设计 3.web系统架构设计相关技术 论文

基于RPA+AI的网页自动填写机器人 | OPENAIGC开发者大赛高校组优秀作品

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给…

【项目案例】-音乐播放器-Android前端实现-Java后端实现

精品专题&#xff1a; 01.C语言从不挂科到高绩点 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. SpringBoot详细教程 https://blog.csdn.ne…

【中文版】深度学习 deep learning 花书 pdf下载 2017.09.04

中文版pdf&#xff1a;https://pan.baidu.com/s/1s93yluQGSly5uBDAIVAlNg?pwdx6xy github&#xff1a;https://github.com/exacity/deeplearningbook-chinese 目录 第一章 前言第二章 线性代数第三章 概率与信息论第四章 数值计算第五章 机器学习基础第六章 深度前馈网络第七…

2014年国赛高教杯数学建模A题嫦娥三号软着陆轨道设计与控制策略解题全过程文档及程序

2014年国赛高教杯数学建模 A题 嫦娥三号软着陆轨道设计与控制策略 嫦娥三号于2013年12月2日1时30分成功发射&#xff0c;12月6日抵达月球轨道。嫦娥三号在着陆准备轨道上的运行质量为2.4t&#xff0c;其安装在下部的主减速发动机能够产生1500N到7500N的可调节推力&#xff0c;…

【人工智能AIGC术语100条】Shelly聊AI-重磅发布!

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 01 人工智能&AIGC术语100条全网发布 在…

Android ImageView scaleType使用

目录 一、src设置图片资源 二、scaleType设置图片缩放类型 三、scaleType具体表现 matrix&#xff1a; fitXY: fitStart&#xff1a; fitCenter&#xff1a; fitEnd: Center&#xff1a; centerCrop: centerInside&#xff1a; 控制ImageView和图片的大小保持一致…

【日记】可以不用考了,感觉铁过不了(413 字)

正文 可能是上午睡了一整个上午&#xff0c;中午直接睡不着了。不知道为什么&#xff0c;上午特别困&#xff0c;给主管说了一声&#xff0c;去隔壁休息室里开躺。有业务时又出来&#xff0c;脑袋晕晕的。办完又回去睡觉了。 中午玩了会儿&#xff0c;打过了劫波&#xff0c;开…

Qt消息对话框

问题对话框 对应API [static] QMessageBox::StandardButton QMessageBox::question( QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons StandardButtons(Yes | No), QMessageBox::StandardButton defaultButt…

外包干了5天,技术明显退步

我是一名本科生&#xff0c;自2019年起&#xff0c;我便在南京某软件公司担任功能测试的工作。这份工作虽然稳定&#xff0c;但日复一日的重复性工作让我逐渐陷入了舒适区&#xff0c;失去了前进的动力。两年的时光匆匆流逝&#xff0c;我却在原地踏步&#xff0c;技术没有丝毫…

vscode gitlens收费破解

首先打开vscode 插件栏 搜索GitLens 找到对应插件 这里我已经安装完成&#xff0c;如果未安装的点击install 并且下载指定版本V15.1.0 不然后续操作 不生效 找到对应面板 点击查看GitLens 安装完成后&#xff0c;并不能立即使用 显示一下内容&#xff0c;需要付费 这里很关键&…

Mysql 5.7 安装与卸载(非常详细)

一、环境介绍 操作系统&#xff1a;CentOS 7 MySQL&#xff1a;5.7 二、MySQL卸载 # 查看软件 rpm -qa|grep mysql # 卸载MySQL yum remove -y mysql mysql-libs mysql-common rm -rf /var/lib/mysql rm /etc/my.cnf 继续查看是否还有 MySQL 软件&#xff0c;有的话继续删…

uniapp——h5的控制台调试、h5调试

介绍 小程序在调试的时候可以打开调试模式&#xff0c;可以看到console.log的打印情况。 但是H5运行到手机上没有默认的调试的模式&#xff0c;但是可以人为手动加一个。 如何实现 1、main.js文件 import Vconsole from ‘vconsole’ /** 关闭正式环境打印日志&#xff…

C语言之扫雷小游戏(完整代码版)

说起扫雷游戏&#xff0c;这应该是很多人童年的回忆吧&#xff0c;中小学电脑课最常玩的必有扫雷游戏&#xff0c;那么大家知道它是如何开发出来的吗&#xff0c;扫雷游戏背后的原理是什么呢&#xff1f;今天就让我们一探究竟&#xff01; 扫雷游戏介绍 如下图&#xff0c;简…

13.1 Linux_网络编程

字节序 1、概述 什么是字节序&#xff1a; 字节序就是字节的存储顺序&#xff0c;分为大端字节序和小端字节序。 大端字节序&#xff1a;低地址存高位&#xff08;网络&#xff09;小端字节序&#xff1a;低地址存低位&#xff08;主机&#xff09; 检验主机字节序模式&…