【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数

news2024/12/23 23:16:59

 🎁个人主页:我们的五年

🔍系列专栏:Linux课程学习 

🌷追光的人,终会万丈光芒

🎉欢迎大家点赞👍评论📝收藏⭐文章

目录

替换原理:

替换函数:

命名理解:

命令:

6个exe函数 

1.execl函数

函数原型:

函数解释:

实例:

2.execv函数

函数原型:

函数解释:

示例:

3.execlp和execvp

函数原型:

4.execle和execve函数:

execvpe函数:

函数原型:

函数解释:

总结:


 

推荐书籍:

《深入理解计算机系统》《程序员的自我修养》

1.理解子进程去调用替换函数,达到我们想要的目的。shell命令行也是这样进行处理,我们每次操作的命令,都是fork()创建子进程,然后让子进程调用exe函数进行程序替换,去执行我们想要的程序。比如ls……这些都是一些执行对应程序。

2.进程替换没有创建新进程,所以调用替换函数的进程的pid不会发生变化。

3.程序替换函数只要成功,就会会发生代码替换,就不会有返回值。如果有返回值,就表示程序替换失败。

替换原理:

当一个程序调用exe类型的函数时,这个进程的用户空间代码和数据完全被新进程替换。

从新程序的启动历程开始执行。(C/C++从mian函数开始执行)

exe程序替换函数一般是子进程进行调用。

调用exe类型的函数不会创建新进程,调用exe函数的进程pid不会改变。

替换函数:

程序替换函数以exe开头,所以统称为exe函数。

这些函数包含在头文件:

#include <unistd.h>

命名理解:

●l(list):表示参数采用链表。

●v(vector):采用数组。

●p(PATH):有p表示自动搜索环境变量PATH。

●e(env):表示自己维护环境变量。

命令:

在/usr/bin中放置的就是命令的可执行文件。

6个exe函数 

1.execl函数

函数原型:

int execl(const char* path,const char* arg,...);

函数解释:

1.三个点表示可变参数列表,可以传多个参数。

2.path表示要替换程序的路径。(在哪里)

3.后面的arg表示什么样的命令执行。(怎么执行)


实例:

--color表示带颜色显式,这里有两个-。

也可以执行自己的路径,执行自己的可执行程序。

#include <unistd.h>
#include <iostream>
 
int main()
{
    int a=execl("/usr/bin/ls","ls","-l","-a","--color",nullptr);
                                                                                                    
    //如果打印了a的值就表示替换失败
    std::cout<<a<<std::endl;
    return 0;
}

2.execv函数

函数原型:

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

函数解释:

1.把这个和1号函数进行比较,唯一的区别就是后面不一样:

execv传递的是一个char* const的数组,而execl传递的是一个个const char*。

v像vector,表示数组。l像list表示的链表,链表就是分别传参。

2.这两个函数没有本质区别,底层都是调用execve。他们就只有传参的不一样,execl调用execve后,传递的每个const char*会变成一个char*数组。

3.后面的几个函数都只有参数不同,底层都调用execve。设计这么多函数是为了满足不同场景的需求,有时候就是要一个一个传参,有时候就有char*数组。

示例:

3.execlp和execvp

函数原型:

int execlp(const char* file,const char* arg,...);

int execlp(const char* file,char* const argv[]);

这两个函数都是带p的,就不要写路径。

 #include <unistd.h>
 #include <iostream>
 
 int main()
 {
     //int a=execl("/usr/bin/ls","ls","-l","-a","--color",nullptr); 
     //int a=execl("./myprocess","./myprocess",nullptr);
 
     pid_t id=fork();
 
     if(id==0)
     {

         char* const argv[]={
             (char*)"ls",
             (char*)"-l",
             (char*)"-a",
             (char*)"--color",
             nullptr                                                                                                                                                                                                
         };
 
         //int a=execv("/bin/ls",argvs);
 
         // int a=execlp("ls","ls","-l","-a","--color",nullptr);
 
         int a=execvp("ls",argv);
 
         //如果打印了a的值就表示替换失败
         std::cout<<a<<std::endl;
         exit(1);
     }

     pid_t pid=waitpid(id,nullptr,0);
 
     if(pid>0)
     {
         std::cout<<"等待进程成功!"<<std::endl;
     }
 
     else if(pid<0)
     {
         std::cout<<"等待进程失败!"<<std::endl;
     }
     return 0;
}

4.execle和execve函数:

有e的是要进行自己进行组装环境变量的。

带e的,需要⾃⼰组装环境变量 
execle("ps", "ps", "-ef", NULL, envp);
带e的,需要自己组装函数变量
execve("/bin/ps",argv,envp);

execvpe函数:

函数原型:

int execvpe(const char* file,char* const argv[],char* const env[]);

函数解释:

1.env是我们传递的全新的环境变量。对于env我们可以传递父进程的环境变量,也可以在父进程的环境变量上新增。

2.刚刚开始的bash进程就要传递自己写的环境变量。自己写的环境变量,自己定义,自己传递。

3.如何新增环境变量:

getenv:获取环境变量。

#include <stdlib.h>

char *getenv(const char *name);

putenv:新增环境变量。

#include <stdlib.h>

int putenv(char *string);

总结:

实际上,只有execve才是真正的系统调用,其他的函数都是调用execve。所以execve在man的手册2,其他函数在手册3。

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

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

相关文章

Bug:引入Feign后触发了2次、4次ContextRefreshedEvent

Bug&#xff1a;引入Feign后发现监控onApplication中ContextRefreshedEvent事件触发了2次或者4次。 【原理】在Spring的文档注释中提示到&#xff1a; Event raised when an {code ApplicationContext} gets initialized or refreshed.即当 ApplicationContext 进行初始化或者刷…

【智谱清言-注册_登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

煤炉Mercari新手开店十问十答

在跨境电商的浪潮中&#xff0c;Mercari&#xff08;煤炉&#xff09;作为一个备受瞩目的C2C二手商品交易平台&#xff0c;吸引了众多新手卖家的目光。然而&#xff0c;初次在Mercari开店可能会遇到各种问题和挑战。为此&#xff0c;我特别整理了2024年最新的十问十答指南&…

[面试]-golang基础面试题总结

文章目录 panic 和 recover**注意事项**使用 pprof、trace 和 race 进行性能调试。**Go Module**&#xff1a;Go中new和make的区别 Channel什么是 Channel 的方向性&#xff1f;如何对 Channel 进行方向限制&#xff1f;Channel 的缓冲区大小对于 Channel 和 Goroutine 的通信有…

【Flask+Gunicorn+Nginx】部署目标检测模型API完整解决方案

【Ubuntu 22.04FlaskGunicornNginx】部署目标检测模型API完整解决方案 文章目录 1. 搭建深度学习环境1.1 下载Anaconda1.2 打包环境1.3 创建虚拟环境1.4 报错 2. 安装flask3. 安装gunicorn4. 安装Nginx4.1 安装前置依赖4.2 安装nginx4.3 常用命令 5. NginxGunicornFlask5.1 ng…

一个用纯PHP开发的服务器-workerman

什么是Workerman 简单的说Workerman是一个纯php开发的服务器。 workerman的目标是让PHP开发者更容易的开发出基于socket的高性能的应用服务&#xff0c;而不用去了解PHP socket以及PHP多进程细节。 workerman本身是一个PHP多进程服务器&#xff0c;类似nginxphp-fpm的结合体&am…

如何在Linux上安装Canal同步工具

1. 下载安装包 所用到的安装包 canal.admin-1.1.4.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1B1LxZUZsKVaHvoSx6VV3sA 提取码&#xff1a;v7ta canal.deployer-1.1.4.tar.gz 链接&#xff1a;https://pan.baidu.com/s/13RSqPinzgaaYQUyo9D8ZCQ 提取码&#xff1a;…

Leetcode 组合

使用回溯来解决此问题。 提供的代码使用了回溯法&#xff08;Backtracking&#xff09;&#xff0c;这是一种通过递归探索所有可能解的算法思想。以下是对算法思想的详细解释&#xff1a; 核心思想&#xff1a; 回溯法通过以下步骤解决问题&#xff1a; 路径选择&#xff1a…

PyTorch使用教程-深度学习框架

PyTorch使用教程-深度学习框架 1. PyTorch简介 1.1-什么是PyTorch ​ PyTorch是一个广泛使用的开源机器学习框架&#xff0c;特别适合深度学习的应用。它以其动态计算图而闻名&#xff0c;允许在运行时修改模型&#xff0c;使得实验和调试更加灵活。PyTorch提供了强大的GPU加…

HTML的自动定义倒计时,这个配色存一下

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>自定义倒计时</title><style>* {mar…

Spark SQL 之 QueryStage

ExchangeQueryStageExec ExchangeQueryStageExec 分为两种

自由学习记录(23)

Lua的学习 table.concat(tb,";") 如果表里带表&#xff0c;则不能拼接&#xff0c;表里带nil也不能&#xff0c;都会报错 true和false也不可以&#xff0c;数字和字符串可以 if要和一个end配对&#xff0c;所以 if a>b then return true end end 两个end …

GoZero对接GPT接口的设计与实现:问题分析与解决

在本篇文章中&#xff0c;我们将探讨如何在GoZero框架下对接GPT接口&#xff0c;并详细讨论在实现过程中遇到的一些常见问题及其解决方案。特别是遇到的错误信息&#xff0c;如 parse parameter fail,recover: interface conversion: interface {} is nil, not string 和 获取历…

【2024 Optimal Control 16-745】【Lecture 3 + Lecture4】minimization.ipynb功能分析

主要功能-最小化问题 目标函数分析: 定义函数 f ( x ) f(x) f(x) 及其一阶、二阶导数。使用绘图工具可视化函数的形状。 实现数值优化: 使用牛顿法寻找函数的极值点&#xff0c;结合一阶和二阶导数加速收敛。使用正则化牛顿法解决二阶导数矩阵可能不正定的问题。 可视化过程…

实现 UniApp 右上角按钮“扫一扫”功能实战教学

实现 UniApp 右上角按钮“扫一扫”功能实战教学 需求 点击右上角扫一扫按钮(onNavigationBarButtonTap监听)&#xff0c;打开扫一扫页面(uni.scanCode) 扫描后&#xff0c;以网页的形式打开扫描内容(web-view组件)&#xff0c;限制只能浏览带有执行域名的网站&#xff0c;例如…

ThreadLocal 父子线程、线程池、数据传递

讲一下背景&#xff1a;springboot 项目。写了个拦截器&#xff0c;解析请求头 Authorization 中传过来的 token&#xff0c;获取到登录用户信息&#xff0c;然后通过 ThreadLocal 存起来&#xff0c;后面的业务代码从 ThreadLocal 取用户信息。 再说下问题&#xff1a;当业务代…

uniapp 微信小程序地图标记点、聚合点/根据缩放重合点,根据缩放登记显示气泡marik标点

如图&#xff0c;如果要实现上方的效果&#xff1a; 上方两个效果根据经纬度标记点缩放后有重复点会添加数量 用到的文档地址https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addMarkers.htmlMapContext.addMarkers(Object object) 添加标记点Ma…

ubuntu下如何使用C语言访问Mysql数据库(详细介绍并附有案例)

一、配置 首先&#xff0c;确保你已经安装了MySQL服务器和MySQL Connector/C库。在Linux上&#xff0c;你可以使用包管理器来安装这些&#xff0c;例如&#xff1a; sudo apt-get install mysql-server libmysqlclient-dev 在ubuntu的机器上&#xff0c;库文件通常保存在 /li…

uniapp接入BMapGL百度地图

下面代码兼容安卓APP和H5 百度地图官网&#xff1a;控制台 | 百度地图开放平台 应用类别选择《浏览器端》 /utils/map.js 需要设置你自己的key export function myBMapGL1() {return new Promise(function(resolve, reject) {if (typeof window.initMyBMapGL1 function) {r…

直播服务器多设备同显方案

在直播行业中&#xff0c;服务器多设备同显方案已成为一种创新且高效的技术应用。这一技术不仅能够满足大规模同步直播的需求&#xff0c;还能显著提升观众的观看体验和参与度。本文将深入探讨直播服务器多设备同显方案的技术细节、实施步骤以及在不同场景下的应用价值。 直播服…