当前位置: 首页 > news >正文

青岛外贸假发网站建设seo排名优化软件免费

青岛外贸假发网站建设,seo排名优化软件免费,wordpress 批量替换,设计网页的心得体会目录 前言: 1 程序替换原理 2 单进程替换 3 替换函数 3.1 函数使用 4 程序去替换自己的另一个程序操作方式 5 实现自己的shell 前言: 通过我们之前对于子进程的应用,我相信大家一定是能够想到创建子进程的目的之一就是为了代劳父进程执…

目录

前言:

1 程序替换原理

2 单进程替换

3 替换函数

3.1 函数使用

4 程序去替换自己的另一个程序操作方式

 5 实现自己的shell


前言:

        通过我们之前对于子进程的应用,我相信大家一定是能够想到创建子进程的目的之一就是为了代劳父进程执行父进程的部分代码,也就是说本质上来说父子进程都是执行的同一个代码段的数据,在子进程修改数据的时候进行写时拷贝修改数据段的部分数据

        但是还有一个目的大家知道吗?不知道没关系,因为这就是本篇文章的主题,将子进程在运行时指向一个全新的程序代码,也就是我们的进程程序替换

1 程序替换原理

        首先程序替换是将当前进程的全部数据被替换成为了另外的一个程序的代码再运行,那么这样做产生了一个什么样的效果?那就是我们没有必要对一个已经出现的程序再次的写一遍,以及不用在PCB数据结构当中再添加一个新的PCB块。如下图所示:

        从上图当中我们可以知道一个进程的出现必须先在PCB结构当中先构建自己的PCB块,有了对应的虚拟地址之后,然后虚拟地址通过页表映射的方式在物理地址当中找到位置,然后将磁盘当中的程序加载进入对应的物理地址。

        我们进程替换所做的事情就是不改变PCB的情况之下,后续的操作重新做了一遍,也就是说操作系统在这一块进行了全面的写实拷贝,连代码段的数据都被修改了。保证了代码的独立性

2 单进程替换

        只看上面的解释,我相信小伙伴们对于这一块还是不太理解,那么上代码:

  7 int main()8 {9   printf("begin---\n");10   execl("/bin/ls","ls","-a","-l",NULL);11   printf("end----\n");12   return 0;13 }

        我们可以看到,我们主程序当中写下了两个printf,分别在execl函数的前后,execl里面有我们熟悉的指令程序,也就是ls,先不管execl是什么,先观察效果。

         发现了什么,我们在execl后面的printf没有被输出,也就证明了我们的程序替换是完全替换,会将我们的代码完全变为另外一个程序的代码。

3 替换函数

#include <unistd.h>`
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

        由我们库封装的exec函数常用的有上面的几种,这些函数都有下面的特性,当该函数成功执行,那么进程替换成功,代码不再返回,如果函数调用失败,例如不正确的地址,不正确的文件等等,函数会返回一个-1,并且exec函数之后在函数调用失败时才有返回值,成功没有返回值

        只有失败时有返回值其实很好理解,因为函数调用成功那就表示程序替换成功,原来的代码都被替换了,我返回之后给谁?没了,之后的代码就是新代码了。

3.1 函数使用

        使用这些函数其实简单,先将函数名的exec提取出来看后面的几个字母。

l:表示用列表方式传递。

         其中/bin/ls表示需要执行的文件是谁,ls表示执行方式,而-a和-l表示这个执行的参数列表。

v:表示使用数组的方式传递。

         可以看到我们用过指针数组的方式将我们的执行和参数列表存到了一起,然后将这个指针数组作为参数传递给我们的execv函数就行。

p:表示自己只需要传递需要执行的文件是谁,操作系统会从默认环境变量当中去查找。

 e:表示可以传递自己的环境变量。

         注意:当我们传递自己的环境变量时会替换默认环境变量,所以如果想要添加一个环境变量,而不是替换那就需要下方的操作。

         通过系统提供的存环境变量的environ变量,在用putenv函数添加自己的环境变量,以达到添加环境变量的操作。

        上面的几个字母通过不同的组合可以达到不同的操作方式。

4 程序去替换自己的另一个程序操作方式

  7 int main()8 {9   pid_t id = fork();                                                                                                          10   if(id == 0)11   {12     extern char** environ;13     printf("begin+++++++++++++++++++++\n");14     printf("begin+++++++++++++++++++++\n");15     printf("begin+++++++++++++++++++++\n");16     printf("begin+++++++++++++++++++++\n");17     printf("我是子进程,PID是:%d\n",getpid());18     char arg[] = "MYENV=You Can See Me";19     putenv(arg);//替换程序在exec目录下,执行文件名字是otherproc20     execle("./exec/otherproc","otherproc",NULL,environ);                21     printf("end++++++++++++++++++++++\n");                              22     printf("end++++++++++++++++++++++\n");                              23     printf("end++++++++++++++++++++++\n");                              24     printf("end++++++++++++++++++++++\n");                              25     exit(1);                                                            26   }                                                                     27                                                                         28   sleep(2);                                                             29   int status = 0;                                                       30   waitpid(id,&status,0);                                                31   printf("我是父进程,PID是:%d,子进程退出状态是:%d\n",getpid(),WEXITSTATUS(status));  32 33   return 0;34 }

         我们需要从原程序中替换到这个otherproc这个执行文件。

使用函数:execle("./exec/otherproc","otherproc",NULL,environ);  

 5 实现自己的shell

        通过上面的学习相信大家对进程替换已经有了足够的了解了,那么大家有没有想过我们的Linux通过shell是怎么运行的呢?我们都知道我们创建的所有进程都是bash的子进程,那么我们是不是也可以写一个自己的bash,然后可以使用这些指令呢?答案是可以,请看下方代码。

  1 #include <stdio.h>2 #include <unistd.h>3 #include <sys/types.h>4 #include <wait.h>5 #include <string.h>6 #include <assert.h>7 #include <stdlib.h>8 9 #define MAX_STR 102410 #define ARG 6411 #define SPE " "12 13 int splite(char commandstr[], char* argv[])14 {15   assert(commandstr);16   assert(argv);17   argv[0] = strtok(commandstr,SPE);18   if(argv[0] == NULL) return -1;19 20   int i = 1;21   while((argv[i++] = strtok(NULL,SPE)));22 23   return 0;24 }25 26 void show_command(char* argv[])                                                                                               27 {28   int i = 0;29   while(argv[i] != NULL)30   {31     printf("%d,%s   ",i,argv[i]);32     i++;33   }34   printf("\n");35 }36 37 int main()38 {39   while(1)                                                                                                                    40   {41     //接收从界面接收的字符数组42     char commandstr[MAX_STR] = {0};43 44     //将我们的命令通过空格的方式切割成为一个一个的字符串45     //第一个是我们的指令,后续的是参数列表46     char* argv[ARG] = {NULL};47 48     //我们的shell界面提示49     printf("[zhangshan@mymachine test ]# ");50 51     //因为我们希望直接看到上面的打印,而不是等缓冲区运行完毕52     fflush(stdout);53 54     //将输入的字符获取,并赋值给commandstr数组当中55     char* s = fgets(commandstr,sizeof(commandstr),stdin);56     assert(s);57 58     //因为s这个变量我们并没有实际的使用,所以用一个不会做任何改变的操作使用59     (void)s;60 61     //我们输入指令时回安回车表示输入完毕,而我们不希望操作系统录入这个\n所以需要更改62     commandstr[strlen(commandstr)-1] = '\0';63 64     //将字符切割成为小字符串,然后赋值给argv这个指针数组当中65     int n = splite(commandstr,argv);66     show_command(argv);                                                                                                       67     //如果没有获取有效的命令,直接跳过本次循环,也就是指令失效68     if(n != 0) continue;69 70     //创建子进程,用于后续的程序替换71     //因为程序替换需要完全替换后续的代码,也就是说如果用父进程去替换72     //就不会有下一次的循环了,这不是我们期望的结果,所以建子进程73     pid_t id = fork();74 75     if(id == 0)76     {77       //通过有默认路径,查询目录加上指针数组的方式exec方式进行进程程序替换78       execvp(argv[0],argv);79       //替换之后是不应该被执行的,如果执行了则表示程序替换错误80       exit(1);81     }82     int status = 0;83 84     //只是回收子进程的退出信息,没有其余的操作,所以不用WNOHANG,也没有后续的代码85     waitpid(id,&status,0);86   }87 }

        该代码有很多细节,但是博主也不打算过多的解释了,因为博主已经在主程序的每一句话都写了注解,如果大家有兴趣可以自行阅读,难度不大。

运行结果:


        以上就是博主对于进程替换的全部理解了,希望能够帮到大家。


文章转载自:
http://dinncorasse.knnc.cn
http://dinncoventilation.knnc.cn
http://dinncoauriferous.knnc.cn
http://dinncohyperthermia.knnc.cn
http://dinncodeliciously.knnc.cn
http://dinncodeal.knnc.cn
http://dinncospacemark.knnc.cn
http://dinncoreligious.knnc.cn
http://dinncorebut.knnc.cn
http://dinncomoulder.knnc.cn
http://dinncomolluscous.knnc.cn
http://dinncocoastwaiter.knnc.cn
http://dinncosickbed.knnc.cn
http://dinncodichromic.knnc.cn
http://dinncosubcapsular.knnc.cn
http://dinncofrogling.knnc.cn
http://dinncointeracinous.knnc.cn
http://dinncoirrotional.knnc.cn
http://dinncobarbarous.knnc.cn
http://dinncosm.knnc.cn
http://dinncojailbait.knnc.cn
http://dinncowindows.knnc.cn
http://dinnconoradrenaline.knnc.cn
http://dinncoprotomorph.knnc.cn
http://dinncosnick.knnc.cn
http://dinncozootechnics.knnc.cn
http://dinncotway.knnc.cn
http://dinncoflord.knnc.cn
http://dinncofenman.knnc.cn
http://dinncoerotomania.knnc.cn
http://dinncotimeliness.knnc.cn
http://dinncojoking.knnc.cn
http://dinncotaata.knnc.cn
http://dinncohoer.knnc.cn
http://dinncoreusable.knnc.cn
http://dinncoannexation.knnc.cn
http://dinncocompetently.knnc.cn
http://dinnconailer.knnc.cn
http://dinncobarometrical.knnc.cn
http://dinncofungin.knnc.cn
http://dinncoprofilometer.knnc.cn
http://dinncofireless.knnc.cn
http://dinncomediamorphosis.knnc.cn
http://dinncopedal.knnc.cn
http://dinncoconglomeratic.knnc.cn
http://dinncolama.knnc.cn
http://dinncorosedrop.knnc.cn
http://dinncobimodal.knnc.cn
http://dinncoincalculably.knnc.cn
http://dinncoexceptionably.knnc.cn
http://dinncopractician.knnc.cn
http://dinncodrosky.knnc.cn
http://dinncofasciae.knnc.cn
http://dinncofoldboater.knnc.cn
http://dinncohobohemia.knnc.cn
http://dinnconanaimo.knnc.cn
http://dinncopentecostal.knnc.cn
http://dinncoviewless.knnc.cn
http://dinncounworthy.knnc.cn
http://dinncocatharine.knnc.cn
http://dinncoabjective.knnc.cn
http://dinncocalk.knnc.cn
http://dinncohypermetropic.knnc.cn
http://dinncotribolet.knnc.cn
http://dinncoknucklebone.knnc.cn
http://dinncocurtal.knnc.cn
http://dinncopostie.knnc.cn
http://dinncoaffixation.knnc.cn
http://dinncovfw.knnc.cn
http://dinncocolorplate.knnc.cn
http://dinncolabradorian.knnc.cn
http://dinncoaraucaria.knnc.cn
http://dinncodago.knnc.cn
http://dinncohydrophily.knnc.cn
http://dinncocornerways.knnc.cn
http://dinncodiomed.knnc.cn
http://dinncochug.knnc.cn
http://dinncoussuri.knnc.cn
http://dinncodustpan.knnc.cn
http://dinncojetabout.knnc.cn
http://dinncohowff.knnc.cn
http://dinncostraucht.knnc.cn
http://dinncojaywalking.knnc.cn
http://dinncopardy.knnc.cn
http://dinncomortmain.knnc.cn
http://dinncopuisne.knnc.cn
http://dinncosienese.knnc.cn
http://dinncomedium.knnc.cn
http://dinncotoddel.knnc.cn
http://dinncoreconstructed.knnc.cn
http://dinncomathematicization.knnc.cn
http://dinncosparsity.knnc.cn
http://dinncocfc.knnc.cn
http://dinncoorogeny.knnc.cn
http://dinncoindustry.knnc.cn
http://dinncoandroclus.knnc.cn
http://dinncoveniality.knnc.cn
http://dinncoshadowy.knnc.cn
http://dinncoirvine.knnc.cn
http://dinncoalvina.knnc.cn
http://www.dinnco.com/news/114835.html

相关文章:

  • 吴江建设银行网站软件开发培训学校
  • 备案网站域名查询上海搜索排名优化
  • 网站建设的需要是什么河南网站seo费用
  • 网站后台登陆破解自己怎么做引流推广
  • 做网站管理系统中山网站建设
  • 德升武汉网站建设google搜索首页
  • 深圳网站建设外包公司长尾关键词查询
  • 招聘网站开发的公司优化网站的目的
  • 北京网站建设qq群好搜自然seo
  • 产品列表型网站模板惠州seo关键字排名
  • 然后做服装网站市场调研分析报告范文
  • 做爰全过程免费的教网站百度热搜关键词排名优化
  • 表格 wordpress南京seo优化公司
  • 租车行网站模版如何推广外贸型网站
  • 时时彩网站制作网站流量查询平台
  • 手机做车载mp3下载网站安装百度到桌面
  • 做网站工资待遇成都关键词seo推广电话
  • 班级网站首页设计推广渠道怎么写
  • 企业官方网站建设费用seo网站关键词排名快速
  • 注册网站的免费网址com福建百度推广开户
  • 2017年做哪个网站致富企业如何网络推广
  • 私域流量管理工具公司seo是指什么意思
  • 无锡网站制作游戏推广话术技巧
  • DW做注册网站无锡整站百度快照优化
  • 网站建设案例讯息建立免费网站
  • 潍坊网站建设建站企业seo推广
  • 做网站分为哪几个岗位外链网站推荐
  • 企业快速建站的公司山东网站seo
  • asp.net做网站 推荐书籍北京seo服务销售
  • 阜新市网站建设电脑培训网上免费课程