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;
}
解释
-
使用
system()
函数:- 这个函数非常简单,只需要一个字符串参数,这个字符串包含要执行的命令。
- 我们执行了
ls
命令,并检查返回值。如果system()
返回0,则命令执行成功;否则,表示失败。
-
使用
execl()
函数:execl()
需要路径、命令和任意数量的参数(以NULL
结尾)。- 这里我们尝试执行
/bin/ls
命令,并通过-l
参数以列表格式显示详细信息。 - 如果
execl()
成功,它将不会返回,当前的进程会被/bin/ls
取代。 - 如果有错误发生,
execl()
会返回-1
,并设置errno
。可以通过perror()
函数打印出错误信息。
注意,execl()
后面的代码行("这行不会被执行")在 execl()
成功执行后实际上是不会执行的,因为 execl()
会替换当前进程的映像。如果 execl()
调用失败了,错误处理逻辑会被执行。
在使用这些函数时,确保你有正确的权限和正确的路径来执行目标程序。此外,对于实际部署的程序,最好检查 system()
和 exec
调用的安全性,防止注入攻击等安全问题。