https://blog.csdn.net/qq_25349629/article/details/78364247
Linux下使用system()和execv()实现对外部程序的调用
system()函数
system()函数的原型为:
#include
int system(const char *__command);
1
2
system()函数调用/bin/sh来执行参数指定的命令,/bin/sh一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉shell从字符串command中读取命令。关于system函数的详细分析请参考:http://blog.csdn.net/linluan33/article/details/8097916
因此,想用system()函数调用外部程序便十分简单,例如调用/home/usrname/hello/目录下的helloworld可执行文件:
system("/home/usrname/hello/helloworld");
1
exec函数说明
exec是函数族提供了一个在进程中执行另一个进程的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。
exec函数族的6个函数原型分别为:
#include
int execl(const char *path, const char *arg, ...)
int execv(const char *path, char *const argv[])
int execle(const char *path, const char *arg, ..., char *const envp[])
int execve(const char *path, char *const argv[], char *const envp[])
int execlp(const char *file, const char *arg, ...)
int execvp(const char *file, char *const argv[])
1
2
3
4
5
6
7
函数返回值:成功 -> 函数不会返回,出错 -> 返回-1,失败原因记录在error中。
关于exec函数族的具体分析请参考: http://blog.csdn.net/zhengqijun_/article/details/52852074
使用execv()函数调用/home/usrname/hello/目录下的helloworld可执行文件:
char* const argv_execv[]={"helloworld","Andyoyo",NULL};//第一个字符串helloworld为可执行文件名,第二个字符串Andyoyo为传递给helloworld的参数
if(fork()==0)
if(execv("/home/usrname/hello/helloworld",argv_execv)<0)
{perror("Error on execv");
return -1;
}
1
2
3
4
5
6
测试源码:
helloworld.cc
//helloworld.cc
#include
using namespace std;
int main(int argc,char **argv)
{
cout<<"------This is hello progress------"<
cout<<"Hello "<
}
1
2
3
4
5
6
7
8
9
10
11
12
13
mainprogress.cc
//mainprogress.cc
#include
#include "stdlib.h"
#include "unistd.h"
#include "stdio.h"
using namespace std;
int main() //方式1:使用system函数,需要头文件stdlib.h //方式2:execv函数,需要头文件unistd.h g++ -o helloworld helloworld.cc ---This is main progress--- 参考网站:
{
cout<<"---This is main progress---"<
cout<<"使用system函数调用外部程序"<
cout<<"使用execv函数调用外部程序"<
if(fork()==0)
if(execv("/home/usrname/hello/helloworld",argv_execv)<0)
{perror("Err on execv");
return -1;
}
cout<<"Exit main process..."<
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
在终端使用g++编译上面两个.cc文件,并运行progress
g++ -o mainprogress mainprogress.cc
sudo ./mainprogress
1
2
3
运行后终端输出如下:
使用system函数调用外部程序
------This is hello progress------
Hello Andyoyo
Exit hello progress...
使用execv函数调用外部程序
Exit main process...
------This is hello progress------
Hello Andyoyo
Exit hello progress...
1
2
3
4
5
6
7
8
9
10
11
运行结果发现当主进程通过system()调用helloworld时,当helloworld执行完后会回到主进程,但是通过execv()调用helloworld时,子进程会覆盖主进程,以至于先出现Exit main process…而后进入helloworld进程。
[1]http://blog.csdn.net/linluan33/article/details/8097916
[2]http://blog.csdn.net/zhengqijun_/article/details/52852074