1、课程目标
- exec(熟练)
- system(熟练)
- 小结
2、进程-exec函数族
-
exec是一个函数族,包括6个函数。
exec族作用 -
进程可以调用exec函数族执行某个程序
-
进程当前内容被指定的程序替换
-
实现让父子进程执行不同的程序(父进程创建子进程子进程,调用exec函数族,父进程不受影响继续执行当前程序)
-
其中在终端中就使用了exec,shell创建子进程执行某个程序,进行运行。
3、进程-execl/execlp
#include<unistd.h>
int execl(const char *path,const char *arg,...);
int execlp(const char *file,const char *arg,...);
- execl和execlp函数:执行一个指定的程序。
- execl参数1执行程序的名称(包含路径),可以是绝对路径或者相对路径。
- execlp参数1执行程序的名称(不包含路径),程序会从PATH环境变量路径中查找
- execl和execlp参数2和后面可变参数是传入参数1程序的参数,其中参数2为参数1的程序名称,最后一个参数必须是空指针NULL。
- int返回值:执行其他程序成功了则函数的返回值等都没有了,被调用的程序替换了,若失败了返回EOF(-1),需要对函数返回值进异常处理。
4、进程-execl/execlp-示例
/* 利用execl调用ls命令,查看/etc目录下文件详细信息 */
if(execl("/bin/ls","ls","-a","-l","/etc",NULL) < 0)
{
perror("execl");
}
/* 利用execlp调用ls命令,查看/etc目录下文件详细信息 */
if(execlp("ls","ls","-a","-l","/etc",NULL) < 0)
{
perror("execlp");
}
5、进程-execv/execvp
#include<unistd.h>
int execv(const char *path, char *const argv[]);
int execvp(const char *file,char *const argv[]);
- execv/execvp和execl/execlp相比参数变少了,将后面的多个参数以数组参数形式传入。
- 函数执行成功执行指定的程序,失败的时候返回EOF
- arg…封装成指针数组的形式
6、进程-execv/execvp-示例
/* 利用execv/调用ls命令,查看/etc目录下文件详细信息 */
char *arg[] = {"ls","-a","-l","/etc",NULL}
if(execv("/bin/ls",arg) < 0)
{
perror("execv");
}
/* 利用execvp/调用ls命令,查看/etc目录下文件详细信息 */
char *arg[] = {"ls","-a","-l","/etc",NULL}
if(execvp("ls",arg) < 0)
{
perror("execvp");
}
7、进程-system
#include<stdlib.h>
int system(const char *command);
- system函数的入口参数,为字符的命令
- 执行某个命令成功,返回命令的返回值;失败返回EOF
- 当前进程使用system时等待command命令执行结束后才会继续执行。
- system使用方式不用像execv/execvp/execl/execlp函数创建子进程。然后子进程执行命令程序。
8、进程小结
- execl/execlp的使用
- execv/execvp的使用
- system的使用
- 以上函数的区别。