一、fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。
二、在Linux中使用exec函数族主要有以下两种情况
a. 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用任何exec 函数族让自己重生。
b. 如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后调用任何一个exec函数使子进程重生。
三、exec函数族原型
- int execl(const char *path, const char *arg, ...)
- int execv(const char *path, char *const argv[])
- int execle(const char *path, const char *arg, ..., char *const envp[])
- int execve(const char *path, char *const argv[], char *const envp[])
- int execlp(const char *file, const char *arg, ...)
- int execvp(const char *file, char *const argv[])
1、execl 执行文件
返 回 值:成功:函数不返回
失败:函数返回-1
#include <unistd.h>
int main()
{
execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,NULL);
return 0;
}
2、execlp 从path环境变量中查找文件执行
返 回 值:成功:函数不返回
失败:函数返回-1
#include <unistd.h>
int main()
{
execlp(“s”,”ls”,”-al”,”/etc/passwd”,(char *)0);
return 0;
}
3、execve 执行文件
函数的参数:filename代表的文件路径
argv利用数组指针传递给执行文件
envp传递给执行文件的新环境变量
返 回 值: 成功:函数不返回
失败:函数返回-1
#include <unistd.h>
int main()
{
char * argv[] = {“ls”,”-al”,”/etc/passwd”,NULL};
char * envp[] = {“PATH = /bin”,0};
execve(“/bin/ls”,argv,envp);
}
4、execvp 执行文件
返 回 值: 成功:函数不返回
失败:函数返回-1
#include <unistd.h>
int main()
{
char * argv[] = {“ls”,”-al”,”/etc/passwd”,0};
execvp(“ls”,argv);
}