进程控制-进程的替换

news/2024/11/8 17:48:10/

回顾

对于进程,我们已经有了初步的了解,我们学会了进程的终止,进程的等待,还有如果创建子进程。

这次,我们来学习如何把一个进程运行的代码和数据替换成其他的代码和数据。

进程的替换

为什么要进程替换,在某些场景下,我们需要创建子进程,并且想让子进程运行其他的程序而不是父进程的代码,所以就有了进程的替换。

man 3 手册查看的是库提供的函数

man 3 execl  //使用man手册查看execl函数
#include <unistd.h>extern char **environ;int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

 man 2 手册查看的是系统提供的函数

man 2 execve
#include <unistd.h>int execve(const char *filename, char *const argv[], char *const envp[]);

实际上这些函数的用法差异并不大,只要掌握了命名风格,就很好理解。

l(list) : 表示参数采用列表
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 表示自己维护环境变量
 

1.execl

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>                                                                                                                                                          
int main()
{if(fork() == 0){//子进程//路径        //命令行参数(以NULL结尾)execl("/usr/bin/ls","ls","-a","-l",NULL);printf("hello world\n");}printf("i am father\n");pid_t ret = wait(NULL); if(ret >0){printf("father wait success!\n");}else{printf("father wait fail\n");exit(1);                                                                                                                      }                                                                                                                                      return 0;                                                                                                                       
}  

使用fork创建子进程,在子进程中使用execl函数替换为其他程序。

先看看execl的参数

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

path是一个字符串,而这个字符串就是我们想要替换的程序的路径

arg则是可变参数,并且它也是字符串。它们则是该程序的名字+你想要的命令行参数,并且记住以NULL结尾。

从输出结果来看,它输出了ls -a -l 的内容,而这些,就是我们的子进程运行的,子进程替换成了ls -a -l 指令进程。

2.execv

execv与execl不同的地方则是它们的第二个参数,execl是字符串的可变参数,execv的第二个参数是一个指针数组。

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

 

 而execv 的argv只不过就是把所有的命令行参数整合成了一个数组,与execl并没有太大的区别。

3.execlp

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

execlp在命名上execl多了一个p,而这个p的含义就是 它会自己去自动搜索PATH环境变量中的程序。

 

 

 所以execlp就是直接在PATH环境变量中找对应的程序。

4.execvp

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

如果你理解了上面的execlp,那么execvp也很好理解了,它就可以自动在PATH环境变量中寻找对应的程序。

相信不难理解。 

 

5.execle

从命名上比execl多了一个e,而e的含义就是可以给替换的进程 传入你想传入的环境变量。

从参数上,它多了一个envp的指针数组,这个指针数组就是你想传入的环境变量。

int execle(const char *path, const char *arg, ..., char * const envp[]);

我们写一个等会需要替换的代码,它会输出它所有的环境变量。

 Makefile 同时编译两个C语言进程的方法

 

 

 

 

 execle就是需要自己组装环境变量,就是把环境变量塞入需要替换的进程!

6.execve

int execve(const char *filename, char *const argv[], char *const envp[]);

也很好理解,在execv的基础上多了一个e的功能。

 

 

7.execvep

从命名风格看,是不是就知道它怎么使用了呢?

l(list) : 表示参数采用列表
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 表示自己维护环境变量

 这里就不再做演示了。

总结

虽然进程的替换有很多函数接口,但是,实际上他们的用法都是大同小异,理解它们的命名风格,就懂了。


http://www.ppmy.cn/news/76686.html

相关文章

微信小程序全局路由拦截

前言 略 微信小程序全局路由拦截方法1 目前微信小程序没有全局路由拦截。要想实现全局路由拦截&#xff0c;需要自己进行扩充。具体参考这里&#xff1a;微信小程序–路由拦截器。 实现思路&#xff1a; 替换Page的参数对象的onShow或onLoad方法。在替换的onShow或onLoad方…

ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之网络安全新总结

ChatGPT&#xff1a;你真的了解网络安全吗&#xff1f;浅谈网络安全攻击防御进行时 网络安全新总结总结 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;美国OpenAI 研发的聊天机器人程序&#xff0c;是人工智能技术驱动…

直播和短视频美颜sdk的开发流程、代码分析

目前&#xff0c;美颜技术是提高视频质量的重要手段之一&#xff0c;特别是短视频和直播两个行业。本文将介绍其开发流程和代码分析。 一、美颜SDK的开发流程 1.需求分析 首先我们需要明确的一点就是“需求”&#xff0c;例如&#xff1a;美颜效果、美颜程度、性能要求等。同…

Windows系统数据结构——最小生成树、Prim算法和Kruskal算法

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows系统数据结构——最小生成树、Prim算法和Kruskal算法。 我在各在论坛看了很多相关帖子&#xff0c;发现一个简单的问题都被复杂化了。最小生成树、Prim算法和Kruskal算法真的没有大家想的…

shopee虾皮跨境电商网站商品数据支持网站后缀(.com.my;.vn;.ph)

作为一名技术爱好者&#xff0c;我们总会遇到各种各样的技术问题&#xff0c;需要寻找合适的技术解决方案。而在互联网时代&#xff0c;我们可以快速通过搜索引擎获取丰富的技术资源和解决方案。然而&#xff0c;在不同的技术分享中&#xff0c;我们常常会遇到质量参差不齐的文…

开始第一个vue项目,环境搭建+html项目运行

【用vue.js&#xff0c;通过script标签导入】 1. 搭建vue脚手架 安装node js安装cnpm&#xff08;淘宝源&#xff09; 【vue】在windows中搭建vue开发环境&#xff08;全网最详细&#xff09;_vue环境搭建_一起来学吧的博客-CSDN博客2a 2. 官网下载地址&#xff1a; 安装 …

[山海关crypto 训练营 day20]

[HNCTF 2022 WEEK2]solve_the_equation 题目代码和相关数据 from Crypto.Util.number import bytes_to_long, getPrime from gmpy2 import * from flag import flag m bytes_to_long(flag) p getPrime(2048) q getPrime(2048) n p * q e 65537 gift 2022 * p 9 * q 2…

《信息技术时代》期刊简介及投稿要求

《信息技术时代》&#xff08;半月刊&#xff09;本刊是由国家新闻总署批准&#xff0c;深圳湾科技发展有限公司主管主办的信息类期刊&#xff0c;国内统一刊号CN&#xff1a;44-1536/TN&#xff0c;国际标准刊号ISSN&#xff1a;1671-153x。本刊旨在为全集团的信息工作者提供交…