exec族函数详解(execl, execlp, execle, execv, execvp, execvpe )

文章详细介绍了exec族函数在Linux中的作用,如启动新程序执行,替换原有进程内容。讲解了execl、execlp、execv、execvp等函数的使用方法,包括参数传递、环境变量的处理,并通过示例代码展示了如何在程序中调用这些函数执行命令,如获取系统时间和运行ls、ps命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、exec族函数的作用

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

函数原型:

#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[]);
 
 
path:  可执行文件的路径名字
arg:   可执行程序所带的参数,第一个参数为可执行文件名字,没有带路径且arg必须以NULL结束
file:  如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,在它所指定的各目录中搜寻 
        可执行文件。
 
返回值:exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点 
       接着往下执行。
 
p:    使用文件名,并从PATH环境进行寻找可执行文件
v:    应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。
e:    多了envp[]数组,使用新的环境变量代替调用进程的环境变量

2.execl()函数的使用

#include <stdio.h>
 
int main(int argc,char **argv){
        int i;
 
        for(i = 0;i < argc;i++){
                printf("argv[%d]: %s\n",i,argv[i]);
        }
        return 0;
}

执行结果:

#include <stdio.h>
#include <unistd.h>
 
int main(int argc ,char **argv){
 
        printf("before execl!\n");
        if(execl("./exe","exe","abcd",NULL) == -1){
 
                printf("execl filed!\n");
                perror("why");
        }
        printf("Execute after failure!\n");
        return 0;
}

执行结果:

举例:获取系统时间

#include <stdio.h>
#include <unistd.h>
 
int main(int argc ,char **argv){
 
        printf("this pro get system date:\n");
 
        if(execl("/bin/date","date",NULL,NULL) == -1){
 
                printf("execl filed!\n");
 
                perror("why");
        }
        printf("Execute after failure!\n");
        return 0;
}

执行结果:

3.execlp()函数的使用

1.那么execl函数后面加一个p是什么意思呢?p:使用文件名,并从PATH环境进行寻找可执行文件,
2.带p的函数包括execlp、execvp、execvpe,如果参数file中包含/,则就将其视为路径名,否则就3.按 PATH环境变量,在它所指定的各目录中搜寻可执行文件。举个例子,PATH=/bin:/usr/bin

接着上面的demo我们继续,比如我现在想要获取时间,需要用到date命令

#include <stdio.h>
#include <unistd.h>
int main(int argc ,char **argv){
    
    printf("before execl!\n");    
    if(execlp("date","date",NULL,NULL) == -1){
        printf("execl filed!\n");
        
        perror("becasue");
    }
    printf("Execute after failure!\n");
    return 0;
}

execlp函数会通过我们给出的data在系统变量中寻找文件,找到调用,否则error-1

插一句:whereis 想要查看命令,作用是查看命令的绝对路径比如whereis ls,可以查看ls的绝对路径
echo $ PATH Linux查看当前系统环境变来量
export PATH=$ PATH:(pwd查看当前的路径)
比如:
pwd(回车) /home/xxx/process
export PATH=$ PATH: /home/xxx/process ,这样就把当前路路径加到环境变量中了

执行结果:

4.execvp()函数的使用

那么带v的函数是什么意思呢? execv、execvp、execve,应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。
也就是在函数外面指定好指针数组,exec函数直接使用

#include <stdio.h>
#include <unistd.h>

int main(void){
    
    char *argv[] = {"ls","-l",NULL};
    if(execvp("ls",argv) == -1){
        printf("execl filed!\n");
        
        perror("becasue");
    }
    printf("Execute after failure!\n");
    return 0;
}

//先指定好char *argv[] = {"ls","-l",NULL};,我们exec函数直接使用,一样的效果,目的一样,使用方法不一样

执行结果:

5.execv()函数的使用

#include <stdio.h>
#include <unistd.h>
 
int main(){
 
        char *argv[] = {"ps",NULL,NULL};
 
        if(execv("/bin/ps",argv) == -1){ //相对于execvp来讲,要加执行文件的路径
 
                printf("execvp filed!\n");
 
                perror("why");
        }
        printf("Execute after failure!\n");
        return 0;
}

执行结果:

总结:

l : 使用参数列表
p:使用文件名,并从PATH环境进行寻找可执行文件
v:应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。
e:多了envp[]数组,使用新的环境变量代替调用进程的环境变量

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值