execl函数功能如下:启动一个可执行文件,并且对他进行传送参数。一些原型如下

  1. #include <unistd.h>
  2. extern char **environ;
  3. int execl(const char *path, const char *arg, ...);
  4. int execlp(const char *file, const char *arg, ...);
  5. int  execle(const  char  *path,  const  char  *arg  , ..., char * const  envp[]);
  6. int execv(const char *path, char *const argv[]);
  7. int execvp(const char *file, char *const argv[]);

一开始我们会被他的种类繁多所迷惑,我到底该用哪个?每个的具体意义是什么?这里我将以宏观的角度想让大家有个意识上的认识:

假设我们要启动一个程序,那么不可避免的要给他传递一个函数。

我们需要的是,如何指定一个程序的位置,如果传递参数给他。

对于程序位置的指定,理想状态有两种情况,

1、绝对路径传递。

2、在环境变量里搜索,比如环境变量path=c:/bin;d:/bin,我们只需提供程序的名字,他就可自动到这些路径下搜索

OK,根据以上两条,你就可以判断exec后缀p的区别了,凡是以p结尾的,都是在环境变量(PATH)里搜索

那么在参数方面,我们希望可以一个个指定,比如 "a","b","c",在表示结束时用个NULL;

当然最终这些都要转变为一个字符指针数组形式,以上变成 char *arg[]={"a","b","c",

NULL},否则函数的参数的长度对系统来说就不好确定了,比如一些压栈上的空间确定等等。

OK,根据这条,我们可以确定后缀为"l"的表示list arg,后缀为v的表示字符指针数组。

不管list arg输入如何,最后都要被转变为v的形式,所以他们之间的图可以表示如下

  1. execlp          execl           execle
  2. 构造argv          构造argv              构造argv
  3. execvp 试每一个path前缀->execv 使用environ->  execve(系统调用)

还有个是后缀为e的,表示使用用户自己指定的的环境变量。

首先列下所有语法格式:

  execl, execlp, execle, execv, execvp – execute a file

  SYNOPSIS

  #include

  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[ ]);

 1. execve(执行文件)

  在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序。exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。

  表头文件:

  #include

  定义函数:

  int execve(const char * filename,char * const argv[ ],char * const envp[ ]);

  函数说明:

  execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。

  返回值:

  如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

范例:

  #include

  main()

  {

  char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char *)0};

  char * envp[ ]={“PATH=/bin”,0}

  execve(“/bin/ls”,argv,envp);

  }

  执行:

  -rw-r–r– 1 root root 705 Sep 3 13 :52 /etc/passwd

2. execlp(从PATH 环境变量中查找文件并执行)

  相关函数:

  fork,execl,execle,execv,execve,execvp

  表头文件:

  #include

  定义函数:

  int execlp(const char * file,const char * arg,……);

  函数说明:

  execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。

  返回值:

  如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

范例:

  

  #include

  main()

  {

  execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);

  }

3. execvp(执行文件)

  相关函数:

  fork,execl,execle,execlp,execv,execve

  表头文件:

  #include

  定义函数:

  int execvp(const char *file ,char * const argv []);

  函数说明:

  execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。

  返回值:

  如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

范例:

  char * argv[ ] ={ “ls”,”-al”,”/etc/passwd”,0};

  execvp(“ls”,argv);

4. execle (执行文件)

相关函数:fork, execl, execlp, execv, execve, execvp

表头文件:#include

函数定义:int execle(const char *path, const char *arg, … , const char *envp[ ]);

函数说明:execle()用来执行参数path字符串所代表的文件路径, 然后将第二个以后的参数当作该文件的argv[0], argv[1]… 最后一个参数必须指向一新的环境变量数组, 此新的环境变量数组即成为新执行进程的环境变量

返回值 :成功则不会返回, 失败则返回-1, 失败原因存于errno中

错误代码:参execve()

范例:

#include

main(int argc, char *argv[], char *env[])

{

execle(“/bin/ls”, “ls”, “-al”, “/etc/passwd”, 0, env);

}

轻松理解execl系列函数的更多相关文章

  1. 深入理解javascript系列(4):立即调用的函数表达式

    本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...

  2. [JS]深入理解JavaScript系列(4):立即调用的函数表达式

    转自:汤姆大叔的博客 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行.在详细了解这个之前,我们来谈了解一下"自执行"这个叫法 ...

  3. linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用

    本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...

  4. exec系列函数(execl,execlp,execle,execv,execvp)使用

    本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...

  5. 深入理解JavaScript系列(15):函数(Functions)

    介绍 本章节我们要着重介绍的是一个非常常见的ECMAScript对象——函数(function),我们将详细讲解一下各种类型的函数是如何影响上下文的变量对象以及每个函数的作用域链都包含什么,以及回答诸 ...

  6. 深入理解JavaScript系列(2):揭秘命名函数表达式

    前言 网上还没用发现有人对命名函数表达式进去重复深入的讨论,正因为如此,网上出现了各种各样的误解,本文将从原理和实践两个方面来探讨JavaScript关于命名函数表达式的优缺点. 简单的说,命名函数表 ...

  7. 看图轻松理解数据结构与算法系列(NoSQL存储-LSM树) - 全文

    <看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的样子. 关于LSM树 ...

  8. openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)

    openssl之EVP系列之5---EVP_Encrypt系列函数详细解释(二)    ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.t ...

  9. fork()和vfork()的区别,signal函数用法,exec()系列函数的用法小结

    一:fork()和vfork()的区别:    fork()函数可以创建子进程,有两个返回值,即调用一次返回两个值,一个是父进程调用fork()后的返回值,该返回值是刚刚创建的子进程的ID;另一个是子 ...

随机推荐

  1. C++:线程(std::thread)

    1.创建一个线程 创建线程比较简单,使用std的thread实例化一个线程对象就创建完成了,示例: #include <iostream> #include <thread> ...

  2. iOS系统版本与机型的对应关系

    1.手机系统版本:10.3 NSString* phoneVersion = [[UIDevice currentDevice] systemVersion]; 2.手机类型:iPhone 6 NSS ...

  3. adb命令(笔记)

    1.adb shell su   进入root管理员权限(前提是手机已root) 2.chmod 可以修改文件夹的权限: $ adb shell $ su # chmod -R 777  /data/ ...

  4. RTU命令设置笔记

    YN+12VCTL=1 配置+12V输出控制模式:永久输出YN+5VCTL=1 配置+5V输出控制模式:永久输出 YN+GETDATA 读取采样值 YN++LIST 获取设置参数列表 YN+LOAD ...

  5. ADB命令行工具使用

    Putty工具连接Android设备 下载链接:https://github.com/sztupy/adbputty/downloads 如上图所示:在HostName中输入transport-usb ...

  6. WebGL编程指南案例解析之平移和旋转的math库实现

    这里说的math库实现,指的是,通过一般的加减乘除(角度计算)来更新坐标值. 因为涉及到坐标的变化,所以这里都是基于对顶点着色器的修改 平移: var vShader = ` attribute ve ...

  7. 如何控制jquery ui弹窗下方按钮水平居中

    1.问题背景 一般情况下,jquery ui弹窗下方的按钮是居右的,但是有时系统为了达到美观统一,需要将按钮放在中间 2.问题原因 <!DOCTYPE html> <html> ...

  8. Maven项目中的配置

    1 在配置好Maven项目后,新建一个Maven Project.如图 点击next,会进入如下界面: 选择webapp,不选择默认的quickstart,之后会进入以下界面 填好Group ID 和 ...

  9. LAMP环境安装实例

  10. POJ 3253 Fence Repair STL 优先队列

    这题做完后觉得很水,主要的想法就是逆过程思考,原题是截断,可以想成是拼装,一共有n根木棍,最后要拼成一根完整的,每两根小的拼成一根大的,拼成后的木棍长度就是费用,要求费用最少.显然的是一共会拼接n-1 ...