exec系统调用
可以理解exec就是替换了上下文,实际上没有进行系统的调用.

execve()函数是另外5个函数的基础.
六个函数实现的功能是一样的,
区别在于使用方法,下面是用法的区别:


下面进行分别的举例说明:
为了方便,只摘出其中的一部分.
目的是把子函数换成ls的功能.
再总结一下六个exec函数的特点:
1,名字中包含l,其参数个数不定.(暂且认为l就是long,长传入的参数长,是不定的.)
2,名字中包含v,其参数是用argv的数组列表传入.
3,名字中包含p,其说明自带有"path"路径,所以就不需要传入路径了,而是直接传入运行的文件明file.
4,名字中包含e,其说明可以指定环境变量envp.(可以指定运行的环境.)

//为了方便记忆,可以联想:
可以记成viper就是vip的人儿,然后
v代表v i粗略代表l p代表p e代表e
要注意名字中有上面字符,都代表什么意思...

// 下面是execl,名字中有l,所以就是传入的参数是不固定的.最后一个以NULL结尾.
// 名字中没有p,所以要传入路径名.
// 按照格式去套用,第一个参数就是运行程序的路径. "/bin/ls"
// 第二个参数是"ls" 第三个参数是 "-a"
// 最后没有要传输的了,就直接写NULL,表示结尾了.
execl("/bin/ls","ls","-a",NULL);
上面的第二个参数 ls和第三个参数 -a,其实可以组合在一起的.
execl("/bin/ls","ls -a",NULL);

下一个例子:
// 有v,所以说明传入的是一个argv字符数组,而不是字符.
// 没有p,所以要传入,路径名.
// 所以要先定义一个字符串的数组: char *arg[]={"ls","-a",NULL};
execv("/bin/ls",arg);

下一个例子:
// 名字中有l,说明传入的参数是不定数目的,没有v,所以传入的是字符.以NULL结尾.
// 有p,说明有路径了,只需要传入文件名.
execlp("ls","ls","-a",NULL);

下一个例子:
// 名字中有v,所以参数传入的是字符串的数组.
// 有p,所以只需要传入运行的程序名: ls即可.
// char *arg[]={"ls","-a",NULL};
execvp("ls",arg);

下一个例子:
// 名字中有l,说明传入的参数是不定长的.
// 名字中有e所以,可以指定运行环境.这里没有指令,所以用NULL
// 名字中没有p,所以,用目录名.
execle("/bin/ls","ls","-a",NULL,NULL);

下一个例子:
execve("/bin/ls",arg,NULL);
