网站后台密码忘记了大连建行网点查询
web/
2025/9/29 21:09:48/
文章来源:
网站后台密码忘记了,大连建行网点查询,广州微网站建设服务,北京单位网站建设培训大家好#xff0c;我是苏貝#xff0c;本篇博客带大家了解Linux进程#xff08;9#xff09;进程控制1#xff0c;如果你觉得我写的还不错的话#xff0c;可以给我一个赞#x1f44d;吗#xff0c;感谢❤️ 目录 #xff08;A#xff09;什么是进程程序替换#xf… 大家好我是苏貝本篇博客带大家了解Linux进程9进程控制1如果你觉得我写的还不错的话可以给我一个赞吗感谢❤️ 目录 A什么是进程程序替换B原理C父子进程中子进程程序替换原理D使用所有的替换方法exec*并且认识函数参数的含义1. execl2. execv3. execvp4. execlp5. 替换自己写的程序6. execvpe A什么是进程程序替换
先直接看代码和现象execl函数先不用管后面会说到
通过结果我们发现进程在执行完第一个printf函数后执行的是ls -a -l的命令而且不再执行第二个printf函数。所以我们可以看出execl函数的作用是让进程通过execl函数执行新的程序。还是不理解现在让我们来了解进程程序替换的原理
B原理 我们自己的代码编译后生成可执行程序运行程序就变成了进程此时操作系统就要为进程创建pcb、地址空间、页表建立各种映射关系。运行程序testexec时要将对应的代码和数据加载到内存中。
现在执行execl函数我们知道进程内核数据结构代码和数据execl函数做的就是将本进程的代码和数据用新进程的代码和数据覆盖进程的内核数据结构大体不变只有少部分属性会发生改变。
站在替换进程的角度就是这个进程被加载到内存中了
execl函数有没有创建新的进程 没有它只是用老进程的壳子执行新进程的代码
回到上面的例子为什么没有打印第二个printf函数 因为execl函数将本进程的代码和数据用新进程的代码和数据覆盖了
我们来看一下execl函数我们上面的代码里面有后面的参数但是没有用变量接收execl函数的返回值那返回值重要吗 不重要我们可以不关心。只要替换成功原来的代码就被覆盖了所以我们不会再执行原先代码。但如果替换失败我们还是会执行原先代码。 C父子进程中子进程程序替换原理
创建子进程子进程可完成2种任务
子进程执行父进程代码的一部分即执行fork之后父子进程共享的代码子进程执行一个全新的程序使用进程程序替换
下面来讲父子进程中子进程程序替换的原理
在创建子进程后父子进程页表映射的是同一块数据和代码空间
子进程要进程程序替换对于数据a因为进程程序替换是需要将进程的代码和数据用新进程的代码和数据覆盖所以相当于要对数据进行写入为了保证进程的独立性会发生写时拷贝即在物理内存中开辟一块新的空间将数据a拷贝到该空间再对该空间的数据进行写入用新进程的数据覆盖子进程的页表映射到该空间
那代码呢我们之前讲的都是父子进程的代码共享那现在呢 因为子进程的代码也会被替换所以也会发生写时拷贝 现在来用代码试一试
子进程执行的确实是ls -a -l命令我们上面说过只要替换成功原来的代码就被覆盖了所以我们不会再执行exit函数所以退出码是0。
现在我们让进程程序替换失败只修改了框框里的内容
替换失败我们还是会执行原先代码exit(2)所以退出码是2
D使用所有的替换方法exec*并且认识函数参数的含义
一共有6种替换方法下面来逐一介绍
1. execl
exec后面的l列表
第一个参数path我们要执行的程序的路径怎么找到程序你得告诉我 后面的参数在命令行中怎么执行就怎么传参 最后的参数一定是NULL
举例修改.c文件如果我们想执行ls -l先传ls的路径/usr/bin/ls再传我们想怎么执行在命令行中是ls -l变成execl函数的参数时就直接填上去就是了不过它们要分成2个参数。如果我们想执行的是ls -a -l那么就要分成3个参数”ls”,”-a”和”-l” 2. execv
v表示数组
第一个参数和execl函数一样都是要执行的程序的路径怎么找到程序你得告诉我 第二个参数是个char* const类型的数组只需要将execl除第一个参数以外的所有参数包括NULL放入一个数组中再传这个数组即可 3. execvp
v需要数组 p查找这个程序系统会自动在环境变量PATH中进行查找。所以用户可以不传要执行的程序的路径但是程序名要传直接告诉exec*函数我要执行谁就行 4. execlp
llist列表 p查找这个程序系统会自动在环境变量PATH中进行查找。所以用户可以不传要执行的程序的路径但是程序名要传直接告诉exec*函数我要执行谁就行
虽然有2个“top”但它们的含义不同。第一个表示我要执行的程序的程序名第二个是我要怎么执行该程序
5. 替换自己写的程序
我们上面替换的都是系统命令可不可以替换我们自己写的程序呢当然可以
先写要替换的我们自己写的程序的.c文件 修改要被替换的.c文件
execl函数的第一个参数传./myprocess我能理解就是传要执行的程序的路径。那第二个参数不是说命令行中怎么传我们就怎么传吗为什么不是和命令行一样传./myprocess而是直接传myprocess因为我们已经知道了myprocess的路径命令行中传./myprocess是因为我们不知道myprocess的路径
只用make将2个.c文件都编译形成可执行程序 替换成功 6. execvpe
v数组 p查找这个程序系统会自动在环境变量PATH中进行查找。所以用户可以不传要执行的程序的路径但是程序名要传直接告诉exec*函数我要执行谁就行 e环境变量 修改被替换进程对应的.c文件
第一个参数按标准来是只需要输入程序名系统会自动在环境变量PATH中进行查找。但是因为myprocess程序不在PATH内容的路径中所以只能./myprocess。 第2和第3个参数表示我们将它们传给myprocess程序
修改要替换的我们自己写的程序的.c文件。程序接收到了execvpe函数传递的命令行参数argv数组和环境变量envp数组现在我们将这两个数组打印出来
了解了execvpe函数之后我们就可以知道之前我们说环境变量的时候说bash会将命令行参数表和环境变量的表交给子进程怎么交呢就是bash用execvpe函数将命令行参数表和环境变量表分别作为第二个和第三个参数 传给子进程。子进程将这2张表传给它的子进程同理。
对于execvpe函数的第三个参数的作用整体替换所有的环境变量。所以传参时有3种选择
用自定义环境变量传参用默认的环境变量传参默认的环境变量稍微修改再传参
介绍第二种用默认的环境变量传参 需要用到environ 介绍第三种默认的环境变量稍微修改再传参
需要用到putenv函数修改或添加一个环境变量其实就是将修改写入环境变量表或写入一个新的变量到环境变量表中 好了那么本篇博客就到此结束了如果你觉得本篇博客对你有些帮助可以给个大大的赞吗感谢看到这里我们下篇博客见❤️
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84092.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!