(一)exec函数族
通过调用exec函数族实现让父子进程执行不同的程序,父进程不会受影响。
exec函数族,就是以exec为开头的函数,比如execl函数、execlp函数等,所以称它为exec函数族。
l(list) :命令行参数列表
p(path) :搜索file时的使用的path变量
v(vector矢量,载体):使用命令行参数数组
e(environment) :使用环境变量数组
注:
(1)在exec函数族中,一般fork创建子进程后,执行的是和父进程相同的程序,只是父子进程执行了不同的代码分支而已。子进程往往通过调用任意一个exec函数来执行另外一个程序,当子进程调用一种exec函数时,该子进程的用户空间代码和数据完全被新程序替换,并从新程序开始执行。但是调用的exec程序并不会创建新进程,所以调用exec前后该进程的ID并未改变。
(2)exec函数族只是用磁盘上的一个新程序替换了当前进程的正文段、数据段、堆栈和栈段。
(二)execl/execlp
int execl(const char *path, const char *arg, ...,**NULL**);
eg:
execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *) 0);//NULL
(1)execl()中的后缀"l"代表list,也就是参数列表的意思。
第一参数path字符指针所指向要执行的文件路径(绝对路径), 接下来的参数代表执行该文件时传递的参数列表:argv[0],argv[1]… ,最后一个参数须用空指针NULL作结束。
int execlp(const char * file,const char * arg,……, NULL);
eg:
execlp(“ls”, ”ls”,”-al”, ”/etc/passwd”, (char *)0);//NULL
(1)execlp()函数:会从PATH 环境变量所指的目录中,查找符合参数file的文件名, 并执行该文件。然后将第二个以后的参数当做该文件的传参argv[0]、argv[1]……, 最后一个参数必须用空指针(NULL)作结束。
(2)返回值: 如果执行成功则函数不会返回,执行指定的程序,
执行失败则直接返回-1, 失败原因存于errno 中。
(三)execv/execvp
int execv(const char *pathname, char * const argv[]);
注:
(1)成功执行指定的程序,失败返回EOF
(2)argv封装成指针数组的形式
eg:
·char * argv[ ] = {"ls", " -a", "-l", "/etc", NULL};
if (execv("/bin/ls", argv) == -1)
{
perror(“execv fail”);
}
int execvp(const char *file ,char * const argv []);
eg:
char * argv[ ] ={ “ls”, ”-al”, ” /etc/passwd”, NULL};
execvp(“ls”,argv);
(四) system
int system(char *command);
功 能:可以不替换,执行后面的程序。
实 质:fork了一个子进程去执行封装的exec函数
当前进程等待command执行结束后才继续执行