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。所以感觉上有很多的变种,其实就是一个函数。

 

posted @ 2017-03-23 17:05  AAAron  阅读(366)  评论(0编辑  收藏  举报