linux系统编程:执行函数exec


exec函数

exec函数是一组函数,主要功能是可以在程序代码中调用某些命令,该函数具体分类如下:

分类函数
字符串数组参数execv() execvp() execve()
可变参数execl() execlp() execle()

v :表示向量
l :表示可变参数
p :表示文件名
e :表示环境变量

字符串数组参数execv

我们定义一个数组char* const args[] = { "cat", "./test", NULL };,声明的一个环境变量extern char** environ;,该环境变量是在其他库中定义好的,以下的举例都相当于直接在终端执行cat test

execv()使用格式

  • execv(“执行文件地址”,字符串数组);
execv("/bin/cat",args);

execvp()使用格式

  • execvp(“文件名”,字符串数组);
execvp("cat", args);

execve()使用格式

  • execve(“执行文件地址”,字符串数组, 环境变量)
execve("/bin/cat", args, environ);

可变参数execl

execl()使用格式

  • execv(“执行文件地址”,“程序名”,“处理的文件地址”,NULL);
  • 注:NULL表示所需要给的参数结束了
execl("/bin/cat","cat","./test",NULL);

execvp()使用格式

  • execvp(“文件名”,“程序名”,“处理的文件地址”,NULL));
execlp("cat","cat","./test",NULL);

execve()使用格式

  • execve(“执行文件地址”,“程序名”,“处理的文件地址”,NULL, 环境变量)
execle("/bin/cat","cat","./test",NULL, environ);

exec特点

1. exec函数运行结束后,将停止运行

我们执行如下代码:

#include <iostream>
#include <unistd.h>
using namespace std;
int main(){
    cout << "abcde" << endl;  // execl和execv后面无法使用cout
    cout << "12345" << endl;
    execl("/bin/cat","cat","./test",NULL);
}

运行结果如下:

在这里插入图片描述
但如果我们将cout放在exec函数之后,代码如下:

#include <iostream>
#include <unistd.h>
using namespace std;
int main(){
    execl("/bin/cat","cat","./test",NULL);
    cout << "abcde" << endl;  // execl和execv后面无法使用cout
    cout << "12345" << endl;
}

运行结果如下:

在这里插入图片描述

2. 一次调用,失败返回

返回值含义
-1失败
不返回成功

注意:该函数调用成功后将不会有返回值!

3. 取代原进程

我们先准备一个loop.cpp作为程序中被执行的代码,其内容如下:

#include <iostream>
#include <unistd.h>
using namespace std;

int main(){
    for(int i=0; i<5; ++i){
        cout << getpid() << ":" << getppid() << endl;
    }
}

然后使用exec函数调用loop.cpp形成的可执行文件loop,命令行使用g++ loop.cpp -o loop就生成loop了,然后在exec.cpp中执行如下代码:

#include <iostream>
#include <unistd.h>
using namespace std;

int main(){
    cout << "main:" << getpid() << ":" << getppid() << endl;
    execl("./loop", "loop",NULL);
}

执行结果如下:

在这里插入图片描述我们发现我们当前主函数的进程ID和调用的loop中的进程ID是相同的,这时因为exec并不会生成一个新的进程,它只是做了一个替代操作,将源程序的虚拟内存换为exec函数中调用的命令生成的虚拟内存,原来的代码区就消失了,这也是为什么我们运行结束exec之后,将不会继续运行接下来的代码。

注意,在本质上exec是一个可以覆盖程序的函数。它不会改变PID,但该程序所在的地址空间的内容将会改变。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统编程是指在Linux操作系统下进行程序开发的过程和技术。它包括了使用系统调用、编写应用程序、处理文件和目录、进程管理等一系列操作。 在Linux系统编程中,可以使用系统调用来获取系统相关的信息,比如时间和日期。你可以使用time函数来获取当前的系统时间,date函数来获取当前的日期。这些函数可以帮助你获取到你所需要的系统信息。 此外,你可以使用Linux系统下的/proc虚拟文件系统来获取更详细的系统信息。在/proc目录下,每个进程都有一个对应的子目录,其中包含了该进程的相关信息。你可以读取这些文件来获取进程的状态、文件描述符等详细信息。 在Linux系统编程中,你可以使用system函数执行shell命令。这个函数可以让你在程序中方便地执行任意的shell命令。比如,你可以使用system("ls -la")来执行ls命令来列出当前目录下的所有文件和文件夹。你也可以使用system("echo HelloWorld")来执行echo命令打印出HelloWorld。 除了上述内容,Linux系统编程还涉及到进程管理、文件和目录操作、进程通信等方面的内容。你可以使用fork函数创建子进程,使用exec函数执行新的程序,在程序之间进行进程通信等等。这些都是Linux系统编程中常见的任务和技术。 总结起来,Linux系统编程是在Linux操作系统下进行程序开发的过程和技术,包括使用系统调用、处理文件和目录、进程管理、进程通信等一系列操作。通过使用系统调用和/proc虚拟文件系统,你可以获取到系统的相关信息。同时,使用system函数可以方便地执行shell命令。这些都是Linux系统编程中常见的内容和技巧。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值