看完UNIX系统高级编程,获得的第一个信息:exec是一个函数集合,一共包含7个函数。看图
作用:当fork完之后,子进程执行的程序被完全替代成新程序,但是并没有创建新进程,只是替换了当前进程的数据段、正文段、堆段、栈段。打个比方就好像你穿越到另一个世界了,你还是你,灵魂(进程ID)没有变,但是身份、年龄(数据段、正文段、堆段、栈段)变了,要做的事情和之前也不一样。
七个函数的区别:
第一:参数的区别(第一个参数)
第二个区别:传递的方式
1、execl execlp execle 这个函数名中都带有“l”,要求将新程序的每个命令行函数都作为单独的函数传入,以空指针结尾。== const char *arg0==
2、execv、execve、execvp、fexecve/ 这四个则要求构造一个指向各个函数的指针数组,然后将指针数组的地址作为参数 char *const argv[]
第三个区别:环境表
execve、execle 、 fexecve 这三个第三个参数可以传递一个指向环境字符串的指针数组 *const envp[]
其他四个,则从environ变量为。
看个例子:
用exec执行ls命令,参数传-al 路径
#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<unistd.h>
int main (){
int status,pid;
pid = fork();
char *envp[5];
char *argv[3] = {"ls","-ll","/home/zero/c"};
/*
*
*,我们将第一个参数(新程序中的argv[0])设
置为路径名的文件名分量。某些shell将此参数设置为完全的路径名。这只是一个惯例我们可将
argv【0]设置为任何子符串当 login shell BT时就是这样做的在执行 shez之前,login
在argv[o]之前加一个/作为前级,这向shel指明它是作为登录she被调用的
*
*
* */
if(pid < 0){
exit;
}else if(pid == 0){
//ls命令打印/home/zero/c的文件
//execlp("ls","-ll","/home/zero/c",(char *)0);//传相对路径,新程序复制现有的环境
execvp("ls",argv);
//execl("/bin/ls","-ll","/home/zero/c",(char *)0);//传绝对路径,新程序复制现有的环境
//execle("/bin/ls","-ll","/home/zero/c",(char *)0,envp);//需要传递一个指向环境字符串的指针数组
//
// execve("/bin/ls",argv,envp);//绝对路径,参数为数组形式,环境也为数组形式
//execv("/bin/ls",argv);
}
wait(&status);
return 0;
}
相关视频:https://study.163.com/course/introduction/1209187856.htm