进程替换

        使用fork函数或vfork函数创建子进程后,子进程通常会调用exec函数来执行另外一个程序。系统调用exec用于执行一个可执行程序以代替当前进程的执行镜像。进程的映像是指内核在内存中如何存放可执行程序文件,在将程序转化为进程的过程中,操作系统将可执行程序由硬盘复制到内存中。
        调用exec函数并没有生成新进程,一个进程一旦调用exec 函数,它本身就“死亡”了。就好比鬼上身了一样,身体还是你的,但灵魂和思想已经被替换了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,惟一保留的就是进程ID,也就是说,对系统而言,还是同一个进程,不过执行的已经是另外一个程序了。
  
     Linux下,exec 函数族有以下6种不同的调用的形式:

#include <unistd.h>
int execv( const char *pathname, char *const argv[] );
int execve( const char *pathname, char *const argv[], char *const envp[] );
int execl( const char *pathname, char *const arg0, ... /* (char *)0 */ );
int execle( const char *pathname, const char *arg0, ... /* (char *)0, char *const envp[] */ );
int exevp(const char *filename,char *const argv[]);
int execlp( const char *filename, char *const arg0, ... /* (char *)0 */ );
返回值:若出错则返回-1,若成功不返回。

        这些函数之间的第一个区别是前4个取路径名作为参数,后两个则取文件名作为参数。当指定filename作为参数时,如果filename中包含“/”,则将其视为路径名,否则函数就到PATH环境变量定义的目录中寻找可执行文件。
       第二个区别与参数表的传递有关(I表示list, v表示矢量vector),函数execl、execlp和execle要求将新程序的每个命令行参数都说明为一个单独的参数,这种参数表以空指针结尾。对于另外三个函数(execv、 execvp和execve), 则应先构造一个指向各参数的指针数组,然后将该数组地址作为这三个函数的参数。
        第三个区别与向新程序传递环境表相关,以e结尾的两个函数(execle和execve) 可以传递一个指向环境字符串指针数组的指针。其他四个函数则使用调用进程中的环境变量为新程序复制现有的环境。
        实际上无论是哪个exec函数,都是将可执行程序的路径、命令行参数和环境变量3个参数传递给可执行程序的main函数,下面分别介绍了各exec函数是如何将main函数需要的参数传递给它的。
    (1)execv函数:execv函数通过路径名方式调用可执行文件作为新的进程映像,它的argv参数用来提供给main函数的argv参数,argv 参数是一个以NULL结尾(最后一个元素必须是一个空指针)的字符串数组。
    (2)execve函数:在该系统调用中, 参数pathname 是将要执行的程序的路径名, 参数argv、envp与main函数的argv、envp 对应。
        注意:参数argv和参数envp的大小都是受限制的,Linux操作系统通过宏ARG_MAX来限制它们的大小,如果它们的容量之和超过ARG_ MAX定义的值将会发生错误,这个宏定义在<linux/imits.h>头文件中。
    (3)execl函数:该函数与execv函数用法类似,只是在传递argv参数的时候,每个命令行参数都声明为一个单独的参数(参数中使用“.... ”说明参数的个数是不确定的),要注意的是这些参数要以一个空指针作为结束。
    (4)execle函数:该函数与execl函数用法类似,显式地指定环境变量,环境变量位于命令行参数最后一个参数的后面,也就是位于空指针之后。
    (5)execvp函数:该函数和execv函数用法类似,不同的是参数filenamne,该参数如果包含“/”,就相当于路径名,如果不包含“/”,函数就到PATH环境变量定义的目录中寻找可执行文件。
    (6)execlp 函数:该函数类似于execl函数,它们的区别和execvp与execle的区别一-样。

      exec函数族的6个函数中只有execve是系统调用,其它5个都是库函数,它们在实现时都调用了execve,下面是这六个函数之间的关系

 

       执行新程序后的进程除了保持了原来的进程ID、父进程ID、实际用户ID和实际组ID之外,进程还保持了许多原有特征,主要有以下几点:
    (1) 当前工作目录。
    (2)根目录。
    (3)创建文件时使用的屏蔽字。
    (4)进程信号屏蔽字。
    (5)未决警告。
    (6)和进程相关的使用处理器的时间。
    (7)控制终端。
    (8)文件锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值