进程控制(Linux)下

简介: 进程控制(Linux)

进程程序替换


替换原理


通过fork创建子进程之后是为了执行程序,子进程往往需要调用一种exec函数用来执行另外一个程序,也就是与父进程不同的程序;当进程调用一种exec函数时,创建的子进程就会将指定的程序加载到内存中,并执行;调用exec并不创建新进程,所以调用exec前后该进程的id并没有变化


程序替换的本质:将指定程序的代码和数据加载到指定位置,并不、覆盖父进程的数据和代码


cf9d45caad797180e04d42874c6f59da_81da658bbd584178aedd25ccdd30637a.png


替换函数


以exec开头的函数有六种,统称exec函数


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


l:list,将参数一个个低传入 execl中


首先执行程序,先要找到该程序,然后再执行包括如何执行

path表示该程序所在路径;arg表示如何执行该程序,类似与命令行参数;...表示可变参数列表,最后一个参数必须是NULL


77793ad4de7c99d4614146de404e3110_53ad0033a4984182bd0518b8f8f00877.png

96277b1a2a286652ed192e0179af2e17_a53c4b82b0bf4ade9b3d735baa9e1392.png


运行结果中,只打印了第一个 printf,第二个并没有打印,为什么呢?

因为 printf也是代码,并且第二个是在替换函数 execl之后的,当替换函数执行完毕后,原代码已经全部被覆盖,开始并执行新的程序代码,所以第二个 printf无法执行


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


p:path,可以自动找到程序所在路径,只需要输入待执行的程序即可


e65a43772cda6b09270741386d66d16b_8fe5cf32d1c14327a1b731f9123ba832.png

92d9a40bffbeb38825cb05212399f568_a59c18bb0bdd44179545f7af14f5eeeb.png


第一个ls代表要执行的程序;第二个ls代表如何执行


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


v:vector,可以将所有可执行参数放入数组中,统一传递,代替使用可变参数


8ba0af31993864997a20b6e52347e4b8_1c6f78d73d3e4b3dab6b739b0a51aba7.png

00f31392677a3d2520f62915b0d2887e_166469e482ee426f84bacc683aa1ed71.png


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


直接输入待执行的程序,以及如何执行


daaa1636b9f32e98dae317ef4bad89e6_84b85df63d9349f2ace033eee24c5424.png

0d4557b5ba2bc8dd4de8cb79d4066e0e_9e7e65900b0249b98c19b10ab573f198.png


到目前为止,一直执行的是系统命令,下面尝试执行自己所写的程序


3f71abdafe2c3cd9bbb08012f0a865a8_778f9adc4cbd434d968d1a868971bfa6.png


自己所写的程序:


2e8bb84bc1d6b2f07c4f60a7c5a358c3_543140d6b4494608ab27dc796107e087.png


运行结果:


d70bedd037043d9d58b768018a7d993d_e60ba3f770af47ff8d392db9115aba5a.png


根据运行结果来看,调用非常地成功;所以可以使用替换函数调用任何语言地程序


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


e:自定义环境变量


先试试将不加入自定义环境变量


83898b9de495bd07139b6a93be4d5ac9_42814c40d4be43df93bd0aca50f2e147.png

120e0a018309c2698a86531e593c60d1_bb099480acfd4620bf567c5e3e634325.png

0694dbdff07f9cdde74f18b02703606c_d8166b4b87a6484ca5db980a64d26b01.png


上面便是简单地获取两个系统内的环境变量的方式;接下来如果想要自定义环境变量该如何操作呢???


先介绍一个函数:putenv

260694c57dee5dd7955fadd86db8de12_9d499f2e7028445d9e74d305f4dabb25.png

添加一个环境变量到系统中environ所指向的环境变量表中

自定义环境变量操作如下:


03047fd25db9258e618e3fdfc4ce740d_e10c2a83009c4239a1074d5a049b70ef.png

139c5d97fb11138300c09a258db74e80_deed2c166e724b7483fddfab00f07d0f.png

d61bed00dffd6bf1e6ac17c9e5814241_e3c390c4f8f54668a52a96e2c7971a11.png


execle可以获取环境变量,同样地上面几种替换函数也可以获取环境变量,在虚拟地址空间中存在着环境变量参数,子进程可通过地址空间获取环境变量


execle的参数列表与 mian函数的命令行参数非常的相似


d43ab3faee4167880f04924df52fdf24_0a2ece02895b4cb99e2f5d5209763771.png


main也是函数,也要被调用,也要被传参,而execl就是将程序加载到内存中的;所以程序执行的顺序便是:先加载,再执行


程序替换函数的本质是将程序加载到内存中,加载的工作由Linux exec*加载器来完成


函数解释


  1. 替换函数如果调用成功则加载新的程序从启动代码开始执行,不再返回
  2. 如果替换失败,返回-1
  3. 替换函数,只有失败的返回值,没有成功的返回值

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
6月前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
130 13
|
5月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
5月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
182 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
4月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
|
5月前
|
存储 缓存 安全
【Linux】冯诺依曼体系结构与操作系统及其进程
【Linux】冯诺依曼体系结构与操作系统及其进程
173 1
|
5月前
|
小程序 Linux
【编程小实验】利用Linux fork()与文件I/O:父进程与子进程协同实现高效cp命令(前半文件与后半文件并行复制)
这个小程序是在文件IO的基础上去结合父子进程的一个使用,利用父子进程相互独立的特点实现对数据不同的操作
114 2
|
5月前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
193 1
|
6月前
|
Web App开发 运维 监控
深入探索Linux命令pwdx:揭秘进程工作目录的秘密
`pwdx`命令在Linux中用于显示指定进程的工作目录,基于`/proc`文件系统获取实时信息。简单易用,如`pwdx 1234`显示PID为1234的进程目录。结合`ps`和`pgrep`等命令可扩展使用,如查看所有进程或特定进程(如Firefox)的目录。使用时注意权限、进程ID的有效性和与其他命令的配合。查阅`man pwdx`获取更多帮助。
|
6月前
|
存储 Shell Linux
Linux进程概念(下)
本文详细的介绍了环境变量和进程空间的概念及其相关的知识。
39 0
Linux进程概念(下)
|
5月前
|
缓存 Linux 编译器
【Linux】多线程——线程概念|进程VS线程|线程控制(下)
【Linux】多线程——线程概念|进程VS线程|线程控制(下)
72 0