1.替换原理
2. 替换函数
函数解释
1. 这些函数如果调用成功则加载新的程序从启动代码开始执行 , 不再返回。2. 如果调用出错则返回 -13. 所以 exec 函数只有出错的返回值而没有成功的返回值。
命名理解
l(list) : 表示参数采用列表v(vector) : 参数用数组p(path) : 有 p 自动搜索环境变量 PATHe(env) : 表示自己维护环境变量
execl接口
函数原型如下:
int execl(const char* pathname, const char* arg, ... /* (char *) NULL */);
其接收两个固定的参数pathname和arg,以及一个可变参数...
pathname:用于指定替换的进程的路径
arg:以何种方式运行进程
...:以何种方式运行该进程
另外的,函数声明中还有一小段备注/* (char *) NULL */,其意图告诉使用者:使用可变参数...时,必须以NULL空指针来结尾。例如:
我们在当前目录下有一个process.c文件
以及test1.c文件来测试execl函数,并将其运行起来看看
可以看到,在execl start之后,发送进程替换,把process.exe替换到当前进程后,输出了五条I am process!,但是最后一句execl over!消失了。
这是因为,进程替换不是简单的执行别的进程的代码,而是用别的进程的代码区覆盖掉自己原先的代码区,所以execl 一旦执行,整个进程的代码都被替换了,那么printf("execl over\n");就会被覆盖掉,最后不输出。
当然我们也可以替换在shell
中执行的指令,因为这些指令的运行也是进程。例如,
execlp接口
函数原型如下:
int execlp(const char* file, const char* arg, ... /* (char *) NULL */);
file
:用于指定替换的进程名称arg
:以何种方式运行进程...
:运行该进程的选项- 最后以
NULL
结尾
与刚刚的execl
不同的是,第一个参数从pathname
路径,变成了file
文件名。该接口的意思是:不用指明路径,只需指明替换的进程的名称,然后会自动去环境变量PATH
指定的路径中查找,或者会自动在当前目录下查找。例如要执行ls -a -l
,但是我们用了execlp
接口,ls
是系统自带的指令,所以不用指明路径,系统会自己去查找。
execle接口
函数原型:
int execle(const char *pathname, const char *arg, ... /*, (char *) NULL, char *const envp[] */);
pathname
:用于指定替换的进程的路径arg
:以何种方式运行进程...
:以何种形式执行进程NULL
- char* const envp[] :指针数组,存储环境变量。一般来说,进程替换后,进程的环境变量是会用原先的环境变量的。
例如,
execv接口
函数原型如下:
int execv(const char *pathname, char *const argv[]);
相比于execl
,其少了一个...
的可变参数,改为了一个argv
数组,而...
就是用来指定以何种方式调用进程,或者说指定选项的,带有v
系列的接口,将这些选项存储在一个数组中,然后把数组传入,不过注意该数组最后一个元素也要放NULL空指针。
execvp,execvpe同理不用指明路径,execvpe需要带环境变量。