当前位置: 首页 > news >正文

【1++的Linux】之进程(五)

👍作者主页:进击的1++
🤩 专栏链接:【1++的Linux】

文章目录

  • 一,什么是进程替换
  • 二,替换函数
  • 三,实现我们自己的shell

一,什么是进程替换

我们创建出来进程是要其做事情的,它可以去调用函数,或者是执行其他的程序,子进程通过exec函数族执行其他的程序就叫做进程替换。也就是在调用进程内部执行一个可执行文件。当进程调用一种exec函数时,该进程的代码和数据完全被新程序替换,新程序从main函数开始执行,由于未创建新进程,所以替换前后进程的id等并不改变。
在加载新程序之前,父子进程的关系是:代码共享,数据写时拷贝。
当子进程加载新程序的时候就是一种“写入”,此时代码也就需要进行写时拷贝,进行分离!!!

二,替换函数

下面是六种exec开头的函数,统称exec函数。

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 execve(const char *path, char *const argv[], char *const envp[]);


其中只有execve()是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。
这些函数,如果调用成功则加载新的程序开始执行,不再返回;若调用失败,则返回-1 。
下面是这些函数的演示:

#include<stdio.h>
#include<unistd.h>
int main()
{//execl---带路径,参数包传参//execl("/usr/bin/ps","ps","-ef",NULL);// execlp("ls","-l",NULL);char* env[]={"PATH=/bin:/usr/bin",NULL};char* argv[]={"ls","-l",NULL};// execv("/usr/bin/ls",argv);// execle("./mike","mike",NULL,env);// execvp("ls",argv);execve("/usr/bin/ls",argv,env);return 0;
}

execl运行结果(要写路径,参数格式未列表)
在这里插入图片描述
execlp运行结果(带p的:可以使用环境变量PATH,无需写路径)
在这里插入图片描述
execle运行结果:

在这里插入图片描述
execv运行结果:
在这里插入图片描述
execvp运行结果:

在这里插入图片描述
execve运行结果:

在这里插入图片描述
我们总结以下:

带p可以使用环境变量PATH,无需写完整路径
带e,自己组装环境变量。// 改变替换程序的环境变量,正确来说,让替换程序只保留 env 的环境变量
带l参数格式为列表
带v参数格式为数组

事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在man手册第3节。
在这里插入图片描述

exec*实际上就是一个加载器的底层接口。

三,实现我们自己的shell

代码如下:

#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<stdlib.h>
#include<string.h>
#define NUM 32
char cmd_line[NUM];
char* _argv[32];
char myval[32];//这个buffer用来保存我们添加的环境变量,不然保存在cmd_line中会被覆盖。
int main()
{extern char** environ;//是一个外部的全局变量,储存着系统的全局变量。while(1){//打印提示信息printf("[hyp @myshell]#");fflush(stdout);memset(cmd_line,'\0',sizeof(cmd_line));//用户输入if(fgets(cmd_line,sizeof(cmd_line),stdin)==NULL){continue;}cmd_line[strlen(cmd_line)-1]='\0';//分割字符_argv[0]=strtok(cmd_line," ");int i=0;if(strcmp(_argv[0],"ls")==0)//加颜色{_argv[++i]="--color=auto";}if(strcmp(_argv[0],"ll")==0){_argv[0]="ls";_argv[++i]="--color=auto";_argv[++i]="-l";}while(_argv[i])//分割{i++;_argv[i]=strtok(NULL," ");}if(strcmp(_argv[0],"export")==0 && _argv[1]!=NULL){strcpy(myval,_argv[1]);int ret=putenv(myval);if(ret==0){printf("%s export success\n",myval);}continue;}if(strcmp(_argv[0],"cd")==0){if(_argv[1]!=NULL){//内置命令,让父进程自己执行的命令,本质就是shell的一个函数调用。chdir(_argv[1]);//改变当前工作目录}continue;}int id=fork();if(id==0)//child{printf("child MYVAL:%s\n",getenv("MYVAL"));printf("PATH:%s\n",getenv("PATH"));execvp(_argv[0],_argv);exit(1);}//fatherint status=0;int ret=waitpid(id,&status,0);if(ret>0){printf("退出码:%d\n",WEXITSTATUS(status));}}return 0;
}

相关文章:

【1++的Linux】之进程(五)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;什么是进程替换二&#xff0c;替换函数三&#xff0c;实现我们自己的shell 一&#xff0c;什么是进程替换 我们创建出来进程是要其做事情的&#xff0c;它可…...

用url类来访问服务器上的文件

场景一&#xff1a; package com.guonian.miaosha;import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;…...

【重拾C语言】六、批量数据组织(二)线性表——分类与检索(主元排序、冒泡排序、插入排序、顺序检索、对半检索)

目录 前言 六、批量数据组织——数组 6.1~3 数组基础知识 6.4 线性表——分类与检索 6.4.1 主元排序 6.4.2 冒泡排序 6.4.3 插入排序 6.4.4 顺序检索&#xff08;线性搜索&#xff09; 6.4.5 对半检索&#xff08;二分查找&#xff09; 算法比较 前言 线性表是一种常…...

24 Python的sqlite3模块

概述 在上一节&#xff0c;我们介绍了Python的shutil模块&#xff0c;包括&#xff1a;shutil模块中一些常用的函数。在这一节&#xff0c;我们将介绍Python的sqlite3模块。sqlite3模块是Python中的内置模块&#xff0c;用于与SQLite数据库交互。SQLite是一个轻量级的磁盘数据库…...

ARM-流水灯

.text .global _start _start: 1、设置GPIOE寄存器的时钟使能 RCC_MP_AHB$ENSETR[4]->1 0x50000a28LDR R0,0X50000A28 LDR R1,[R0] 从R0起始地址的4字节数据取出放在R1 ORR R1,R1,#(0X3<<4) 第4位设置为1 STR R1,[R0] 写回2、设置PE10、PE8、PF10管脚为输出模式 …...

【虚拟机】NAT 模式下访问外网

目录 一、NAT 模式的作用原理 二、配置 NAT 模式实现外网访问 1、配置NAT模式的网段 2、虚拟机选择 VMnet8 网卡 3、IP地址设为自动分配 一、NAT 模式的作用原理 NAT模式下&#xff0c;虚拟机的系统会把宿主机当作一个大路由器&#xff0c;发送的网络请求和数据都是先发给…...

React 入门笔记

前言 国庆值班把假期拆了个稀碎, 正好不用去看人潮人海, 趁机会赶个晚集入门一下都火这么久的 React 前端技术. 话说其实 n 年前也了解过一丢丢来着, 当时看到一上来就用 JS 写 DOM 的套路直接就给吓退了, 扭头还去看 Vue 了&#x1f923;, 现在从市场份额 社区活度来看, 确实…...

Ubuntu MySQL

在安装前&#xff0c;首先看你之前是否安装过&#xff0c;如果安装过&#xff0c;但是没成功&#xff0c;就要先卸载。 一、卸载 1.查看安装 dpkg --list | grep mysql 有东西&#xff0c;就说明您之前安装过mysql。 2.卸载 先停掉server sudo systemctl stop mysql.servic…...

大数据软件系统开发框架

大数据处理框架是用于处理大规模数据集的软件工具和平台&#xff0c;它们可以帮助分析、存储和处理庞大的数据量。以下是一些常见的大数据处理框架&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.A…...

rust变量

一 、变量定义 &#xff08;一&#xff09;语法格式 使用let关键字定义变量 let varname: type value; 如&#xff0c;let a: i32 78;也可以不显式指定类型 let varname value; 如&#xff0c;let a 78;一些例子 1.布尔 let t true; let f: bool false;2.整数 let a …...

蓝桥杯---第一讲 递归与递推

文章目录 前言Ⅰ. 递归实现指数型枚举0x00 算法思路0x00 代码书写0x00 思考总结 Ⅱ. 递归实现排列型枚举0x00 算法思路0x01代码书写0x02 思考总结 Ⅲ. 简单斐波那契0x00 算法思路0x01 代码书写 Ⅳ. 费解的开关0x00 算法思路0x01 代码书写 Ⅴ. 递归实现组合型枚举0x00 算法思路0…...

OpenCV 15(SIFT/SURF算法)

一、SIFT Harris和Shi-Tomasi角点检测算法&#xff0c;这两种算法具有旋转不变性&#xff0c;但不具有尺度不变性&#xff0c;以下图为例&#xff0c;在左侧小图中可以检测到角点&#xff0c;但是图像被放大后&#xff0c;在使用同样的窗口&#xff0c;就检测不到角点了。 尺度…...

前端二维码图片解析图片识别/网络图片解析成链接/图片网络链接转本地链接(Js/Vue/Jquery)

注&#xff1a;需要用到canvas/jsqr/jquery&#xff01; 1、远程图片链接本地化 页面&#xff1a; <!-- 识别二维码用的 canvas--> <canvas class"canvas" ref"canvas" style"display: none"></canvas> 1.创建图片 get2: fu…...

模板中的依赖类型使用 --- typename

依赖类型&#xff0c;顾名思义就是依赖于模板参数的类型&#xff0c;在使用这种类型时&#xff0c;必须使用 typename&#xff0c;否则编译器是无法知道是在使用类型&#xff0c;还是类的成员&#xff08;因为类的静态成员的使用方法也是T::xxx&#xff0c;这跟某个类中的类型的…...

git 同时配置 gitee github

git 同时配置 gitee github 1、 删除C:\Users\dell\.ssh目录。 在任意目录右击——》Git Bash Here&#xff0c;打开Git Bash窗口&#xff0c;下方命令在Git Bash窗口输入。 2、添加git全局范围的用户名和邮箱 git config --global user.email "609612189qq.com" …...

2023.10.8 面试

面试工作1年的程序员 看到生涩才入职场不久的面试者&#xff0c;为人也相对诚恳的模样&#xff0c;我对此是很欣赏的态度。 因为完全看到了自己毕业1年时的场景。 简历上写的事情&#xff0c;讨论起来&#xff0c;描述不清楚&#xff0c;为此感到遗憾&#xff0c;因我本人也会…...

【前端】js实现队列功能 先进后出 先进先出 等

也可以定义一个定时器 不断的去取队列 执行任务 用一个flag定义队列正在执行中, 如果没有执行 则定时器不断的去调用队列,(因为会随时添加一个任务到队列中) 队列任务结束后 自动取下一个队列 也可以边加队列 边取 队列定义 function Queue() {//初始化队列&#xff08;使用…...

07.数据持久化之文件操作

1. 文件操作 计算机的文件&#xff0c;就是存储在某种 长期储存设备 上的一段 数据 长期存储设备包括&#xff1a;硬盘、U 盘、移动硬盘、光盘… 文本文件和二进制文件 文本文件 可以使用 文本编辑软件 查看本质上还是二进制文件例如&#xff1a;python 的源程序 二进制文件…...

nginx开启https配置之后网页无法访问问题处理

背景说明 最近新购服务器部署nginx之后按照之前的方式部署前端项目并配置https之后访问页面显示:无法访问.新的服务器ECS系统和之前相同,nginx安装方式也相同,nginx配置方式也是相同.但是访问还是显示无法访问.下面简单记录一下问题处理过程. 处理过程 1.https访问之后无法访问…...

文本嵌入层

目录 1、文本嵌入层的作用 2、代码演示 3、构建Embeddings类来实现文本嵌入层 1、文本嵌入层的作用 无论是源文本嵌入层还是目标文本嵌入&#xff0c;都是为了将文本词汇中的数字表示转变为向量表示&#xff0c;希望在这样的高维空间中捕捉词汇之间的关系 2、代码演示 Emb…...

74HC595驱动8位数码管实战:从查找表到动态扫描的完整流程

74HC595驱动8位数码管实战&#xff1a;从查找表到动态扫描的完整流程 在嵌入式系统开发中&#xff0c;数码管显示是最基础也最考验硬件理解能力的环节之一。记得我第一次尝试用74HC595驱动数码管时&#xff0c;被那个"看似简单却暗藏玄机"的动态扫描原理折磨了整整三…...

VisionPro相机控制进阶:用C#实现拍照、实时流与图像保存的完整工作流

VisionPro相机控制进阶&#xff1a;用C#构建工业级图像采集工作流 在工业自动化领域&#xff0c;稳定可靠的图像采集系统是质量检测、尺寸测量和缺陷识别的基础。VisionPro作为工业视觉领域的标杆工具&#xff0c;配合C#强大的开发能力&#xff0c;可以构建出高性能的相机控制…...

10个Pixelfed实例运营成功案例:去中心化照片分享平台实战经验 [特殊字符]

10个Pixelfed实例运营成功案例&#xff1a;去中心化照片分享平台实战经验 &#x1f680; 【免费下载链接】pixelfed Photo Sharing. For Everyone. 项目地址: https://gitcode.com/GitHub_Trending/pi/pixelfed Pixelfed是一个开源的去中心化照片分享平台&#xff0c;基…...

Keil多工程工作空间创建与管理实践

Keil系列教程14&#xff1a;创建多工程工作空间的技术实践1. 项目概述在嵌入式开发中&#xff0c;当项目复杂度增加时&#xff0c;往往需要管理多个相互关联的工程。Keil MDK-ARM开发环境提供了多工程工作空间&#xff08;Multi-Project Workspace&#xff09;功能&#xff0c;…...

如何通过DeepWiki实现本地部署的智能文档生成与数据安全保障?

如何通过DeepWiki实现本地部署的智能文档生成与数据安全保障&#xff1f; 【免费下载链接】deepwiki-open Open Source DeepWiki: AI-Powered Wiki Generator for GitHub Repositories 项目地址: https://gitcode.com/gh_mirrors/de/deepwiki-open 在数字化开发的浪潮中…...

【数字电路基础】三态门在芯片设计中的关键作用与限制

1. 三态门&#xff1a;数字电路中的交通警察 第一次听说三态门时&#xff0c;我脑海里浮现的是十字路口的红绿灯。这个看似简单的数字电路元件&#xff0c;实际上在芯片设计中扮演着至关重要的角色。三态门之所以特殊&#xff0c;是因为它比普通逻辑门多了一个"隐身"…...

ER-Save-Editor:艾尔登法环存档修改工具全解析

ER-Save-Editor&#xff1a;艾尔登法环存档修改工具全解析 【免费下载链接】ER-Save-Editor Elden Ring Save Editor. Compatible with PC and Playstation saves. 项目地址: https://gitcode.com/GitHub_Trending/er/ER-Save-Editor ER-Save-Editor是一款开源的艾尔登法…...

STM32F103重映射实战:GPIO_Remap1_CAN1与GPIO_Remap2_CAN1到底选哪个?

STM32F103重映射实战&#xff1a;GPIO_Remap1_CAN1与GPIO_Remap2_CAN1到底选哪个&#xff1f; 第一次在STM32F103上配置CAN总线时&#xff0c;看到GPIO_Remap1_CAN1和GPIO_Remap2_CAN1这两个选项&#xff0c;我完全懵了——它们有什么区别&#xff1f;为什么需要两个重映射选项…...

如何在1小时内掌握TinySAM:从零开始构建高效图像分割模型

如何在1小时内掌握TinySAM&#xff1a;从零开始构建高效图像分割模型 【免费下载链接】TinySAM 项目地址: https://gitcode.com/gh_mirrors/ti/TinySAM 想象一下&#xff0c;你需要在移动设备上实时分割图像中的任意物体&#xff0c;但传统模型动辄几百兆&#xff0c;运…...

完整构建流程:从CMake配置到PyPI分发的nanobind项目部署

完整构建流程&#xff1a;从CMake配置到PyPI分发的nanobind项目部署 【免费下载链接】nanobind nanobind: tiny and efficient C/Python bindings 项目地址: https://gitcode.com/gh_mirrors/na/nanobind nanobind是一个用于创建C/Python绑定的轻量级高效工具&#xff0…...