Linuxc 之 Exec函数详解

26 篇文章 0 订阅
24 篇文章 0 订阅
         exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。
        与一般情况不同,exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程ID等一些表面上的信息仍保持原样,颇有些神似"三十六计"中的"金蝉脱壳"。看上去还是旧的躯壳,却已经注入了新的灵魂。只有调用失败了,它们才会返回一个-1,从原程序的调用点接着往下执行。



#include <unistd.h>
int execl(const char *path, const char *arg, ..., NULL);
int execlp(const char *file, const char *arg, ..., NULL);
int execle(const char *path, const char *arg, ..., NULL ,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
注意:
exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数


第5位
l:表示参数传递为逐个列举方式
execl、execle、execlp
v:表示参数传递为构造指针数组方式
execv、execve、execvp
第6位
e:可传递新进程环境变量
execle、execve
p:表示系统会自动从环境变量“$PATH”所指出的路径中查找可执行程序。
execlp、execvp


1.execve
#include<unistd.h>
函数定义 :
int execve(const char *filename, char *const argv[ ], char *const envp[ ]);
返回值:
 函数执行成功时没有返回值,执行失败时的返回值为-1.
函数说明:
 execve()用来执行参数filename字符串所代表的文件路径,第二个参数是利用数组指针来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。

2.execlp实例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
execlp(“ls”,“ls”,”-l”,”/home”, NULL);
        return 0;
}

3.execle实例
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *envp[]={"PATH=/tmp","USER=zhanSan",NULL};
        if(fork()==0){
        /*调用execle函数,注意这里也要指出env的完整路径*/
                if(execle("/bin/env","env",NULL,envp)<0)
                perror("execle error!");
        }
        exit( 0);
}

4.execvp实例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main()
{
    char *argv[] = {"ls","-l","/etc",(char *)0};
    execvp("ls",argv);
    return 0;
}

更多的组合实例,具体应用欢迎大家看我其他的进程博客

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
exec函数是Linux系统中的一个系统调用,用于在当前进程中执行一个新的程序,替换当前进程的代码和数据,从而使新程序成为当前进程。 exec函数有多个变种,包括execl、execle、execlp、execv、execvp等。它们的区别在于参数的传递方式和可执行文件的搜索路径等不同。 一般情况下,exec函数会覆盖当前进程的地址空间,因此,调用exec函数后,原进程的代码和数据都会被新进程替换,从而新进程获得了原进程的权限和资源。因此,exec函数常用于创建子进程并在子进程中执行一个新的程序。 示例代码: ```c #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { printf("This is the original process.\n"); // 创建子进程 pid_t pid = fork(); if (pid == -1) { perror("fork failed"); return -1; } else if (pid == 0) { // 在子进程中执行ls命令 execl("/bin/ls", "ls", "-l", NULL); perror("execl failed"); return -1; } else { // 父进程等待子进程结束 wait(NULL); printf("Child process finished.\n"); } return 0; } ``` 在上面的代码中,我们创建了一个子进程,并在子进程中执行了ls命令。在执行execl函数时,第一个参数是可执行文件的路径,第二个参数是可执行文件的名称,后面的参数是传递给可执行文件的参数列表。如果execl函数执行成功,则不会返回,否则会返回-1,并输出错误信息。在父进程中,我们使用wait函数等待子进程结束,并输出相应的信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊飞飞飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值