进程控制——进程的程序替换

news2024/12/22 18:17:00

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析(3)

在这里插入图片描述


目录

  • 👉🏻进程的程序替换概念
  • 👉🏻六个替换函数
  • 👉🏻单进程版的程序替换的代码(没有子进程)--见见程序替换
  • 👉🏻程序替换我们自己写的程序
  • 👉🏻程序替换Shell脚本
    • shell脚本概念
    • 程序替换

👉🏻进程的程序替换概念

之前我们所创建的所有的子进程,执行的代码,都是父进程代码的一部分,如果我们想让子进程执行新的程序,不再和父进程有瓜葛了。这时我们就引入—— 程序替换 程序替换 程序替换
🌞概念
在Linux中,进程控制的程序替换是指一个进程用另一个新程序来替换自己的执行映像。这个新程序完全取代了原来的程序,包括代码、数据和堆栈等信息,成为了新的运行中的进程。这种程序替换的操作通常是通过调用exec函数来完成的。

程序替换常用于创建新的进程或者更新正在运行的进程的执行映像。例如,在一个Shell中,当你输入一个命令时,Shell就会创建一个新的进程来执行相应的程序。在这种情况下,Shell就会调用fork创建一个新的子进程,然后在子进程中调用exec来加载并执行新的程序。

程序替换的一个重要特点是原有的进程ID(PID)不会改变,这意味着虽然进程的执行映像已经被替换,但是它仍然保持着原来的PID。这样做的好处是可以保持一些与PID相关的状态,比如父子进程关系、进程的权限等。

总之,Linux中进程控制的程序替换是通过exec函数来实现的,它允许一个进程用另一个程序来替换自己的执行映像,从而创建新的进程或者更新正在运行的进程的执行映像。

👉🏻六个替换函数

在Linux中,有多个替换函数可用于执行其他程序。下面是对这些函数的介绍:

  1. execl:该函数用于在当前进程中执行一个可执行文件。它接受可执行文件的路径和一系列的参数作为参数,并将当前进程替换为新的可执行文件。这个函数的原型如下:
    #include <unistd.h>
    int execl(const char *path, const char *arg, ...);
    
    这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。

在这里插入图片描述

  1. execlp:与execl类似,但是它可以在系统的PATH环境变量指定的路径中搜索可执行文件。这个函数的原型如下:

    #include <unistd.h>
    int execlp(const char *file, const char *arg, ...);
    

    同样地,这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。
    在这里插入图片描述

  2. execle:这个函数与execl类似,但是它还接受一个额外的参数envp,用于指定新程序的环境变量。这个函数的原型如下:

    #include <unistd.h>
    int execle(const char *path, const char *arg, ..., char * const envp[]);
    

    同样地,这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。

  3. execv:与execl类似,但是它接受一个参数数组来传递可执行文件的路径和参数。这个函数的原型如下:

    #include <unistd.h>
    int execv(const char *path, char *const argv[]);
    

    同样地,这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。

在这里插入图片描述

  1. execvp:与execv类似,但是它可以在系统的PATH环境变量指定的路径中搜索可执行文件。这个函数的原型如下:
    #include <unistd.h>
    int execvp(const char *file, char *const argv[]);
    
    同样地,这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。

在这里插入图片描述

  1. execve:与execv类似,但是它还接受一个额外的参数envp,用于指定新程序的环境变量。这个函数的原型如下:
    #include <unistd.h>
    int execve(const char *path, char *const argv[], char *const envp[]);
    
    同样地,这个函数在执行成功后不会返回,如果调用失败,则会设置errno并返回-1[1]。

这些以exec开头的函数,统称exec函数

  • 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
  • 如果调用出错则返回-1
  • 所以exec函数只有出错的返回值而没有成功的返回值

这些替换函数可以在创建新进程后,用于在新进程中执行另一个程序。当调用这些函数时,当前进程会被完全替换为新程序。这些函数的区别在于参数的传递方式和对环境变量的处理方式。通过这些函数,我们可以方便地在Linux中执行其他程序并传递参数[1]。

exe函数的本质就是加载器,将磁盘中的程序加载到内存中!

👉🏻单进程版的程序替换的代码(没有子进程)–见见程序替换

代码:

#include<stdio.h>
#include<unistd.h>
int main()
{
	printf("pid:%d,exe command begin\n", getpid());
	execl("/usr/bin/pwd", "pwd", NULL);
	printf("pid:%d,exe command end\n", getpid());

	return 0;
}

result:
在这里插入图片描述
原理解释:
在这里插入图片描述
在这里插入图片描述

👉🏻程序替换我们自己写的程序

首先在Makefile文件中使得make能一次性创建两个可执行程序
在这里插入图片描述
创建mytest.cc:
在这里插入图片描述
myprocess.c:
在这里插入图片描述
the result:
在这里插入图片描述

👉🏻程序替换Shell脚本

shell脚本概念

当谈论Linux的Shell脚本文件时,我们实际上指的是一种文本文件,其中包含了一系列的Shell命令,这些命令按照特定的顺序被解释器(比如bash、sh等)逐行执行,就像在命令行中一行行输入命令一样。

下面是一个简单的Shell脚本例子,它将会创建一个包含当前日期和时间的文件,并显示一条消息:

#!/usr/bin/bash
# 这是一个简单的Shell脚本

# 显示一条消息
echo "hello shell"

让我们来解释一下这个例子:

  • #!/usr/bin/bash:这是脚本文件的第一行,称为shebang,用来告诉系统使用哪个解释器来执行脚本。在这个例子中,#!/usr/bin/bash告诉系统使用Bash来解释执行脚本。

  • #开头的行是注释,用来对脚本进行说明,不会被解释器执行。

  • echo "hello shell":这一行使用echo命令在终端上显示一条消息。

要注意的是,为了使一个Shell脚本文件可以被执行,你需要先将其设置为可执行文件。你可以使用chmod +x script.sh命令来赋予这个Shell脚本文件执行权限。

总的来说,Linux的Shell脚本文件是一种包含了一系列Shell命令的文本文件,它可以用来自动化执行一系列任务,非常适合用于批处理、系统管理和自动化部署等场景。

程序替换

script.sh:

在这里插入图片描述
myprocess.c
在这里插入图片描述
the result:
在这里插入图片描述


如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

R语言和jsonlite库编写代码示例

R语言和jsonlite库来下载的程序。 r # 导入jsonlite库 library(jsonlite) # 设置代理主机和端口 proxy_host <- "" proxy_port <- # 使用httr库创建一个对象 proxy <- create_proxy(proxy_host, proxy_port) # 使用httr库的GET方法下载网页内容 url <…

输入网址到网页显示,期间发生了什么?(收藏篇)

解析url 首先浏览器做的第一步工作就是要对 URL 进行解析&#xff0c;从而生成发送给 Web 服务器的请求信息。对 URL 进行解析之后&#xff0c;浏览器确定了 Web 服务器和文件名&#xff0c;接下来就是根据这些信息来生成 HTTP 请求消息了。 DNS解析 通过浏览器解析 URL 并…

学生用什么台灯对眼睛最好?双十一优质好用护眼台灯推荐

护眼台灯作为时下火爆的学生清单单品&#xff0c;深受众多学生以及家长的认可&#xff0c;市面上的护眼台灯品牌众多&#xff0c;但很多品牌存在不合格、劣质、虚假宣传的问题&#xff0c;为了帮大家避坑&#xff0c;我这个资深测评师反复测评了三十多款&#xff0c;今天给大家…

【Linux】进程程序替换

文章目录 替换原理站在进程的角度站在程序的角度初体验及理解原理 替换函数函数解释命名理解exec系列函数与main函数之间的关系在一个程序中调用我们自己写的程序 替换原理 创建子进程的目的是什么&#xff1f; ->想让子进程执行父进程代码的一部分 执行父进程对应的磁盘代码…

ROS源码安装应用,VSCode

ROS源码安装应用 安装一下VSCode 前置文章 到安装程序的目录中: 完成克隆 编译 catkin_make打开ros核心 roscore打开应用程序 rosrun turtlesim turtlesim_node安装一下VSCode deb下载地址 sudo dpkg -i code_1.84.1-1699275408_amd64.deb添加项目工程到工作空间&#xff…

什么是伺服电机?Parker派克伺服电机盘点

一、什么是伺服电机&#xff1f; 要准确地定义伺服电机&#xff0c;我们首先需理解其核心特性&#xff1a;反馈与闭环控制。伺服电机凭借这些特性&#xff0c;能精确控制扭矩、速度或位置&#xff0c;即使在零速度下&#xff0c;也能保持足够的扭矩以锁定负载。 伺服电机与其…

JVS-智能BI数据集管理:打造高效、准确数据应用基础

现今的数字化、智能化时代&#xff0c;数据被誉为企业的新型资产&#xff0c;企业面临的数据量日益庞大&#xff0c;如何对这些数据进行高效、准确的管理和应用&#xff0c;直接决定了企业的运营效率和决策水平。 在这样的背景下&#xff0c;仅仅收集数据并不足够&#xff0c;…

IDEA 关闭SpringBoot启动Logo/图标

一、环境 1、SpringBoot 2.6.4 Maven POM格式 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/></parent> 2、IDE…

第五章《数据降维:深入理解 PCA 的来龙去脉》笔记

主成分分析(Principal Component Analysis&#xff0c;PCA) 就是机器学习中一种常用且有效的数据降维方法。 5.1 PCA是什么 PCA 将相关性高的变量转变为较少的独立新变量&#xff0c;实现用较少的综合指标分别代表存在于 各个变量中的各类信息&#xff0c;既减少高维数据的变…

vue3 自动导入composition-apiI和组件

1.api的自动导入 常规写法&#xff1a; <script setup>import { ref, reactive, onMounted, computed ,watch } from vue;import { useRouter } from "vue-router";const router useRouter();const person reactive ({name&#xff1a;张三&#xff0c;age…

cadence virtuoso layout drc error

For 0.11um design, 2.5/3.3V transistor channel (overlap of Poly and AA) enclosure by DG.( Designer can waive this rule for 0.13um design).>0.30 对于 0.11 微米的设计&#xff0c;2.5/3.3V 晶体管通道&#xff08;Poly 和 AA 的重叠部分&#xff09;由 DG 封装&a…

“三大阶段稳定性测试”筑牢长安链信任基石

前言 随着长安链应用生态的不断丰富、面对的应用场景更加多元&#xff0c;稳定性测试在长安链测试流程中占到越来越重要的位置。本文将介绍长安链稳定性测试的发展历程及如何通过三大阶段稳定性测试应对不断出现的复杂的商业需求&#xff0c;筑牢长安链信任基石。 功能测试和…

Adobe Photoshop 2020给证件照换底

1.导入图片 2.用魔法棒点击图片 3.点选择&#xff0c;反选 4.选择&#xff0c;选择并遮住 5.用画笔修饰证件照边缘 6. 7.更换要换的底的颜色 8.新建图层 9.使用快捷键altdelete键填充颜色。 10.移动图层&#xff0c;完成换底。

汇编与反汇编

程序处理的4个步骤 我们的第一个LED程序涉及两个文件&#xff1a;start.S、main.c&#xff0c;它们的处理过程如下&#xff1a; 对于汇编程序&#xff0c;经过汇编之后&#xff0c;转换成目标文件&#xff08;里面包含机器码&#xff09;。对于C程序&#xff0c;经过预处理之…

开源微信万能表单源码系统+自由创建多表单+自定义各行业表单 全开源可二开 带完整的搭建教程

微信作为一个庞大的社交平台&#xff0c;为企业和个人提供了丰富的应用场景。其中&#xff0c;微信公众平台可以为企业提供自定义表单的功能&#xff0c;以满足各种业务需求。然而&#xff0c;在实际应用中&#xff0c;很多企业需要更强大、更灵活的表单系统来处理复杂的业务逻…

C++跨DLL内存所有权问题探幽(一)DLL提供的全局单例模式

最近在开发的时候&#xff0c;特别是遇到关于跨DLL申请对象、指针、内存等问题的时候遇到了这么一个问题。 问题 跨DLL能不能调用到DLL中提供的单例&#xff1f; 问题比较简单&#xff0c;就是我现在有一个进程A&#xff0c;有DLL B DLL C&#xff0c;这两个DLL都依赖DLL D的…

婴儿专用洗衣机哪个牌子比较好?好用的迷你洗衣机测评

为人父母&#xff0c;是一件非常美妙的事情&#xff0c;在养育新生命的过程中&#xff0c;细心的照顾是非常重要的&#xff0c;而最小的细节&#xff0c;就是让婴儿的衣服保持最温和、最有效的清洁。而婴儿洗衣机是当今不少家庭的福音&#xff0c;它给家长们带来了巨大的方便&a…

Java 并发编程面试题——重入锁 ReentrantLock

目录 1.ReentrantLock 是什么&#xff1f;2.✨什么是重入锁&#xff1f;ReentrantLock 是如何实现可重入特征的&#xff1f;3.公平锁和非公平锁有什么区别&#xff1f;ReentrantLock 分别是如何实现的&#xff1f;4.✨ReentrantLock 的实现原理是什么&#xff1f;5.为什么 Reen…

一文了解Nginx及其基本配置

一、关于Nginx Nginx是一个开源的高性能HTTP和反向代理服务器。 Nginx可以用于处理静态资源、负载均衡、反向代理和缓存等任务。 Nginx被广泛用于构建高可用性、高性能的Web应用程序和网站。 Nginx具有低内存消耗、高并发能力和良好的稳定性&#xff0c;因此在互联网领域非常受…

易点易动固定资产管理系统:实现全生命周期闭环式管理和快速盘点

固定资产管理对于企业来说至关重要&#xff0c;它涉及到资产的采购、领用、使用、维护和报废等各个环节。然而&#xff0c;传统的固定资产管理方式往往繁琐、耗时&#xff0c;容易导致信息不准确和资源浪费。为了解决这些问题&#xff0c;我们引入易点易动固定资产管理系统&…