exec并不是一个函数,它是一个函数族,用一个新的进程映像替代当前进程映像,指的是一组函数,包括了六个函数,下面就来说说家族里的兄弟姐妹:
1、execl()
既然是一个家族里的一员,名字的称呼有着相同性的同时,也有着区别,execl后缀的"l"就代表着"list"的含义,即参数列表。
头文件:#include <unistd.h>
原型:int execl(const *path,const char *arg,...)
功能:执行文件
描述:用于执行参数path字符串所代表的文件路径,接着的参数代表执行文件时传递过去的argv[0]、argv[1]等等,但是要注意必须最后一个参数由空指针结束。
返回值:成功,不会有返回值,执行失败返回-1,并将失败原因存放在errno中。
示例:
#include <unistd.h>
int main()
{
execl("/bin/ls","ls","-al","/root/Linux/1016",(char *) 0);
return 0;
}
调试结果:
总计 92
drwxr-xr-x 2 root root 4096 10-16 22:18 .
drwxr-xr-x 6 root root 4096 10-17 14:50 ..
-rwxr-xr-x 1 root root 6104 10-16 14:02 copy
-rw-r--r-- 1 root root 1057 10-16 15:00 copy.c
-rwxr-xr-x 1 root root 5179 10-16 22:18 count
-rw-r--r-- 1 root root 485 10-16 22:18 count.c
-rwxr-xr-x 1 root root 5408 10-16 10:55 exchange
-rw-r--r-- 1 root root 610 10-16 10:55 exchange.c
-rwxr-xr-x 1 root root 4777 10-16 16:23 exec
-rw-r--r-- 1 root root 113 10-16 16:23 exec.c
-rw-r--r-- 1 root root 13 10-16 11:40 ex.txt
-rwxr-xr-x 1 root root 5228 10-16 22:07 fork
-rw-r--r-- 1 root root 368 10-16 22:07 fork.c
-rw-r--r-- 1 root root 144 10-16 10:55 hello.txt
-rw-r--r-- 1 root root 14 10-16 11:43 msg.txt
-rwxr-xr-x 1 root root 5477 10-16 17:14 wait
-rw-r--r-- 1 root root 493 10-16 17:14 wait.c
2、execlp()
头文件:#include <unistd.h>
原型:int execlp(const char *file,const *argv...)
功能:从PATH环境变量中查找文件并执行
描述:用于从PATH环境变量所指向的目录中查找符合参数file的文件名,找到后便执行文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]...,最后一个参数必须用空指针作为结束。
返回值:成功,则不会返回;如果执行失败则直接返回-1,并将失败原因保存在errno中。
示例:
#include <unistd.h>
main()
{
execlp("ls","ls","-al","/root/Linux/1016",NULL);
}
调试结果:
总计 104
drwxr-xr-x 2 root root 4096 10-19 13:51 .
drwxr-xr-x 6 root root 4096 10-17 14:50 ..
-rwxr-xr-x 1 root root 6104 10-16 14:02 copy
-rw-r--r-- 1 root root 1057 10-16 15:00 copy.c
-rwxr-xr-x 1 root root 5179 10-16 22:18 count
-rw-r--r-- 1 root root 485 10-16 22:18 count.c
-rwxr-xr-x 1 root root 5408 10-16 10:55 exchange
-rw-r--r-- 1 root root 610 10-16 10:55 exchange.c
-rwxr-xr-x 1 root root 4777 10-16 16:23 exec
-rw-r--r-- 1 root root 113 10-16 16:23 exec.c
-rwxr-xr-x 1 root root 4772 10-19 13:51 execlp
-rw-r--r-- 1 root root 85 10-19 13:51 execlp.c
-rw-r--r-- 1 root root 13 10-16 11:40 ex.txt
-rwxr-xr-x 1 root root 5228 10-16 22:07 fork
-rw-r--r-- 1 root root 368 10-16 22:07 fork.c
-rw-r--r-- 1 root root 144 10-16 10:55 hello.txt
-rw-r--r-- 1 root root 14 10-16 11:43 msg.txt
-rwxr-xr-x 1 root root 5477 10-16 17:14 wait
-rw-r--r-- 1 root root 493 10-16 17:14 wait.c
3、execle
头文件:#include <unistd.h>
原型:int execle(const char *path,const char *argv,...,char char *const envp[])
功能:将环境变量传递给新的进程
描述:用来执行参数path字符串所代表的文件路径,并为新程序复制最后一个参数所指示的环境变量,接下来的参数代表执行该文件时传递过去的argv[0]、argv[1]...,最后一个参数必须使用空指针结束。
返回值:执行成功则不会返回;执行失败则直接返回-1,并将失败原因存放在errno中
4、execv
头文件:#include <unistd.h>
原型:int execv(const char *pathname,char *const argv[])
功能:装入并运行其他程序
描述:会停止执行当前的程序,并且以pathname字符串所值的应用程序来替代被停止执行的进程,而且进程ID不会改变,pathname是被执行的应用程序,argv传递给应用程序的参数列表,参数列表的第一个参数应该是应该是应用程序名字本身,并且最后一个参数应该为NULL
返回值:成功,不会返回;失败时返回-1,错误原因保存在errno中,也可以通过stderr得到具体的错误描述字符串
5、execvp
头文件:#include <unistd.h>
原型:int execvp(const char *file,char *const argv[])
功能:调用另一个程序
描述:从PATH环境变量所指的目录中查找符合参数File的文件名,找到后便执行该文件,然后将第二个参数argv传递给该欲执行的文件。
返回值:成功则不会返回,执行失败则直接返回-1,失败原因并保存在errno中
6、execve
头文件:#include <unistd.h>
原型:int execve(const char *filename,char *const argv[],char *const envp[])
功能:执行文件
描述:执行参数filename字符串所代表的文件路径,第二个参数利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组
返回值:成功则不会返回,执行失败则返回-1,并将失败的原因保存在errno中