linux中调用可执行程序

本文介绍了C++编程中system()和exec函数族的使用方法,包括它们的功能、返回值、参数传递以及在执行外部程序时的注意事项,特别强调了安全性的考量。
摘要由CSDN通过智能技术生成

Linux提供了system()函数exec函数,在C++程序中,可以执行其它的程序(二进制文件、操作系统命令或Shell脚本)。

一、system()函数

system()函数提供了一种简单的执行程序的方法,把需要执行的程序和参数用一个字符串传给system()函数就行了。

函数的声明:

int system(const char * string);

system()函数的返回值比较麻烦。

1)如果执行的程序不存在,system()函数返回非0;

2)如果执行程序成功,并且被执行的程序终止状态是0,system()函数返回0;

3)如果执行程序成功,并且被执行的程序终止状态不是0,system()函数返回非0。

二、exec函数

exec函数族提供了另一种在进程中调用程序(二进制文件或Shell脚本)的方法。

exec函数族的声明如下:

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[]);

注意:

1)如果执行程序失败则直接返回-1,失败原因存于errno中。

2)新进程的进程编号与原进程相同,但是,新进程取代原进程的代码段数据段和堆栈。

3)如果执行成功则函数不会返回,当在主程序中成功调用exec后,被调用的程序将取代调用者程序,也就是说,exec函数之后的代码都不会被执行。

4)在实际开发中,最常用的是execl()execv(),其它的极少使用。

下面的示例代码演示了如何在 C++ 程序中使用 system()exec 函数族执行外部程序。首先,我们将使用 system() 函数执行一个简单的 shell 命令,然后使用 execl() 来执行一个外部程序。

示例代码

#include <iostream>
#include <cstdlib>  // 对于 system()
#include <unistd.h> // 对于 exec()

using namespace std;

int main() {
    // 使用 system() 执行 ls 命令
    cout << "使用 system() 执行 'ls' 命令:" << endl;
    int returnVal = system("ls");
    if (returnVal == 0) {
        cout << "'ls' 命令执行成功" << endl;
    } else {
        cout << "'ls' 命令执行失败,返回值: " << returnVal << endl;
    }

    // 使用 execl() 执行 /bin/ls
    cout << "使用 execl() 执行 '/bin/ls':" << endl;
    if (execl("/bin/ls", "ls", "-l", NULL) == -1) {
        perror("execl 失败");  // 如果 execl 失败,打印错误信息
        return 1;  // 返回错误代码
    }

    cout << "这行不会被执行,因为 execl() 成功执行后不会返回" << endl;
    return 0;
}

解释

  1. 使用 system() 函数

    • 这个函数非常简单,只需要一个字符串参数,这个字符串包含要执行的命令。
    • 我们执行了 ls 命令,并检查返回值。如果 system() 返回0,则命令执行成功;否则,表示失败。
  2. 使用 execl() 函数

    • execl() 需要路径、命令和任意数量的参数(以 NULL 结尾)。
    • 这里我们尝试执行 /bin/ls 命令,并通过 -l 参数以列表格式显示详细信息。
    • 如果 execl() 成功,它将不会返回,当前的进程会被 /bin/ls 取代。
    • 如果有错误发生,execl() 会返回 -1,并设置 errno。可以通过 perror() 函数打印出错误信息。

注意,execl() 后面的代码行("这行不会被执行")在 execl() 成功执行后实际上是不会执行的,因为 execl() 会替换当前进程的映像。如果 execl() 调用失败了,错误处理逻辑会被执行。

在使用这些函数时,确保你有正确的权限和正确的路径来执行目标程序。此外,对于实际部署的程序,最好检查 system()exec 调用的安全性,防止注入攻击等安全问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值