1.exec函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。这样exrc之后的代码段则不会再继续执行。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。
2.如果还想继续执行exec之后的代码段功能,则我们就可以新建一个新的进程,让这个新的子进程,执行exec之后的代码段。
1.这些函数都属于exec函数族,后缀不同则参数不同
#include <unistd.h>
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[]);
l: list 列写出执行某个文件所需要的所有参数,并且以NULL结尾
例:
执行/home/mylinux/Documents/eeee
执行命令 eeee
execl("/home/mylinux/Documents/eeee", "eeee", NULL);
例:
ls -l /home/mylinux/ --》在/bin下
execl("/bin/ls", "ls", "-l", "/home/mylinux/", NULL);
v: vector(向量) 将执行文件所需要的在一个数组中进行传参。
例:
ls -l /home/mylinux/ --》在/bin下
char * argv[] = {"ls", "-l", "/home/mylinux/", NULL};
execv("/bin/ls", argv);
p : path(路径) 将会使用环境变量所保存的$PATH来查找指定的文件
例:
ls -l /home/mylinux/
execlp("ls", "ls", "-l", "/home/mylinux/", NULL);
execvp("ls", argv);
一般会应用到第三方软件
如:
int main()
{
.....
if (0 == fork())
{
exec() ;
}
.....
....
return 0;
}
例程
#include <unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <unistd.h>
int main()
{
if(execl("/mnt/mylinux/testexec","testexec","execl",NULL) == -1){
perror("execl error");
exit(1);
}
//程序已经跳转走,如果正常execl不反回错误,下面的代码不会执行!
printf("execl error!\n");
//execl("/bin/ls", "ls", "/home/mylinux/Documents", NULL);
//execl("/bin/cat", "cat", "eixt.c", NULL );
//execl("./exit", "./exit", NULL);
//char * argv[] = {"ls", "/home/mylinux/Documents", NULL};
//execv("/bin/ls", argv);
//execlp("ls", "ls", "/home/mylinux/Documents", NULL);
//char * argv[] = {"ls", "/home/mylinux/Documents", NULL};
//execvp("ls", argv);
return 0;
}