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

做游戏网站要通过什么审核宁波seo公司

做游戏网站要通过什么审核,宁波seo公司,中国制造网网站特色,郑州新冠疫情最新消息今天本节重点 理解进程替换的相关概念与原理掌握相关程序替换接口程序替换与进程创建的区别程序替换的注意事项 一、概念与原理 进程程序替换是操作系统中实现多任务和资源复用的关键机制,允许进程在运行时动态加载并执行新程序。 1.1 定义 进程程序替换是指用新程…

本节重点

  • 理解进程替换的相关概念与原理
  • 掌握相关程序替换接口
  • 程序替换与进程创建的区别
  • 程序替换的注意事项

一、概念与原理

进程程序替换是操作系统中实现多任务和资源复用的关键机制,允许进程在运行时动态加载并执行新程序。

1.1 定义

进程程序替换是指用新程序的代码、数据和堆栈完全替换当前进程的地址空间(加载新程序到内存、更新页表映射、初始化虚拟地址空间,并将进程控制块(PCB)指向新程序),使进程执行新程序的逻辑,而进程ID(PID)保持不变

1.2 与进程创建的区别

  • 进程创建(fork):创建新进程,并分配PID
  • 进程程序替换:不创建新进程,更改原程序的代码与数据

二、实现方法 exec函数(6+1)

2.1 语言封装(6)

2.1.1 execl

函数原型:

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

参数:

pathname:新程序的路径+文件名

arg:传递给新程序的参数

代码示例:

#include<iostream>
#include<cstdio>
#include<unistd.h>
int main()
{printf("进程替换之前!\n");int ret=execl("/bin/ls","ls","-a","-l",NULL);//进程替换成功后后续代码不会执行//只有进程替换出错后才会执行后续代码,并设置错误码(void)ret;printf("进程替换之后!\n");return 0;
}

运行结果:

2.1.2 execlp

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

 参数解析:

file:新程序的程序名

arg:传递给新程序的参数/执行的方法

代码示例:

#include<iostream>
#include<cstdio>
#include<unistd.h>int main()
{printf("进程替换之前!:\n");int ret=execlp("ls","ls","-a","-l",NULL);(void)ret;if(ret==-1)printf("execlp fail!\n");printf("进程替换之后!:\n");return 0;
}

运行结果:

2.1.3 execle

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

 参数解析: 

pathname:新程序的路径+文件名

arg:传递给新程序的参数/执行新程序的方法

envp:传递给新程序的环境变量表(以NULL结尾)

代码示例:

code.cc

#include<iostream>
#include<cstdio>
#include<unistd.h>int main()
{printf("进程替换之前!:\n");char* const env[]={(char* const)"other=12345",(char* const)"n1=45612",(char* const)"n2=56784",(char* const)"n3=12034",(char* const)"n4=yuejianhua",(char* const)"n5=jinzhiqi",NULL,};int ret=execle("./text","text",NULL,env);if(ret==-1)printf("execlp fail!\n");printf("进程替换之后!:\n");return 0;
}

text.cc 

#include<iostream>
#include<cstdio>
#include<unistd.h>int main(int argc,char* argv[],const char* env[])
{//打印环境变量表:int i=0;while(env[i]){std::cout<<env[i]<<std::endl;i++;}i=0;//打印命令行参数列表:while(argv[i]){std::cout<<argv[i]<<std::endl;i++;} return 0;
}

运行结果:

2.1.4 execv

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

 参数解析: 

pathname:新程序的路径+文件名

argv:传递给新程序的命令行参数列表(以NULL结尾)

代码示例:

#include<iostream>
#include<cstdio>
#include<unistd.h>int main()
{printf("进程替换之前!:\n");char* const argv[]={(char* const)"ls",(char* const)"-a",(char* const)"-l",NULL,};int ret=execv("/bin/ls",argv);if(ret==-1)printf("execlp fail!\n");printf("进程替换之后!:\n");return 0;
}

运行结果:

2.1.5 execvp

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

 参数解析: 

file:新程序的文件名

argv:传递给新程序的命令行参数表(以NULL结尾)

代码示例:

code.cc

#include<iostream>
#include<cstdio>
#include<unistd.h>int main()
{printf("进程替换之前!:\n");char* const argv[]={(char* const)"yuejianhua",(char* const)"jinzhiqi",NULL,};int ret=execvp("./text",argv);if(ret==-1)printf("execlp fail!\n");printf("进程替换之后!:\n");return 0;
}

text.cc

#include<iostream>
#include<cstdio>
#include<unistd.h>int main(int argc,char* argv[],char* env[])
{//打印环境变量表:int i=0;//打印命令行参数列表:while(argv[i]){std::cout<<argv[i]<<std::endl;i++;}  return 0;
}

 运行结果:

2.1.6 execvpe

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

 参数解析: 

file:新程序的函数名

argv:传递给新程序的命令行参数列表(以NULL结尾)

envp:传递给新程序的环境变量表(以NULL结尾)

code.cc

#include<iostream>
#include<cstdio>
#include<unistd.h>int main()
{printf("进程替换之前!:\n");char* const argv[]={(char* const)"yuejianhua",(char* const)"jinzhiqi",NULL,};char* const env[]={(char* const)"other=12345",(char* const)"n1=45612",(char* const)"n2=56784",(char* const)"n3=12034",NULL,};int ret=execvpe("./text",argv,env);if(ret==-1)printf("execlp fail!\n");printf("进程替换之后!:\n");return 0;
}

text.cc

#include<iostream>
#include<cstdio>
#include<unistd.h>int main(int argc,char* argv[],char* env[])
{//打印环境变量表:int i=0;while(env[i]){std::cout<<env[i]<<std::endl;i++;} i=0;//打印命令行参数列表:while(argv[i]){std::cout<<argv[i]<<std::endl;i++;}  return 0;
}

运行结果:

2.2 系统调用(1)

2.2.1 execve

int execve(const char *pathname, char *const argv[],char *const envp[]);

参数解析: 

pathname:新程序的路径+文件名

argv:传递给新程序的命令行参数表(以NULL结尾)

envp:传递给新程序的环境变量表(以NULL结尾)

代码示例:

code.cc

#include<cstdio>
#include<iostream>
#include<unistd.h>
int main()
{std::cout<<"这是进程替换之前"<<std::endl;//传递自己的命令行参数与环境变量表char* const argv[]={(char* const)"yuejianhua",(char* const)"jinzhiqi",NULL,};char* const env[]={(char* const)"n1=12345",(char* const)"n2=45678",(char* const)"n3=lut",NULL,};int ret=execve("./text",argv,env);//替换成功后续代码不会执行if(ret<0){std::cout<<"进程替换失败!"<<std::endl;}std::cout<<"进程替换之后"<<std::endl;return 0;
}

text.cc

#include<cstdio>
#include<iostream>int main(int argc,char* argv[],char* env[])
{int i=0;while(argv[i]){std::cout<<argv[i]<<std::endl;i++;}i=0;while(env[i]){std::cout<<env[i]<<std::endl;i++;}return 0;
}

 运行结果:

2.3 总结 

函数参数传递方式环境变量路径搜索示例调用
execl  可变参数列             表     继承 需完整路             径execl("/bin/ls", "ls", "-l", NULL)
execlp可变参数列表继承支持 PATHexeclp("ls", "ls", "-l", NULL)
execle可变参数列表显式传递需完整路径execle("/bin/ls", "ls", "-l", NULL, envp)
execv参数数组继承需完整路径char *argv[] = {"ls", "-l", NULL}; execv("/bin/ls", argv);
execvp参数数组继承支持 PATHexecvp("ls", argv);
execve参数数组显式传递需完整路径execve("/bin/ls", argv, envp);

 知识点:

进程程序替换所关联的exec族函数都有一个显著特征就是exec+参数传递的方式,每个字母代表特定的传参方法,以下是关于这一类型的总结:

  • l (list)      :表示给新进程传参需要一个个传
  • p(PATH):表示索引新进程可以只传递文件名,但是要是自己的代码文件必须指明路径
  • v(vector):表示给新进程传参可以直接使用自定义命令行参数列表
  • e(env)    :表示可以给新进程传递自定义环境变量表

这里需要注意的是命令行参数列表与环境变量表必须都以NULL结尾。 

exec族函数在底层都封装了系统调用execve。

当在进程替换的时候显式地给新进程传递环境变量表时传递的环境变量表会覆盖默认的环境变量表,可以参考execle的代码演示。

三、进程替换的用途

在后期我们可以通过fork+exec机制创建子进程利用进程替换机制使子进程执行定义好的代码文件。

如:Shell执行命令(简易版):

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程:替换为 ls 命令char *argv[] = {"ls", "-l", NULL};execvp("ls", argv); // 自动搜索 PATHperror("execvp failed");exit(1);} else if (pid > 0) {// 父进程:等待子进程结束wait(NULL);printf("Command executed.\n");} else {perror("fork failed");}return 0;
}

fork+exec机制使用后要注意资源回收的问题,使用进程等待的方式回收或使用信signal(SIGCHLD, SIG_IGN) 自动回收(需谨慎)。

http://www.dtcms.com/wzjs/31633.html

相关文章:

  • 最适合穷人开的店成都sem优化
  • 家在深圳龙岗百度seo详解
  • 用java做中小企业网站多策划公司排行榜
  • 注册资金500万的公司需要多少钱深圳网站搜索优化
  • 苏州调查公司有哪些上海抖音seo公司
  • 房产中介网站建设微信平台推广方法
  • 重庆市建设工程信息网官网查询入口上海seo怎么优化
  • 做平面设计的网站重庆百度竞价推广
  • 青岛市有什么网络科技公司英文seo兼职
  • 金坛网站建设公司cnn头条新闻
  • 电商思维做招聘网站什么是推广
  • wild合成版是哪个网站做的seo薪酬
  • 网站框架怎么做自动搜索关键词软件
  • 网站编辑容易做吗免费单页网站在线制作
  • 自适应网站做多大尺寸的好的推广平台
  • 上海知名网站设计保定网站建设方案优化
  • 合肥市建设委员会网站优化seo教程技术
  • 临沂高端网站建设色盲测试图免费测试
  • app网站建设销售石家庄seo关键词
  • 网站导航页设计营销软件app
  • 专业的网站建设服务怎么建个网站
  • 国外平台卖货达州seo
  • 山东网站建设设计百度导航官网
  • 网站上点击图片局部放大如何做优化软件seo排名
  • 网站代码怎么查看武汉网络推广外包公司
  • 需求登记网站怎么做个人友情链接推广
  • php做网站很快嘛百度网址大全旧版本
  • 网站开发资金来源站长工具app官方下载
  • wordpress老版本关键词优化课程
  • 西安未央区网站建设西安霸屏推广