【C++高并发服务器WebServer】-2:exec函数簇、进程控制

在这里插入图片描述

本文目录

  • 一、exec函数簇介绍
  • 二、exec函数簇

一、exec函数簇介绍

exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。

exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容(也就是新的进程信息会替换原进程的“用户区”的信息)取代,只留下进程ID等一些表面上的信息仍保持原样(比如PID、PPID、进程组号等这些在内核区的PCB中的信息),颇有些神似“三十六计"中的“金蝉脱壳”。看上去还是旧的躯壳,却已经注入了新的灵魂。只有调用失败了,它们才会返回-1,从原程序的调用点接着往下执行。

二、exec函数簇

int execl(const char *path,const char *arg,.../* (char *) NULL */);
int execlp(const char *file,const char *arg,.../* (char *) NULL */);
int execle(const char *path,const char *arg,.../* (char *) NULL ,char * const envp[] */;int execv(const char *path,char *const argv[]);
int execvp(const char *file ,char *const argv[]);
int execvp(const char *file,char *const argv[], char *const envp[]);//前面几个都是标准c库的函数,下面这个是linux的函数,一般来说就最上面两个用的最多。
int execve(const char *filename,char *const argv[],char *const envp[]); 

l:list参数地址列表,以空指针结尾。
v:vector存有各参数地址的指针数组的地址。
p:path按PATH环境变量指定的目录搜索可执行文件。
e:environment存有环境变量字符串地址的指针数组地址。

输入man 3 exec查看标准C库的文档解释:
在这里插入图片描述

首先在某个文件夹下创建hello.c文件,代码如下:

#include <stdio.h>int main() {    printf("hello, world\n");return 0;
}

然后在同级文件夹下创建execl.c文件,然后通过gcc exec.c -o exec进行编译。

/*#include<unistd.h>int execl(const char *path, const char *arg, ...);参数:-path:需要指定的执行的文件路径或者相对路径的名称比如a.out 或者/home/linux/a.out执行a.out的时候可以传递一些参数,所以后面都是可变参数-arg:是执行可执行文件需要的参数列表第一个参数一般没有什么作用,为了方便,一般写的是程序的名称、从第二个参数开始往后,就是程序执行所需要的参数。参数最后需要以NULL结束(哨兵)。返回值:只有出错的时候才会有返回值,返回-1,并且设置errno。如果调用成功,没有返回值。为什么没有返回值?因为用户区的内容已经被替换了。
*/#include <unistd.h>
#include <stdio.h>
#include<sys/types.h>int main() {// 创建一个子进程,在子进程中执行exec函数族中的函数pid_t pid = fork();if(pid > 0) {// 父进程printf("我是父进程, pid : %d\n",getpid());sleep(1);}else if(pid == 0) {// 子进程execl("hello","hello",NULL);//也可以试着跑一下系统的shell命令,也就是ps aux查看进程的命令,ps是可执行文件,aux是参数。//execl("/bin/ps", "ps", "aux", NULL);	}for(int i = 0; i < 3; i++) {printf("i = %d, pid = %d\n", i, getpid());}return 0;
}

运行./exec,会发现输出了hello,world! 并且只有父进程在输出for循环,子进程因为跳出实现另一个进程,不会再往下执行了。

在这里插入图片描述

下面的execlp函数则是到环境变量(输入env 即可查看环境变量,可以看到ps的环境变量是/usr/local/bin,所以下面的代码是可以成功找到ps并且执行的。)中去找可执行文件,所以不需要路径。

/*  #include <unistd.h>int execlp(const char *file, const char *arg, ... );- 会到环境变量中查找指定的可执行文件,如果找到了就执行,找不到就执行不成功。- 参数:- file:需要执行的可执行文件的文件名a.outps- arg:是执行可执行文件所需要的参数列表第一个参数一般没有什么作用,为了方便,一般写的是执行的程序的名称从第二个参数开始往后,就是程序执行所需要的的参数列表。参数最后需要以NULL结束(哨兵)- 返回值:只有当调用失败,才会有返回值,返回-1,并且设置errno如果调用成功,没有返回值。int execv(const char *path, char *const argv[]);argv是需要的参数的一个字符串数组char * argv[] = {"ps", "aux", NULL};execv("/bin/ps", argv);*/
#include <unistd.h>
#include <stdio.h>int main() {// 创建一个子进程,在子进程中执行exec函数族中的函数pid_t pid = fork();if(pid > 0) {// 父进程printf("i am parent process, pid : %d\n",getpid());sleep(1);}else if(pid == 0) {// 子进程execlp("ps", "ps", "aux", NULL);printf("i am child process, pid : %d\n", getpid());}for(int i = 0; i < 3; i++) {printf("i = %d, pid = %d\n", i, getpid());}return 0;
}

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

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

相关文章

TDengine 与上海电气工业互联网平台完成兼容性认证

在工业数字化转型和智能化升级的浪潮中&#xff0c;企业对高效、可靠的数据管理解决方案的需求日益增长。特别是在风电智能运维、火电远程运维、机床售后服务等复杂多样的工业场景下&#xff0c;如何实现海量设备和时序数据的高效管理&#xff0c;已经成为推动行业升级的关键。…

Jenkins pipline怎么设置定时跑脚本

目录 示例&#xff1a;在Jenkins Pipeline中设置定时触发 使用pipeline指令设置定时触发 使用Declarative Pipeline设置定时触发 使用Scripted Pipeline设置定时触发 解释Cron表达式 保存和应用配置 小结 在Jenkins中&#xff0c;定时跑脚本&#xff08;例如定时执行Pip…

kotlin的协程的基础概念

Kotlin的协程是一种用于简化异步编程的强大工具。 理解协程的基础概念可以帮助开发者有效地利用其能力。 以下是Kotlin协程的一些关键基础概念&#xff1a; 协程&#xff08;Coroutines&#xff09; &#xff1a; 协程是一种用于处理并发任务的编程模型&#xff0c;它可以在单…

machine learning knn算法之使用KNN对鸢尾花数据集进行分类

通过导入必要的scikit-learn导入必要的库&#xff0c;加载给定的数据&#xff0c;划分测试集和训练集之后训练预测和评估即可 具体代码如下&#xff1a; import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split f…

springEl 构建通用树

再项目开发中&#xff0c;需要构建组织的树形&#xff0c;菜单的树形&#xff0c;字典树形。感觉相似的代码写了一堆&#xff0c;就想着有没有办法&#xff0c;写个通用的方法去处理下&#xff1f; 学习了《SpringEL详解》&#xff0c;用springEl处理下。 构建树形&…

C++ 入门速通-第1章【黑马】

内容来源于&#xff1a;黑马 集成开发环境&#xff1a;CLion CLion的官方下载网址&#xff1a;CLion: A Cross-Platform IDE for C and C by JetBrains 我在b站找到了一个安装教程&#xff0c;可以按照这个视频教程进行安装&#xff08;内置汉化教程&#xff09;&#xff1a; …

Python的进程和线程

ref 接受几个设定: 进程是一家almost密不透风的公司,缅甸KK园区 线程里面工作的…人 进程**[园区]**内公共资源对于进程来说,可以共享. 别的园区[进程],一般不能和自己的园区共享人员资源,除非… 好的,现在再接受设定: 单个CPU在任一时刻只能执行单个线程&#xff0c;只有…

算法基础 -- AVL树初识

AVL树初识 一、AVL树简介 AVL树是一种自平衡二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;&#xff0c;于1962年由Georgy Adelson-Velsky和Evgenii Landis提出&#xff0c;名字也来自他们两位的姓氏首字母组合。它通过在插入、删除节点后维持平衡性&#xff0c…

MySQL数值型函数详解

简介 本文主要讲解MySQL数值型函数&#xff0c;包括&#xff1a;ROUND、RAND、ABS、MOD、TRUNCATE、CEIL、CEILING、FLOOR、POW、POWER、SQRT、LOG、LOG2、LOG10、SIGN、PI。 本文所有示例中&#xff0c;双横杠左边为执行的SQL语句&#xff0c;右边为执行语句的返回值。 ROU…

自动化01

测试用例的万能公式&#xff1a;功能测试界面测试性能测试易用性测试安全性测试兼容性测试 自动化的主要目的就是用来进行回归测试 新产品--第一个版本 (具备丰富的功能)&#xff0c;将产品的整体进行测试&#xff0c;人工创造一个自动化测试用例&#xff0c;在n个版本的时候…

Spring中的事务管理器TransactionManager

目录 一、主要功能 二、使用场景说明 在Spring框架中&#xff0c;事务管理器&#xff08;TransactionManager&#xff09;是用于管理事务的重要接口。它提供了对事务的全面控制&#xff0c;包括事务的状态管理和资源管理等功能。本文将详细介绍TransactionManager的主要功能、…

c语言(转义字符)

前言&#xff1a; 内容&#xff1a; 然后记一下转义字符 \? 在书写连续多个问号时使用&#xff0c;防止他们被解析成三字母词 \ 用于表示字符常量 \\ 用于表示一个反斜杠&#xff0c;防止他被解析为一个转义序列符 \n 换行 \r …

Vue3 30天精进之旅:Day02 - 环境搭建

引言 在前一天的学习中&#xff0c;我们了解了Vue.js的基本概念和优势。今天&#xff0c;我们将进入实际开发的第一步——环境搭建。良好的开发环境是顺利开展项目的基础&#xff0c;本文将指导你在本地设置Vue开发环境&#xff0c;并快速上手第一个Vue项目。 1. 环境准备 在…

代码随想录 栈与队列 test 7

347. 前 K 个高频元素 - 力扣&#xff08;LeetCode&#xff09; 首先想到哈希&#xff0c;用key来存元素&#xff0c;value来存出现次数&#xff0c;最后进行排序&#xff0c;时间复杂度约为o(nlogn)。由于只需求前k个&#xff0c;因此可以进行优化&#xff0c;利用堆来维护这…

汇编实验·子程序设计

一、实验目的: 1.掌握汇编中子程序编写方法 2.掌握程序传递参数的基本方法,返回值的方法。 3.掌握理解子程序(函数)调用的过程 二、实验内容 1.编写汇编语言子程序,实现C表达式SUM=X+Y的功能,具体要求: 1)函数的参数传递采用寄存器实现 2)函数的参数传递采用堆栈…

jmeter中对接口进行循环请求后获取相应数据

1、工作中遇到一个场景就是对某个单一接口进行循环请求&#xff0c;并需要获取每次请求后返回的相应数据&#xff1b; 2、首先就在jmeter对接口相关组件进行配置&#xff0c;需要组件有&#xff1a;循环控制器、CSV数据文件设置、计数器、访问接口、HTTP信息头管理器、正则表达…

trimesh 旋转

trimesh.transformations.rotation_matrix(np.radians(rot_angle), rot_axis) np.radians(rot_angle)&#xff1a;将角度 rot_angle 转换为弧度。trimesh 和大多数 3D 库通常使用弧度来表示旋转角度&#xff0c;而不是角度。 rot_axis&#xff1a;表示旋转轴的向量。例如&…

Jetson Xavier NX 安装 CUDA 支持的 PyTorch 指南

本指南将帮助开发者完成在 Jetson Xavier NX 上安装 CUDA 支持的 PyTorch。 安装方法 在 Jetson 上安装 Pytorch 只有两种方法。 一种是直接安装他人已经编译好的 PyTorch 轮子&#xff1b;一种是自己从头开始开始构建 PyTorch 轮子并且安装。 使用轮子安装 可以从我的 Gi…

Ansible fetch模块详解:轻松从远程主机抓取文件

在自动化运维的过程中&#xff0c;我们经常需要从远程主机下载文件到本地&#xff0c;以便进行分析或备份。Ansible的fetch模块正是为了满足这一需求而设计的&#xff0c;它可以帮助我们轻松地从远程主机获取文件&#xff0c;并将其保存到本地指定的位置。在这篇文章中&#xf…

【AI论文】生成式视频模型是否通过观看视频学习物理原理?

摘要&#xff1a;AI视频生成领域正经历一场革命&#xff0c;其质量和真实感在迅速提升。这些进步引发了一场激烈的科学辩论&#xff1a;视频模型是否学习了能够发现物理定律的“世界模型”&#xff0c;或者&#xff0c;它们仅仅是复杂的像素预测器&#xff0c;能够在不理解现实…