【lesson16】进程控制之进程替换(1)

2023-12-16 16:04
文章标签 进程 控制 替换 lesson16

本文主要是介绍【lesson16】进程控制之进程替换(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 进程替换是什么?
  • 进程替换怎么用?
    • 不创建子进程时使用

进程替换是什么?

我们知道fork()之后,父子进程各自执行父进程的一部分代码,如果子进程就想执行一个全新的程序呢?

以前:父子代码共享,数据写时拷贝各自一份

如果子进程想要有自己的代码呢?
我们可以用进程的程序替换来完成以上功能。

程序替换:是通过特定的接口,找到磁盘上的一个权限程序(代码+数据),把它加载到调用进程的物理内存中。
原理:
在这里插入图片描述
所以想进行程序替换我们只要将新的磁盘上的程序加载到内存,并和当前的进程页表重新建立映射关系即可

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。
在这里插入图片描述
所以进程替换没有创建新的进程,因为OS并没有为该程序创建新的task_struct,用的全部都是之前程序的task_struct。

进程替换怎么用?

不创建子进程时使用

函数介绍:
在这里插入图片描述
可变参数列表:可以传入不定个数个参数。

我们在命令行上怎么执行的在这里就一个一个怎么填。
例如:ls -a -l 就直接填入"ls",‘’-a’',“-l”。
代码演示:
首先要知道ls的路径
在这里插入图片描述

#include <stdio.h>      
#include <unistd.h>      int main()                                   
{                                            printf("当前进程的开始代码\n");            execl("/usr/bin/ls","ls",NULL);    printf("当前进程的结束代码\n");    return 0;                          
} 

运行结果对比
在这里插入图片描述

我们看到确实可以查出来
再多传几个查看一下

#include <stdio.h>      
#include <unistd.h>      int main()      
{      printf("当前进程的开始代码\n");      //execl("/usr/bin/ls","ls",NULL);      execl("/usr/bin/ls","ls","-a","-l",NULL);    printf("当前进程的结束代码\n");      return 0;              
}

运行结果:
在这里插入图片描述
系统自身运行结果:
在这里插入图片描述

这里大家肯会有个一行为什么最后要传一个NULL因为execl函数是可变参数列表,所以我们要传一个NULL来告知它参数已经传递完毕。

这里大家肯会有疑惑为什么系统使用ls时查出来的信息是带颜色的,而自己查出来时并没有。
其实是系统起了别名:
在这里插入图片描述我们知道多传递一个==–color=auto==参数列表即可

#include <stdio.h>    
#include <unistd.h>    int main()    
{    printf("当前进程的开始代码\n");    //execl("/usr/bin/ls","ls",NULL);    execl("/usr/bin/ls","ls","-a","-l","--color=auto",NULL);                                                                                                              printf("当前进程的结束代码\n");    return 0;    
}

在这里插入图片描述

这里我就有一个问题了,我们代码后面不是有printf吗?为什么没有打印呢?
在这里插入图片描述
因为execl是程序替换,调用该函数成之后,会将当前进程的所有代码和数据都进行替换,包括已经执行的代码和未执行的代码。
所以一旦调用成功execl,后续所有代码,全部不会执行!
测试一下如果调用失败,我们后续代码会执行吗?
我们传入一个根本不存在的执行试一下

#include <stdio.h>    
#include <unistd.h>    int main()    
{    printf("当前进程的开始代码\n");    //execl("/usr/bin/ls","ls",NULL);    execl("/usr/bin/lss","lss","-a","-l","--color=auto",NULL);    printf("当前进程的结束代码\n");    return 0;                                                                                                                                                             
}   

在这里插入图片描述
我们这里看到execl函数调用失败之后,确实后续代码成功的输出,并没有被替换。

**execl为什么调用成功了,为什么不用它的返回值呢?**因为根本就不需要,返回值毫无用处,execl调用成功是会把自己都替换掉。

#include <stdio.h>      
#include <unistd.h>                                                           
#include <stdlib.h>      int main()    
{    printf("当前进程的开始代码\n");    //execl("/usr/bin/ls","ls",NULL);    execl("/usr/bin/ls","ls","-a","-l","--color=auto",NULL);                                                                                                              exit(1);                                               printf("当前进程的结束代码\n");                        return 0;                                              
}

在这里插入图片描述
我们可以看到这里的退出码是0,而不是1.

这篇关于【lesson16】进程控制之进程替换(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/501063

相关文章

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

Python实现局域网远程控制电脑

《Python实现局域网远程控制电脑》这篇文章主要为大家详细介绍了如何利用Python编写一个工具,可以实现远程控制局域网电脑关机,重启,注销等功能,感兴趣的小伙伴可以参考一下... 目录1.简介2. 运行效果3. 1.0版本相关源码服务端server.py客户端client.py4. 2.0版本相关源码1

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与