本节主要内容: 1.进程程序替换概念 2.exec函数簇

进程程序替换##

1.概念

进程程序替换是已经跑起来的进程,替换为执行其他程序的进程 1.将正在执行代码的进程当中的虚拟地址空间中的数据段和代码段替换为新的程序,当前在执行的进程就会执行替换后的程序代码 2.对堆、栈进程更新

2.为什么要有进程程序替换

1.守护进程:

父进程先启动,创建一个子进程,让子进程进程程序替换成为另一个程序,实现不同的一个功能,父子进程可以进行通信,进而完成:“当子进程异常退出的时候,父进程就会重新启动另一个子进程,避免了程序挂掉而半天难以重新启动”

2.shell命令行解释器,也是采用进程程序替换的原理

3.进程程序替换接口

进程程序替换不是一个接口,而是一堆接口,称之为exec函数簇

1.execl 函数.

int execl(const char* path, const char* arg, ...);

参数:

  • path:带路径的可执行程序,即希望 execl 函数替换的程序
  • arg: 给替换的可执行程序传递的参数,相当于在命令行当中给程序传递命令行参数
  • ... :可变参数列表
    • 规定:
      • 1.第一个传递的参数必须是可执行程序的名称
      • 2.如果后面还有要传递的参数,使用 , 隔开,依次隔开
      • 3.要以NULL结尾,告诉 execl 函数参数传递完毕

exec系列返回值:

  • 如果替换成功,则没有返回值(已经替换为别的程序了,返回值给别的程序合适吗)
  • 替换失败返回值小于0,继续执行后续代码

2.execlp函数

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

参数:

  • file:待替换的可执行程序名称

    • 需要注意的是,替换的这个可执行程序的必须是在PATH环境变量中可以找到的。待替换的可执行程序需要被操作系统找到,也可以直接传递带路径的可执行程序
  • arg: 给替换的可执行程序传递的参数,相当于在命令行当中给程序传递命令行参数

  • ... :可变参数列表

    • 规定:
      • 1.第一个传递的参数必须是可执行程序的名称
      • 2.如果后面还有要传递的参数,使用 , 隔开,依次隔开
      • 3.要以NULL结尾,告诉 execlp 函数参数传递完毕

如果exec函数当中带p, 则表示会搜索环境变量,并且第一个参数传递可执行程序得名称就可以了;不带p则表示不会搜索环境变量,所以要传递带路径的可执行程序

3.execle函数

int execle(const char* path, const char* arg, ..., char* const envp[] );

参数:

  • path:带路径的可执行程序
  • arg:可变参数列表给可执行程序传递的参数,以可执行程序名称开始,以NULL终止
  • envp:程序员自己组织环境变量,如果不传入,则认为当前替换之后的程序没有环境变量

带e不带e区别:如果不带,则不需要程序员自己组织环境变量,如果带有e则需要自己组织环境变量 函数中带 l 表示参数是可变参数列表形式

4.execv函数

int execv(const char* path, char* const argv[] );

参数:

  • path:带路径的可执行程序
  • argv:传递给可执行程序的参数;第一个是可执行程序得名称,最后以NULL结尾

带v与不带v区别:如果带v,则表示参数是以字符指针数组的形式传递给exec函数的,进而传递给带替换的可执行程序

5.execvp函数

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

参数:

  • file:可执行程序名字
  • argv:给可执行程序传递的参数

上述五个函数,execl,execlp,execle,execv,execvp都是库函数 execve函数是一个系统调用

execve函数

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

参数:

  • filename:可执行程序的名字;
  • argv:传递给可执行程序的参数
  • envp:程序员自己组织环境变量,如果不传入环境变量表示替换之后的程序没有环境变量

总结:

1.exec函数簇调用关系表

2.exec函数簇