两学一做 山西答题网站,开发者,windows下wordpress,服装网站建设开发语言文章目录 进程程序替换程序替换函数execl()函数调用另外一个可执行程序 execlp()函数ecexv()函数execle()函数 替换函数总结 进程程序替换
什么是进程程序替换#xff1f;为什么要有程序替换#xff1f; 顾名思义#xff0c;进程程序替换就是把该进程中的程序替换掉#x… 文章目录 进程程序替换程序替换函数execl()函数调用另外一个可执行程序 execlp()函数ecexv()函数execle()函数 替换函数总结 进程程序替换
什么是进程程序替换为什么要有程序替换 顾名思义进程程序替换就是把该进程中的程序替换掉那么为什么要把该进程中的程序替换掉呢因为我们在创建子进程时想让子进程去做其他的事情如果直接把子进程要做的事情写在该程序中会让程序变得很臃肿而且我们希望子进程可以做很多的事情。
程序替换函数
子进程进行程序替换一般要使用exec系列的函数。 接下来我们对这个系列的函数使用进行阐述并总结 通过下面代码我们来依次了解这些函数的使用 execl()函数
先看使用 执行结果 对各参数进行说明: 参数path要我们说明要调用程序的路径 参数arg可以看到这里是一个可变参数第一个参数写命令后面的写对应的选项最后要以NULL结尾。通俗来讲就是我们在命令行中怎么写的这里的参数arg就要怎么写最后再加上NULL即可。比如ls -a -l 这里就写 ls -a -l NULL.
调用另外一个可执行程序 在可执行程序mytest1中调用可执行程序mytest2
execlp()函数
使用 结果 对参数进行说明 参数file函数execlp中含有p,说明继承的环境变量属性没有被替换因此无需写路径指明要执行的程序在哪个文件即可会自动的在对应的路径下找到这个文件例如ls在/usr/bin/下的ls文件中因此当要执行程序ls时这里的参数就是对应的文件ls 可变参数arg:因为函数名中含有l意为参数格式为列表也是按在bash命令下写的这就证明写最后加上NULL即可。
ecexv()函数
使用1 注意类型是char* const 而不是const char* 结果1 使用2 结果2
参数 参数path因为函数名不带p没有继承环境变量因此要传确切的文件路径(相对路径或绝对路径总之能让当前文件找到即可) 参数argv:注意这里的参数类型是char* const而不是const char*这是个指针指向不可变的指针数组相比于可变参数列表传递这个函数是直接将一个参数数组传了过去。也就是把可变参数列表放到了这个数组里。对于自己写的程序要传的path路径是生成的可执行程序的路径而不是源文件的路径
execle()函数
putenv()函数用于添加一个环境变量给调用进程的上下文 可以看到当我们不传环境变量时子进程也可以拿到我们在当前进程创建的环境变量。那么当前进程的父进程可以拿到我们在当前进程的环境变量吗 可以看到在当前进程导入的变量与它的父进程无关它只会传递给子进程
那么我要是就想自己传环境变量应该怎么传呢 那就要使用exec系列中带e的函数了 使用 结果 参数 参数path表明子进程要替换成的可执行程序的路径 参数arg可变参数列表传递命令行参数 参数envp:传递环境变量表可以用自己写的环境变量的指针数组传递也可以用全局变量environ传递 传递全局变量environ 使用 结果 对这两种方式进行总结传递environ会把在父进程中继承中的环境变量也都传过去若传递的是在当前进程写的自定义环境变量指针数组那么在替换函数中接收到的环境变量会把在父进程中继承中的环境变量覆盖掉
替换函数总结
1、函数名中带l就是要我们以参数列表的形式传递命令行参数 2、函数名中带v就是要我们以指针数组的形式把参数传过去 3、函数中带p,说明它会继承父进程的环境变量因此可只需指明要去替换的可执行程序的文件名即可函数会自己去找到该文件 4、函数名中带e的需要我们自己自定义设置环境变量可以自己添加环境变量指针数组传过去但这会覆盖继承的环境变量如果想保留继承的环境变量那么在当前进程putenv()对应的环境变量添加到当前进程的上下文不会添加到父进程再用全局变量environ传递过去即可
对字母所指的单词进行解释 l:list列表 v:vector数组 p:path路径 e:environment环境