exec函数族
查村man手册看到:
NAME
execl, execlp, execle, execv, execvp, execvpe - execute a file
SYNOPSIS
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);
The exec() family of functions replaces the current process image with a new process image.
用新进程代替现有的进程,和fork不同,fork是产生子进程,有不同pid,exec族则是有相同的pid去替换原来的进程。
要记住这六个函数之间的区别,就要搞清楚 “l” 、“v”、“p”、“e”代表的含义
引用:http://blog.csdn.net/wenchao126/article/details/7956168
“l”表示参数以列表的形式表示;
“v”表示参数以数组的形式表示;
“p”表示在PATH中搜索执行文件;
“e”表示可附加环境参数。
execlp、execvp这两个函数第一个形参是名为file表示可以只列出文件名就可以了,不用指出它的路径。
注意的地方有:
1、参数以NULL结尾;
2、exec函数族执行成功后不会返回,执行失败会返回 -1,错误代码存放在errno中
3、可能的几种错误有,找不到文件或路径,errno为ENOENT;数组argv或envp没有以NULL结尾,errno为EFAULT;没有对执行文件的执行权限,errno为EACCESS;
引用:http://www.cnblogs.com/blankqdb/archive/2012/08/23/2652386.html
exec函数族装入并运行程序path/file,
并将参数arg0(arg1, arg2, argv[], envp[])传递给子程序,出错返回-1.
在exec函数族中,后缀l、v、p、e指定函数将具有某种操作能力:
后缀 | 操作能力 |
l | 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志 |
v | 希望接收到一个以NULL结尾的字符串数组的指针 |
p | 是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件//我们在liunx下就是在env下查找 |
e | 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境 |
感觉最有用还是execve是最主要的函数,他们有细微的差别,在于传递值的不同方式。上面已经很清楚的展示了,那种传递值的方式。
引用http://blog.csdn.net/guoping16/article/details/6583383,上面说了,事实上liunx系统给我们调用的是execve函数,其他的都为库函数。
(1)int execl(const char *path, const char *arg, ...);
path 可执行文件的路径,arg该文件的选项,直到NULL为止。(l就是list把所有的参数列出来)
(2)int execv(const char *path, char *const argv[]);
path同上,agrv传递指针数组,该数组可以这样定义:char * agrv[] = {"ls","-al",NULL};就和上面的类似只不过值是内定好的,不是在外部获取的。
(3)int execlp(const char *file, const char *arg, ...);
有p说明在PATH下的可执行文件->file。不用写上路径,需要直接执行设置好环境变量的二进制文件的时候,我们可以用带p的比较方便,具体的例子是:("ls","ls","-al",NULL);和(1)一样是list出来的。
(4)int execle(const char *path, const char *arg,..., char * const envp[]);
execle("/bin/ls", "ls", "-a", NULL, NULL) 可以指定环境变量,不指定的话用NULL,使用当前环境变量。
写了这么多大概就有感觉,(exec)l 之类的函数,其实最后被转化成一个指针数组,在传给execve,环境变量
没有指定的话就是PATH。所以感觉上有很多的变种,其实就是一个函数。