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

网页制作如何新建站点门户建设目标

网页制作如何新建站点,门户建设目标,网站优化 ppt,三合一网站cms[Linux]进程程序替换 文章目录 [Linux]进程程序替换进程程序替换的意义见一见进程程序替换进程程序替换的原理进程程序替换中的写时拷贝介绍进程程序替换接口 进程程序替换的意义 Linux系统下使用fork系统函数创建子进程后#xff0c;子进程只能执行继承的部分父进程代码子进程只能执行继承的部分父进程代码如果要想让子进程执行一份单独的代码就要进行进程程序替换。 见一见进程程序替换 进程程序替换的头文件和函数如下: 编写如下代码来见一见进程程序替换: #include stdio.h #include unistd.hint main() {printf(进程程序替换前\n);printf(进程程序替换前\n);printf(进程程序替换前\n);execl(/bin/ls, ls, -a, -l, NULL);printf(进程程序替换后\n);printf(进程程序替换后\n);printf(进程程序替换后\n);return 0; }编译代码并运行查看结果: 可以看出进程程序替换后进程不再执行原有的代码而是转而执行替换后的代码。进程替换函数后的代码不再被执行因此可以看出程序替换是整体替换替换后原有的代码和数据都不存在了。 进程程序替换的原理 进程程序替换是在不修改进程pcb中的id的情况下将磁盘中的可执行程序的代码和数据传送到内存中替换进程原有的代码和数据并且修改页表映射完成进程程序的替换示意图如下: 从进程的角度看代码和数据被操作系统替换了。从程序的角度看自身的代码和数据被加载到了内存中。 程序加载的原理 在Linux操作系统下启动的任何一个进程都是shell进程的子进程启动进程的就是先让shell进程创建一个子进程的pcb然后用我们编写好的进程的代码和数据替换这个shell进程的子进程的从而完成进程的加载启动。 进程程序替换中的写时拷贝 为了体会进程程序替换中的写时拷贝编写如下代码: #include stdio.h #include unistd.h #include sys/types.h #include sys/wait.hint main() {pid_t id fork();if (id 0){//子进程printf(我是子进程我的pid:%d\n, getpid());execl(/bin/ls, ls, -a, -l, NULL);}waitpid(id, NULL, 0);printf(我是父进程我的pid:%d\n, getpid());return 0; }编译代码运行并且查看结果 可以看出进程程序替换是不影响父进程的代码和数据的因为在替换子进程的代码和数据时发生了写时拷贝另外可以看出实际上代码区的数据是可以修改的。 介绍进程程序替换接口 返回值 进程程序替换函数只有在执行失败时才会有返回值如果进程程序替换失败了会返回-1,并且设置错误码。由于进程程序替换函数的替换成功后该函数内部的返回代码也被替换了因此一旦执行成功是不会有返回值的。一旦替换失败了由于进程程序替换不会修改pcb因此也不影响父进程接收子进程的退出码。 编写如下代码进行测试 #include stdio.h #include unistd.h #include sys/types.h #include sys/wait.h #include stdlib.hint main() {pid_t id fork();if (id 0){//子进程int n execl(/bin/lsss, lsss, -a, -l, NULL);printf(我是子进程我的id:%d, 程序替换失败n: %d\n, getpid(), n);exit(1);}int status 0;waitpid(id, status, 0);printf(我是父进程子进程退出码:%d\n, WEXITSTATUS(status));return 0; }编译代码运行并查看结果: 由于我们传入的替换程序是错误的进程程序替换失败了接收到了返回值-1,父进程也正常接收到了退出码-1。 再编写如下代码进行测试 #include stdio.h #include unistd.h #include sys/types.h #include sys/wait.h #include stdlib.hint main() {pid_t id fork();if (id 0){//子进程int n execl(/bin/ls, ls, hello.txt, NULL);//该文件不存在printf(我是子进程我的id:%d, 程序替换失败n: %d\n, getpid(), n);exit(1);}int status 0;waitpid(id, status, 0);printf(我是父进程子进程退出码:%d\n, WEXITSTATUS(status));return 0; }编译代码运行并查看结果: 可以看出即使程序替换成功了也不影响子进程退出码的接收。 execl函数 //execl函数声明 int execl(const char *path, const char *arg, ...);path参数 – 要替换的程序的路径arg参数 – 可变参数接收替换程序的命令行参数以NULL结尾 编写如下代码进行测试 #include stdio.h #include unistd.hint main() {printf(进程程序替换前\n);execl(/bin/ls, ls, -a, -l, NULL);printf(进程程序替换失败\n);return 0; }编译代码运行并查看结果: execv函数 //execv函数声明 int execv(const char *path, char *const argv[]);path参数 – 要替换的程序的路径argv参数 – 接收要替换程序的命令行参数以NULL结尾 编写如下代码进行测试 #include stdio.h #include unistd.hint main() {printf(进程程序替换前\n);//execl(/bin/ls, ls, -a, -l, NULL);char * const argv[] {ls,-a,-l,-n,NULL};execv(/bin/ls, argv);printf(进程程序替换失败\n);return 0; }编译代码运行并查看结果: execlp函数 //execlp函数声明 int execlp(const char *file, const char *arg, ...);file参数 – 要替换的程序名会自动去环境变量的路径中查找该程序arg参数 – 可变参数接收替换程序的命令行参数以NULL结尾 编写如下代码进行测试 #include stdio.h #include unistd.hint main() {printf(进程程序替换前\n);execlp(ls, ls, -l, -n, NULL);printf(进程程序替换失败\n);return 0; }编译代码运行并查看结果: execvp函数 //execvp函数声明 int execvp(const char *file, char *const argv[]);file参数 – 要替换的程序名会自动去环境变量的路径中查找该程序argv参数 – 接收要替换程序的命令行参数以NULL结尾 编写如下代码进行测试 #include stdio.h #include unistd.hint main() {printf(进程程序替换前\n);char * const argv[] {ls,-l,-n,NULL};execvp(ls, argv);printf(进程程序替换失败\n);return 0; }编译代码运行并查看结果: execle函数 //execle函数声明 int execle(const char *path, const char *arg, ..., char * const envp[]);path参数 – 要替换的程序的路径arg参数 – 可变参数接收替换程序的命令行参数以NULL结尾envp参数 – 接收传给替换程序的环境变量以NULL结尾覆盖式传入接收的进程中只会有传入的环境变量 编写如下文件目录结构: 使用myproc程序和otherproc程序进行测试其代码内容如下 //myproc #include stdio.h #include unistd.hint main() {printf(进程程序替换前\n);char * const envp[] {MYENVYOUCANSEEME,NULL };execle(../otherproc/otherproc, otherproc, NULL, envp);printf(进程程序替换失败\n);return 0; }//otherproc #include iostream #include stdlib.husing namespace std;int main() {cout MYENV: (getenv(MYENV)NULL?NULL:getenv(MYENV)) endl;cout PATH: (getenv(PATH)NULL?NULL:getenv(PATH)) endl;return 0; }使用otherproc程序替换myproc程序并且只传入只含有一个环境变量的参数envp。 编译代码运行并查看结果: 由于execle函数传入环境变量采用的是覆盖式传入因此替换程序只有传入的一个环境变量。 补充: 可以使用全局变量environ让替换程序获取父进程的全部环境变量。shell进程创建子进程时也是调用这样的系统接口将环境变量传入。 execvpe函数 int execvpe(const char *file, char *const argv[], char *const envp[]);file参数 – 要替换的程序名会自动去环境变量的路径中查找该程序argv参数 – 接收要替换程序的命令行参数以NULL结尾envp参数 – 接收传给替换程序的环境变量以NULL结尾覆盖式传入接收的进程中只会有传入的环境变量 补充知识 程序替换函数的命名规律: l后缀 – 以可变参数形式接收替换程序的命令行参数v后缀 – 以指针数组的形式接收替换程序的命令行参数p后缀 – 传入替换程序的程序名会自动在环境变量的路径中查找e后缀 – 以指针数组的形式接收替换程序的环境变量 以上所有的进程程序替换系统调用都是对execve系统调用函数的封装不同的封装是为了更适合不同的应用场景。
http://www.pierceye.com/news/225920/

相关文章:

  • 怎样做网站静态什么网站做二维码比较好
  • 共享虚拟主机做网站够用么抖音短剧推广怎么做
  • 个人网站备案内容写什么西部数码网站管理助手v3.1
  • 搜索引擎 网站模板wordpress 图片走cdn
  • 常见cms网站源码下载重庆微信网站开发公司
  • 网站开发用什么电脑天津室内设计公司排名
  • 云南网站建设招商建设公司网站计入哪个科目
  • 网站备案在哪里查询海外市场推广方案
  • 中诺建设集团有限公司网站微信商家小程序收费吗
  • 沙井品牌网站建设南宁网站提升排名
  • 网站空间备案要多久数商云是外包吗
  • 网站设计公司需要什么资质网站建设所需服务器
  • 织梦cms仿网站教程怎么做网站板块
  • 建设厅网站更改登陆密码wordpress主题 水墨
  • 彩云小梦ai写作网站机关网站建设情况汇报
  • 合肥专业网站优化手机界面设计素材
  • 台州网站建设惠店王烨烨
  • 工程建设比选公告固价方式网站wordpress html5的关系
  • 广州市网站建设 乾图信息科技潍坊市建设监理协会网站
  • 网站建优化网页脚本设计
  • 手机能访问电脑上自己做的网站吗网页设计作品到哪个网站
  • 网站推广成功案例城乡住房建设部官网查询
  • 养殖类网站模板那个网站的公众后推广做的好
  • 网站开发属于什么类型软件建站之星如何建网站
  • 微信做淘宝优惠券但网站是怎么建设但深圳市深圳市住房和建设局网站
  • 后端网站开发免费域名 网站
  • 综合信息网站建设方案网页浏览器排行榜前十名
  • 北京网站开发建设 58同城网站建设改版公司
  • 如何做网站预览网站设计线框图
  • 电子商务的网站的建设内容珠海自适应网站