Linux调用可执行程序
一、简介
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
。- 示例:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int ret = system("/bin/ls -lt ./turtle");
if(!ret)
cout << "成功调用可执行程序" << endl;
return 0;
}
三、exec函数族
exec
函数族提供了另一种在进程中调用程序(二进制文件或Shell
脚本)的方法。- 头文件:
<unistd.h>
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()
,其它的极少使用。 - 示例:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unistd.h>
using namespace std;
int main()
{
// 成功调用可执行程序后,后续代码将不再执行
// 最后一个参数0不可省
int ret = execl("/bin/ls", "/bin/ls", "-lt", "./turtle", 0);
cout << "成功调用可执行程序" << endl;
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unistd.h>
using namespace std;
int main()
{
// 成功调用可执行程序后,后续代码将不再执行
char* argv[] = {"/bin/ls", "-lt", "./turtle", 0};
int ret = execv("/bin/ls", argv);
cout << "成功调用可执行程序" << endl;
return 0;
}