进程控制(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. 替换函数,只有失败的返回值,没有成功的返回值

目录
相关文章
|
1天前
|
存储 安全 Linux
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念
|
2天前
|
存储 Linux Shell
Linux:进程等待 & 进程替换
Linux:进程等待 & 进程替换
27 9
|
2天前
|
存储 Linux C语言
Linux:进程创建 & 进程终止
Linux:进程创建 & 进程终止
23 6
|
2天前
|
存储 Linux Shell
Linux:进程概念
Linux:进程概念
17 8
|
2天前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
6 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
2天前
|
Linux 调度 数据库
|
2天前
|
存储 缓存 Linux
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
本文介绍了Xenomai中的XDDP(Xenomai Distributed Data Protocol)通信机制,XDDP用于实时和非实时进程之间的数据交换。XDDP在Xenomai内核中涉及的数据结构和管理方式,以及创建XDDP通道后的实时端和非实时端连接过程。
8 0
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
|
2天前
|
Shell Linux
【Linux】进程实践项目(更新中) — 自主shell编写
前几篇文章,我们学习进程的相关知识:进程概念,进程替换,进程控制。熟悉了进程到底是个什么事情,接下来我们来做一个实践,来运用我们所学的相关知识。这个项目就是手搓一个shell模块,模拟实现Xshell中的命令行输入。
9 1
|
2天前
|
自然语言处理 Java Linux
【Linux】开始学习进程替换吧!
通过学习进程替换,我们可以体会到多语言混搭的快乐,可以从C语言直接蹦到python ,也可以从c++里运行java代码。是不是很厉害!这是通过调度多个进程的效果,联系我们之前学习的进程,进程控制等概念。我们可以想要运行其他代码可以通过创建子进程来实现,但是这样也肯定是同一种语言,如果想要运行其他语言,那是不是有种方法可以调度一个进程来当做子进程呢??? 我们开始今天的学习吧!
9 0
|
2天前
|
Shell Linux 编译器
【Linux】从零开始认识进程 — 中下篇
环境变量具有系统级的全局属性,因为会被子进程继承下去!!!
9 0
【Linux】从零开始认识进程 — 中下篇