博客
关于我
exec
阅读量:139 次
发布时间:2019-02-27

本文共 1557 字,大约阅读时间需要 5 分钟。

一、进程替换:

1.exec族函数的作用:

将fork()产生的子进程的.text和.data段替换成目标进程的.text和.data

”换核不换壳“
除了产生子进程,期间并没有新的进程产生

2.linux下进程产生机制:

1.编辑一个helloworld程序2.gcc -o main main.c 得到一个可执行文件main3.在我们的终端bash执行./main,实际上bash也是一个进程第3步发生了什么:1.首先系统进行fork(),产生了一个子进程,也就是子bash(实际上调用的是sys_vfork())此时子进程的3G的虚拟地址空间和父进程几乎完全一样,当然包括.data和.text父子进程执行同样的代码,只不过我们在编程时,用if else语句使他们执行不同的分支2.系统调用exec族中的某个函数,将子进程中.data和.text替换成main进程的.data和.text这下,子进程就有了新的代码和数据,不再是共享父进程的不过exec()前后的进程的ID不变所以我们可以发现期间并没有新的进程,是将子进程中的内容换成main的即可。

所以,进程替换,替换的是进程的.data和.text。

3.exec族函数的使用:

int execl(const char*path,const char *argv,...(char*)0);int execlp(const char*file,const char *argv,...(char*)0);int execle(const char *path, const char *argv, ..., char * const envp[]);  int execv(const char *path, char *const argv[]);  int execvp(const char *file, char *const argv[]);  l代表list参数列表       e代表environment环境变量     v代表vextor使用命令行参数数组argvpath:指的是可执行文件的路径+名称,路径可以是相对路径比如“/bin/ps”arg:传入的参数,如argv[0]可执行文件名,后面的是参数file:代表可执行文件的文件名(char*)0:实际上是一个哨兵,由于一些函数是可变参的,所以告诉编译器参数传递完了其余五个都是调用该函数完成的:int execve(const char *path, char *const argv[], char *const envp[])    (真正的系统调用)这些函数有一个特点:没有成功返回值,失败才会返回-1执行成功后不会返回,而且,exec 函数族下面的代码执行不到。调用失败了,它们才会返回 -1,失败后从原程序的调用点接着往下执行。

写一点伪代码:

1.if(pid == 0)  //子进程中{	execlp("ls","ls","-l","-a",NULL);}其中:argv[0]="ls",argv[1]="-l",argv[2]="-a",NULL是哨兵为,告诉编译器参数完毕argv是传递给第一个 ls 的参数2.if ( pid == 0 ){	execl("/bin/ls","ls","-a",NULL);}其中:第一个参数是可执行文件的路径+名称,第二个是可执行文件名,之后的参数是给可执行文件的参数,最后一个同样是哨兵位3.char *argv[]={"ls","-l","-a",NULL};if( pid == 0 ){	execv("/bin/ls",argv);}exec类函数既可以加载系统的进程,也可以加载我们用户的进程,写法一样的

转载地址:http://xmyd.baihongyu.com/

你可能感兴趣的文章
Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
查看>>
nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML.
查看>>
nestesd exception is java .lang.NoSuchMethodError:com.goolge.common.collect
查看>>
nestJS学习
查看>>
net core 环境部署的坑
查看>>
NET Framework安装失败的麻烦
查看>>
Net 应用程序如何在32位操作系统下申请超过2G的内存
查看>>
Net.Framework概述
查看>>
NET3.0+中使软件发出声音[整理篇]<转>
查看>>
net::err_aborted 错误码 404
查看>>
NetApp凭借领先的混合云数据与服务把握数字化转型机遇
查看>>
NetAssist网络调试工具使用指南 (附NetAssist工具包)
查看>>
Netbeans 8.1启动参数配置
查看>>
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>
NetBeans之JSP开发环境的搭建...
查看>>
NetBeans之改变难看的JSP脚本标签的背景色...
查看>>
netbeans生成的maven工程没有web.xml文件 如何新建
查看>>
netcat的端口转发功能的实现
查看>>
NetCore 上传,断点续传,可支持流上传
查看>>
Netcraft报告: let's encrypt和Comodo发布成千上万的网络钓鱼证书
查看>>