轻松理解execl系列函数

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

}

时间: 2024-10-09 18:26:55

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

轻松理解js的函数和构造函数的区别

如何轻松理解js的函数和构造函数的区别,这是个一直头大的问题,很多例子都没有清晰的描述清楚.. 在这里,我就用平常的道理来阐述一下,希望能理解清楚. 从这里开始入手吧 这是普通函数的定义和调用方式.看起来没什么特别的,但是往下看就有奇怪的东西了. 再做一个: 你没发先一个很奇怪的现象吗? 你的这个函数里面并没有返回什么,也就是没有return ,但是你调用的时候却可以接受啊. 如:var p=new Person('niexiaoqian'); alert(p.name); //niexiaoq

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

本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离.这样的好处是有更多的余地对两种操作进行管理. 当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行.当然,exec系列的函数也可以将当前进程替换掉. 例如:在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新

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

前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法也不一定完全对,主要是看个人如何理解,因为有的人说立即调用,有的人说自动执行,所以你完全可以按照你自己的理解来取一个名字,不过我听很多人都叫它为“自执行”,但作者后面说了很多,来说服大家称呼为“立即调用的函数表达式”. 本文英文原文地址:http://benalman.com/news/2010/11/immedia

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

介绍 本章节我们要着重介绍的是一个非常常见的ECMAScript对象——函数(function),我们将详细讲解一下各种类型的函数是如何影响上下文的变量对象以及每个函数的作用域链都包含什么,以及回答诸如像下面这样的问题:下面声明的函数有什么区别么?(如果有,区别是什么). 原文:http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/ var foo = function () { ... }; 平时的惯用方式: function fo

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

前言 网上还没用发现有人对命名函数表达式进去重复深入的讨论,正因为如此,网上出现了各种各样的误解,本文将从原理和实践两个方面来探讨JavaScript关于命名函数表达式的优缺点. 简单的说,命名函数表达式只有一个用户,那就是在Debug或者Profiler分析的时候来描述函数的名称,也可以使用函数名实现递归,但很快你就会发现其实是不切实际的.当然,如果你不关注调试,那就没什么可担心的了,否则,如果你想了解兼容性方面的东西的话,你还是应该继续往下看看. 我们先开始看看,什么叫函数表达式,然后再说一

深入理解C语言函数指针(转)

本文转自:http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html 示例1: void myFun(int x); //声明也可写成:void myFun( int ); int main() { myFun(100);//一般的函数调用 return 0; } void myFun(int x) { printf("myFun: %d\n",x); } 我们一开始只是从功能上或者说从数学意义上理解myFun

深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点(转)

才华横溢的Stoyan Stefanov,在他写的由O’Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会是件很美妙的事情.具体一点就是编写高质量JavaScript的一些要素,例如避免全局变量,使用单变量声明,在循环中预缓存length(长度),遵循代码阅读,以及更多. 此摘要也包括一些与代码不太相关的习惯,但对整体代码的创建息息相关,包括撰写API文档.执行同行评审以及运行JSLint.这些习惯和最佳做法可以

openssl之EVP系列之10---EVP_Sign系列函数介绍

---依据openssl doc/crypto/EVP_SignInit.pod翻译 (作者:DragonKing, Mail: [email protected] ,公布于:http://openssl.126.com 之openssl专业论坛,版本号:openssl-0.9.7) EVP_Sign系列函数使用的基础结构跟信息摘要算法使用的基础结构是一样的.并且,其前面的两个操作步骤初始化和数据操作(信息摘要)也跟信息摘要算法是一样的,唯一不一样的是最后一步操作.本系列函数做了签名的工作,而信

深入理解JavaScript系列 --汤姆大叔

深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 深入理解JavaScript系列(2):揭秘命名函数表达式 深入理解JavaScript系列(3):全面解析Module模式 深入理解JavaScript系列(4):立即调用的函数表达式 深入理解JavaScript系列(5):强大的原型和原型链 深入理解JavaScript系列(6