Exec函数族(进程替换)-Linux

Exec函数族定义:

exec函数族提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。

系统中每个进程都由fork+exec构成

exec分类:

  1. int execl(const char *path,const char* arg,...)
  2. int execlp(const char *file, const char *arg, ...)
  3. int execle(const char *path, const char *arg, ..., char *const envp[])
  4. int execv(const char *path,char *const argv[])
  5. int execvp(const char *file, char *const argv[])
  6. int execve(const char *path, char *const argv[], char *const envp[])

1、2、3点为一组,4、5、6点为一组,这两组函数的不同在于exec后的第一个字符,第一组是l,在此称,为execl系列;第二组是v,在此称为execv系列。这里的l是list(列表)的意思,表示execl系列函数需要将每个命令行参数作为函数的参数进行传递;而v是vector(矢量)的意思,表示execv系列函数将所有函数包装到一个矢量数组中传递即可。

第6点为系统调用,其余全为库函数

参数说明:

path:要执行的程序路径。可以是绝对路径或者是相对路径。在execv、execve、execl和execle这4个函数中,使用带路径名的文件名作为参数。

file:要执行的程序名称。如果该参数中包含“/”字符,则视为路径名直接执行;否则视为单独的文件名,系统将根据PATH环境变量指定的路径顺序搜索指定的文件。

argv:命令行参数的矢量数组。

envp:带有该参数的exec函数可以在调用时指定一个环境变量数组。其他不带该参数的exec函数则使用调用进程的环境变量。

arg:程序的第0个参数,即程序名自身。相当于argv[O]。

…:命令行参数列表。调用相应程序时有多少命令行参数,就需要有多少个输入参数项。注意:在使用此类函数时,在所有命令行参数的最后应该增加一个空的参数项(NULL),表明命令行参数结束。

返回值:一1表明调用exec失败,无返回表明调用成功。


Exec函数示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
 
int main(int argc,char* argv[],char* envp[])
{
    char* myargv[] = {"ps","-f",0};
    printf("main pid = %d , ppid = %d\n" ,getpid(),getppid());
 
    //execl("/bin/ps","ps","-f",(char*)0);
 
    //execlp("ps","ps","-f",(char*)0);
 
    //execle("/pin/ps","ps","-f",(char*)0,envp);

    //execv("/bin/ps",myargv);
 
    //execvp("ps",myargv);
 
    execve("/bin/ps",myargv,envp);
    perror("execl error");

    exit(0);
}
                      

编译 gcc -o main main.c

运行 . /main


运行结果

可见,进程ps -f 的pid即为main的pid,ppid也为main的ppid。

原调用进程的其他全部被新的进程替换,但其进程号不变。


(部分摘录于百度百科)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值