exec函数作用
我们用fork创建一个进程时,进程会在fork中执行一个新的程序。当进程调用exec函数时,该进程会被完全替换为新程序。调用exec函数并不创建新进程,所以进程id并不会改变
exec函数说明
#include <unistd.h>` //exec函数族的头文件
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[]);
这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回;
如果调用出错则返回-1;
所以exec函数只有出错的返回值而没有成功的返回值;
execl函数
include <stdio.h>
int main(int argc,char *argv[])
{
int i;
for(i=0;i<argc;i++){
printf("argv[%d]:%s\n",i,argv[i]);
}
return 0;
}
先为execl编写一个测试函数
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("before execl\n");
if(execl("./test","aa","bb","cc",NULL)==-1){
perror("why:\n");
}
}
注意在测试前test是可执行文件
因为test文件在当前文件下,所以不需要加绝对路径
execlp函数
它与execl区别就是无需加文件路径,execlp会在环境变量中自动寻找
我们先查找下ls路径
发现是在bin路径下
用execl实现ls指令(加bin路径)
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("before execl\n");
if(execl("/bin/ls","ls",NULL)==-1){
perror("why:\n");
}
}
用execlp实现ls指令
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("before execl\n");
if(execlp("ls","ls",NULL)==-1){
perror("why:\n");
}
}
效果是完全一样的
execv函数
传参方式由列表改为数组
#include <stdio.h>
#include <unistd.h>
int main()
{
char *argv[]={"ls","-l",NULL};
execv("/bin/ls",argv);//和execl传参内容一模一样,只是改为数组方式
}
execvp函数
和execlp函数相同,无需加路径名可在环境变量自动寻找
#include <stdio.h>
#include <unistd.h>
int main()
{
char *argv[]={"ls","-l",NULL};
execvp("ls",argv);
}