进程替换exec系列介绍

ececl,execlp,execle,execv,execvp   //库函数
execve   //系统调用

1.execl

which  ps

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{printf("main pid=%d\n",getpid());execl("/usr/bin/ps","ps","-f",(char *)0);exit(0);
}

注意,就是原来的程序换成了ps程序,但是PCB没有改变,但是PCB里面的有些值被修改了,比如pcb中程序的名字换成了新进程的名字;
思考1,新的进程从哪里执行呢?
新的进程从主函数的第一行开始执行,也就是ps程序的主函数的第一行代码开始执行,这个和fork方法不一样,fork返回以后,从fork所在位置开始执行; 所以可以直接在execl下面打印一个失败,如果成功就根本不会执行到这里; printf("execl error\n");

思考2:如果将execl里面的第二个参数改为"abc",程序还能否执行?
可以正常执行,只是程序命令改为了abc;

execl("/usr/bin/ps","abc","-f",(char *)0);

思考3:如果将execl里面的第一个参数改为"abc",程序还能否执行?
只要execl第一个参数不出错,第一个参数如果出错了,你就找不到这个程序了;  那么就运行不成功了;比如:

execl("/usr/bin/abc","ps","-f",(char *)0);

一定要在exec替换函数之后写:

printf("exec  error!\n");

失败了才运行到这一句.

思考4:去掉\n,会发生什么?

思考5:ps也是由ps.c编译为ps可执行程序的,同理cp也是;
(which ps which cp)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{printf("main pid=%d\n",getpid());execl("/usr/bin/cp","cp","yma.c","ymb.c",(char *)0);exit(0);
}

2.execlp

execlp("ps","ps","-f",(char *)0);

只给文件名,不需要给文件路径,因为它可以去环境变量PATH所指的位置去搜索;
注意,第一句,虽然有两个ps,但是不能省,第一个代表我们启动的是ps(去环境变量下搜索),第二个代表的是替换的程序也就是新程序的名字;

3.execle

和execl一样的参数,只是多了最后一个环境变量.

//int main(int argc,char *argv[],char *envp[])
execle("/usr/bin/ps","ps","-f",(char *)0,envp);

思考:如何使用自己的环境变量呢?

4.execv

execv是把参数都放在了一个数组中,然后把这个数组传递进去即可;

//int main(int argc,char *argv[],char *envp[])char *myargv[]={"ps","-f",0};
execv("/usr/bin/ps",myargv);

5.execvp

第一个参数只要文件名,不要路径;

//int main(int argc,char *argv[],char *envp[])char *myargv[]={"ps","-f",0};
execvp("ps",myargv);

看帮助手册,execvpe是GNU的扩展,不通用,所以我们这里不做介绍.
(但是我们其实已经知道,execvpe比execvp多了一个e,也就是多了一个环境变量)

6.execve(重点)

int execve(const char * path, char* const argv[],char* const envp[]); //系统调用

代码如下:

//int main(int argc,char *argv[],char *envp[])char *myargv[]={"ps","-f",0};
execve("/usr/bin/ps",myargv,envp);

总结:

//pathname:新替换的程序的路径+名字
//arg :传给新程序主函数的第一个参数,一般为程序的名字
//arg 后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数
int execl(const char* pathname, const char * arg,...);
int execlp(const char* file, const char * arg,...);
int execle(const char* pathname, const char * arg,...,char* const envp[]);
int execv(const char * pathname, char* const argv[]);
int execvp(const char * file, char* const argv[]);
int execve(const char * pathname, char* const argv[],char* const envp[]); //系统调用//前五个是库函数,最后一个是系统调用,所以本质上上面5个都是通过第六个系统调用实现的

也就是说,上面5个都是调用的execve,不过都是把参数放进数组,然后把数组传递给这个系统调用execve; 也就是说,这些方法没有本质区别; 也就是说,本质上只有一个替换方法,就是execve;

注意,写一个(char *)NULL也是可以的;

助记:
l(list)     参数地址列表,以空指针结尾
v(vector)   存放各个参数地址的指针数组的地址
p(path)   按PATH环境变量指定的目录搜索可执行文件
e(enviroment)  存放环境变量字符地址的指针数组的地址

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

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

相关文章

.Net HttpClient应用

.NET HttpClient 是一个类型&#xff0c;在 System.Net.Http 命名空间中&#xff0c;用于发送 HTTP 请求和接收 HTTP 响应。它是 .NET 框架和 .NET Core 中用于处理 HTTP 通信的主要工具。HttpClient 提供了一个高级别的 API&#xff0c;用于向 Web 服务发送请求并接收响应&…

数据仓库作业四:第7章 数据的属性与相似性

目录 第7章 数据的属性与相似性作业题 第7章 数据的属性与相似性 作业题 1、设有10个二元属性&#xff0c;3个数据对象的数据集&#xff08;表1&#xff09;。 id A 1 A_1 A1​ A 2 A_2 A2​ A 3 A_3 A3​ A 4 A_4 A4​ A 5 A_5 A5​ A 6 A_6 A6​ A 7 A_7 A7​ A 8 A_8 A8​…

工业通信原理——Modbus-TCP通信C语言程序代码

工业通信原理——Modbus-TCP通信C语言程序代码 前言 简单的Modbus-TCP通信的C语言程序代码示例,包括底层驱动层和应用层。 C语言程序代码详解 底层驱动层(modbus_driver.c): #include <stdio.h> #include <stdint.h> #include <stdbool.h>// 定义Mo…

蓝桥杯 试题 基础练习 十六进制转八进制

资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给定n个十六进制正整数&#xff0c;输出它们对应的八进制数。输入格式   输入的第一行为一个正整数n &#xff08;1&…

别再抱怨学鸿蒙没方向了! 这鸿蒙全栈(南北双向)开发学习路线收藏好!

在互联网技术不断发展的现在&#xff0c;鸿蒙操作系统的出现标志着是能技术领域的一次重大突破&#xff0c;鸿蒙作为华为推出的一代操作系统&#xff0c;鸿蒙不仅达代表了自主创新的力量&#xff0c;还因为独特的分布式架构和全场景适配能力而备受关注。随着鸿蒙生态的不断完善…

2024.4.7周报

摘要 在本周阅读的文献中&#xff0c;提出了基于Transformer的GAN模型&#xff0c;GAN的生成器和鉴别器&#xff0c;都是基于Transformer的编码器架构构建的&#xff0c;通过处理图像的方式处理时间序列数据作为该模型的输入。该模型能够生成各种长度的多维时间序列数据&#…

7.1.4 Selenium 爬取京东商品信息实战

目录 1、实战内容 2、思路 3、分析 url 4、开始操作 1、得到 Cookies 2、访问页面&#xff0c;得到 response 3、解析页面 4、存入 MySQL 5、1-3步总代码 1、实战内容 爬取京东笔记本电脑商品的信息(如&#xff1a;价格、商品名、评论数量)&#xff0c;存入 MySQL 中…

Mysql服务器主从相关

一主一从 准备两台服务器(以53为主,54为从)启动主服务器binlog日志 vim /etc/my.cnf.d/mysql-server.cnf [mysqld] server-id53 //指定主服务器的server-id为53 log-binmysql53 //修改binlog日志命名 :wqsystemctl restart mysqld //重载mysqld服务,使得以上配置生效 创…

11-新热文章-实时计算

热点文章-实时计算 1 今日内容 1.1 定时计算与实时计算 1.2 今日内容 kafkaStream 什么是流式计算 kafkaStream概述 kafkaStream入门案例 Springboot集成kafkaStream 实时计算 用户行为发送消息 kafkaStream聚合处理消息 更新文章行为数量 替换热点文章数据 2 实时…

备战蓝桥杯---最长公共子序列(LCS)模板

题目链接&#xff1a;最长公共子序列 import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner;public class Main {public static void main(String[] args){Scanner scannernew Scanner(System.in);int nscanner.nextInt();i…

C++ sleep相关延时函数

目录 秒相关单位进制转换 sleep() 函数&#xff1a; usleep() 函数&#xff1a; nanosleep() 函数&#xff1a; C11及以后版本的std::this_thread::sleep_for()&#xff1a; 秒相关单位进制转换 秒&#xff08;second, s&#xff09;是国际单位制&#xff08;SI&#xff…

vue watch监听的多种使用

简述&#xff1a;vue 的watch的监听使用的几种写法。常用第4中写法。 一、$route监听路由跳转 前提&#xff1a;当需要前端监听路由跳转的时候&#xff0c;一般写在App.vue入口 //App.vue //vue2、uniapp写法 watch: {$route(to, from) {if (hasPermission(to.path)) {this…

能源照明运作机制与智能调控技术实现途径

随着城市化进程的加速&#xff0c;智慧城市已成为现代城市发展的重要方向。能源照明作为城市基础设施的重要组成部分&#xff0c;其运作机制与智能调控技术的实现对于提高城市能源利用效率、促进可持续发展具有重要意义。 能源照明是一个涵盖广泛、错综复杂的领域&#xff0c;它…

Redis中的集群(一)

集群 概述 Redis集群是Redis提供的分布式数据库方案&#xff0c;集群通过分片(sharding)来进行数据共享&#xff0c;并提供复制和故障转移功能 节点 一个Redis集群通常由多个节点(node)组成&#xff0c;在刚开始的时候&#xff0c;每个节点都是相互独立的&#xff0c;它们都…

【优选算法专栏】专题十六:BFS解决最短路问题(二)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

奇函数+(-)偶函数一定是非奇非偶函数?

今天遇到个有意思的题&#xff0c;跟大家分享一下&#xff0c;可能有的人不太了解&#xff1a; 首先说下结论&#xff1a;这题选D选项&#xff0c;以上均有可能&#xff1b; 开始证明&#xff1a; 非奇非偶函数的充要条件&#xff1a; 定义域是(一a,a)(a>0)或(一 oo,oo)的…

【Linux】软硬链接 / 动静态库

目录 一. 软硬链接1. 硬链接2. 软链接3. unlink4. 目录的硬链接 二. 动静态库1.1 静态库制作1.2 静态库使用2.1 动态库制作2.2 动态库使用3. 动态链接原理 一. 软硬链接 1. 硬链接 硬链接(hard link) 可以将它理解为原始文件的别名, 和原始文件使用相同的 inode 编号和 data …

Mysql底层原理七:InnoDB 行记录

1.行格式 1.1 Compact行格式 1.1.1 示意图 1.1.2 准备一下 1&#xff09;建表 mysql> CREATE TABLE record_format_demo (-> c1 VARCHAR(10),-> c2 VARCHAR(10) NOT NULL,-> c3 CHAR(10),-> c4 VARCHAR(10)-> ) CHARSETascii ROW_FORMATCOM…

Blender怎么样启动默认移动和Cavity效果

在使用Blender的过程中&#xff0c;有一些特殊的技巧很重要。 比如默认地设置blender打开时&#xff0c;就是移动物体&#xff0c;这样怎么样设置的呢&#xff1f; 需要在界面里打开下面的菜单: 这样就找到默认设置的地方&#xff0c;把下面的移动勾选起来&#xff0c;这样点…

3.C++ Make

1.Makefile 1.1 什么是 Makefile 一个工程中有很多文件&#xff0c;文件之间都是相辅相成有着编译的先后顺序&#xff0c;但是如果自己手动根据编译顺序编译文件造成速度非常慢。Makefile 是”自动化编译“&#xff0c;只需一个 make 指令系统就会根据编译顺序帮自己编译文件…