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.参数说明
path:要执行的程序路径。可以是绝对路径或则是相对路径。在execv、execl和execle这三个函数中,使用带路径名的文件名作为参数。
file:要执行的程序名称。假如该参数中包含“/”字符,则视为路径名直接执行;否则视为单独的文件名,系统将按照PATH环境变量指定的路径次序搜索指定的文件。
argv:命令行参数的字段。
envp:带有该参数的exec函数可以在调用时指定一个环境变量字段。其他不带该参数的exec函数则使用调用者进程的环境变量。
arg:程序的第0个参数,即程序名自身。相当于argv[0]。
…:命令行参数列表。调用相应程序时有多少命令行参数,就须要有多少个输入参数项。注意:在使用这种函数时,在所有命令行参数的最后应当降低一个空的参数项(NULL),表明命令行参数结束。
倘若执行失败则直接返回-1,失败缘由存于errno中。
倘若执行成功则函数不会返回,这句话可能无法理解,当在主程序中成功调用execl后linux防火墙设置,被调用的程序将代替调用者程序,也就是说linux ./执行程序,execl函数以后的代码都不会被执行。
最常用的是execl函数,其它的很少使用
2.示例程序
示例(book266.cpp)
/*
* 程序名:book266.cpp,此程序用于演示用execl函数执行程序。
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include
#include
#include
#include
int main()
{
int iret=execl("/bin/lss","/bin/ls","-l","/usr/include/stdio.h",0); // /bin/lss不存在,执行不能成功。
// int iret=execl("/bin/ls","/bin/ls","-l","/usr/include/stdio.h",0); // 可以调用成功的代码。
printf("iret=%dn",iret);
if (iret==-1) printf("%d:%sn",errno,strerror(errno));
}
2.1测试ls命令
我们先测试执行失败的情况,启用以下代码。
int iret=execl("/bin/lss","/bin/ls","-l","/usr/include/stdio.h",0); // /bin/lss不存在,执行不能成功。
运行疗效
再测试执行成功的情况,启用以下代码。
int iret=execl("/bin/ls","/bin/ls","-l","/usr/include/stdio.h",0); // 可以调用成功的代码。
运行疗效
从book266执行的结果可以看出linux ./执行程序,主程序中成功调用execl后,execl函数以后的代码都不会被执行。旁边的复印内容就没有复印下来了。
2.2测试顾客端可执行程序(编译过的)
(1)更改代码,填写程序的路径、名称,所须要的参数
这个程序的路径为:/root/多进程C++封装顾客端
可执行程序名为:/root/多进程C++封装顾客端
须要的参数有两个:一个是服务端的ip地址,一个是端口
(2)先启动服务端程序嵌入式linux培训,在启动这个测试程序,发觉能调用顾客端程序。
3.使用execl常用技巧
一般会用fork(),让子进程去调用别的可执行程序,父进程会去执行其他的事情。
二、system函数
system函数提供了另一种简单的执行程序的方式,把须要执行的命令用一个参数传给system函数。