原文链接:https://blog.csdn.net/u014530704/article/details/73848573
exec族函数函数的作用:
我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。

exec族函数定义:
  可以通过这个网站查询:linux函数查询
功能:
  在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。
函数族:
  exec函数族分别是:execl, execlp, execle, execv, execvp, execvpe
函数原型:

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

返回值:
  exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。
参数说明:
path:可执行文件的路径名字
arg:可执行程序所带的参数,第一个参数为可执行文件名字,没有带路径且arg必须以NULL结束
file:如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,在它所指定的各目录中搜寻可执行文件。

exec族函数参数极难记忆和分辨,函数名中的字符会给我们一些帮助:
l : 使用参数列表
p:使用文件名,并从PATH环境进行寻找可执行文件
v:应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。
e:多了envp[]数组,使用新的环境变量代替调用进程的环境变量

下面将exac函数归为带l、带p、带v、带e 四类来说明参数特点。

一、带l的一类exac函数(l表示list),包括execl、execlp、execle,要求将新程序的每个命令行参数都说明为 一个单独的参数。这种参数表以空指针结尾。
以execl函数为例子来说明:

//文件execl.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//函数原型:int execl(const char *path, const char *arg, ...);int main(void)
{printf("before execl\n");if(execl("./bin/echoarg","echoarg","abc",NULL) == -1){printf("execl failed!\n");      }printf("after execl\n");return 0;
}
//文件echoarg.c
#include <stdio.h>int main(int argc,char *argv[])
{int i = 0;for(i = 0; i < argc; i++){printf("argv[%d]: %s\n",i,argv[i]); }return 0;
}

实验结果:

ubuntu:~/test/exec_test$ ./execl
before execl****
argv[0]: echoarg
argv[1]: abc

实验说明:
我们先用gcc编译echoarg.c,生成可执行文件echoarg并放在当前路径bin目录下。文件echoarg的作用是打印命令行参数。然后再编译execl.c并执行execl可执行文件。用execl 找到并执行echoarg,将当前进程main替换掉,所以”after execl” 没有在终端被打印出来。

二、带p的一类exac函数,包括execlp、execvp、execvpe,如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,在它所指定的各目录中搜寻可执行文件。举个例子,PATH=/bin:/usr/bin

//文件execl_no_path.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//函数原型:int execl(const char *path, const char *arg, ...);
int main(void)
{printf("before execl****\n");if(execl("ps","ps","-l",NULL) == -1){printf("execl failed!\n");}   printf("after execl*****\n");return 0;
}

实验结果:

ubuntu:~/test/exec_test$ gcc execl_no_path.c -o execl_no_path
ubuntu:~/test/exec_test$ ./execl_no_path
before execl****
execl failed!
after execl*****

上面这个例子因为参数没有带路径,所以execl找不到可执行文件。
下面再看一个例子对比一下:

//文件execlp.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//函数原型:int execlp(const char *file, const char *arg, ...);
int main(void)
{printf("before execlp****\n");if(execlp("ps","ps","-l",NULL) == -1){printf("execlp failed!\n");}printf("after execlp*****\n");return 0;
}

实验结果:

ubuntu:~/test/exec_test$ gcc execlp.c -o execlp
ubuntu:~/test/exec_test$ ./execlp
before execlp****
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 R  1048 35976 74920  0  80   0 -  2860 -      pts/4    00:00:00 ps
0 S  1048 74920 74916  0  80   0 -  7579 wait   pts/4    00:00:00 bash

从上面的实验结果可以看出,上面的exaclp函数带p,所以能通过环境变量PATH查找到可执行文件ps

三、带v不带l的一类exac函数,包括execv、execvp、execve,应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。
如char *arg[]这种形式,且arg最后一个元素必须是NULL,例如char *arg[] = {“ls”,”-l”,NULL};
下面以execvp函数为例说明:

//文件execvp.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//函数原型:int execvp(const char *file, char *const argv[]);int main(void)
{printf("before execlp****\n");char *argv[] = {"ps","-l",NULL};if(execvp("ps",argv) == -1) {printf("execvp failed!\n");     }printf("after execlp*****\n");return 0;
}

实验结果:

ubuntu:~/test/exec_test$ gcc execvp.c -o execvp
ubuntu:~/test/exec_test$ ./execvp
before execlp****
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 R  1048 63491 74920  0  80   0 -  2860 -      pts/4    00:00:00 ps
0 S  1048 74920 74916  0  80   0 -  7579 wait   pts/4    00:00:00 bash

四、带e的一类exac函数,包括execle、execvpe,可以传递一个指向环境字符串指针数组的指针。 参数例如char *env_init[] = {“AA=aa”,”BB=bb”,NULL}; 带e表示该函数取envp[]数组,而不使用当前环境。
下面以execle函数为例:

//文件execle.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//函数原型:int execle(const char *path, const char *arg,..., char * const envp[]);char *env_init[] = {"AA=aa","BB=bb",NULL};
int main(void)
{printf("before execle****\n");if(execle("./bin/echoenv","echoenv",NULL,env_init) == -1){printf("execle failed!\n");}       printf("after execle*****\n");return 0;
}
//文件echoenv.c
#include <stdio.h>
#include <unistd.h>
extern char** environ;
int main(int argc , char *argv[])
{int i;char **ptr;for(ptr = environ;*ptr != 0; ptr++)printf("%s\n",*ptr);return 0;
}

实验结果:

ubuntu:~/test/exec_test$ gcc execle.c -o execle
ubuntu:~/test/exec_test$ ./execle
before execle****
AA=aa
BB=bb

我们先写一个显示全部环境表的程序,命名为echoenv.c,然后编译成可执行文件放到./bin目录下。然后再运行可执行文件execle,发现我们设置的环境变量确实有传进来。

linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)相关推荐

  1. 10.linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)

    1.exec族函数函数的作用: 1.exec族函数的作用: 我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序.当进程调用exec函数时,该进程被完全替换为新程序.因为 ...

  2. Linux进程—exec族函数 execl, execlp, execle, execv, execvp

    exec族函数的作用: 我们用fork函数创建新进程后,经常会在新进程中调用exec族函数去执行新的程序:当该进程调用exec族函数时,该进程被替代为新程序,因为exec族函数并不创建新进程,所以前后 ...

  3. Linux 进程11【exec族函数(execl, execlp, execle, execv, execvp, execvpe)】

    linux进程-exec族函数(execl, execlp, execle, execv, execvp, execvpe) 原文链接:https://blog.csdn.net/u014530704 ...

  4. Linux进程5:exec族函数(execl, execlp, execle, execv, execvp, execvpe)总结及exec配合fork使用

    exec族函数(execl, execlp, execle, execv, execvp, execvpe)及exec配合fork使用 exec族函数函数的作用: 我们用fork函数创建新进程后,经常 ...

  5. exec族函数————execl, execlp, execle, execv, execvp, execvpe

    exec族函数 exec族函数的作用[^1] exec族函数的定义 函数原型: exac函数归为带l.带p.带v.带e 四类来说明参数特点 一.带l的一类exac函数(l表示list),包括execl ...

  6. exec族函数(execl, execlp, execle, execv, execvp, execvpe)

    1.exec族函数的作用:我们用fork函数创建新进程后,经常会在新进程调用exec函数去执行另外一个程序. 当进程调用exec函数时,该进程被完全替换为新程序,因为调用exec函数并不创建新进程,所 ...

  7. 10--linux进程---exec族函数(execl, execlp, execle, execv, ex ecvp, execvpe)

    原文链接: https://blog.csdn.net/u014530704/article/details/73848573?ops_request_misc=%257B%2522request%2 ...

  8. linux进程---exec族函数(execl, execlp, execv, execvp, )解释和配合fork的使用

    exec族函数函数的作用:         exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件.这里的可执行文件既可以是二 ...

  9. 学习笔记——exec族函数详解(execl, execlp, execle, execv, execvp, execvpe )

    exec族函数的定义 定义 exec函数族提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段.代码段和堆栈段,在执行完之后,原调用 ...

最新文章

  1. 从Matrix到这个idea
  2. GSM-串口和GPRS-网口通信
  3. memcpy后数据不对_详解Redis 的 5 种基本数据结构:
  4. [笔记][mooc]《程序设计入门—C语言》
  5. Android之shape属性详解
  6. Swift 3.0 (二)
  7. oracle pl sql case,oracle plsql case when_end case小记
  8. hadoop相关问题
  9. c++的.o文件的链接顺序
  10. delphi mysql 端口_delphi连接mysql
  11. 按键精灵 android,按键精灵手机版
  12. error while trying to retrieving text
  13. hdu 5064 Find Sequence
  14. synchronizedReentrantLock乐观锁悲观锁(Java线程安全实现)JVM9
  15. 5iABCDS原来是这样赋能 “严肃游戏”的!
  16. DeepStream系列之yolov6部署测试
  17. 通达OA 办公系统(Office Anywhere)动态密码配置使用详解
  18. debian怎么安装oracle数据库,Debian上安装Oracle客户端
  19. 梦想CAD控件自定义实体实现
  20. C++复数的具体实现

热门文章

  1. 【社工档案】骗了我兄弟二十万的王八蛋,终于被我们亲手扭送到了法律的殿堂
  2. 美国诚实签经验——医院预约单和医院资料,孕中保险是加分项
  3. eeprom与Eprom
  4. 抓大放小,把握项目管理中的关键行动
  5. 开源项目管理软件与服务推荐
  6. raise Exception(“Install ‘email_validator‘ for email validation support.“)Exception: Install ‘emai
  7. hive把字符串转换为时间_Hive数据类型转换
  8. 计算机游戏设计师要学什么软件,游戏设计需要学什么技术和软件
  9. java 简单计算器
  10. 猿人学js混淆-源码乱码解法总结