文章目录

  • 一、exec函数族
  • 二、system函数
  • 三、版权声明

在C/C++程序中,经常需要调用其它的程序来先成某项任务,例如其它的C/C++程序、操作系统命令或Shell脚本,C/C++提供了exec函数族和system函数来实现这个功能。

一、exec函数族

exec函数族提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。还有,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。

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

参数说明:

path:要执行的程序路径。可以是绝对路径或者是相对路径。在execv、execl和execle这三个函数中,使用带路径名的文件名作为参数。

file:要执行的程序名称。如果该参数中包含“/”字符,则视为路径名直接执行;否则视为单独的文件名,系统将根据PATH环境变量指定的路径顺序搜索指定的文件。

argv:命令行参数的数组。

envp:带有该参数的exec函数可以在调用时指定一个环境变量数组。其他不带该参数的exec函数则使用调用者进程的环境变量。

arg:程序的第0个参数,即程序名自身。相当于argv[0]。

…:命令行参数列表。调用相应程序时有多少命令行参数,就需要有多少个输入参数项。注意:在使用此类函数时,在所有命令行参数的最后应该增加一个空的参数项(NULL),表明命令行参数结束。

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

如果执行成功则函数不会返回,这句话可能难以理解,当在主程序中成功调用execl后,被调用的程序将取代调用者程序,也就是说,execl函数之后的代码都不会被执行。

在实际开发中,最常用的是execl函数,其它的极少使用,我就不介绍了,如果大家认为execl满足不了实际开发的需求,再去研究其它几个函数。

示例(book266.cpp)

/** 程序名:book266.cpp,此程序用于演示用execl函数执行程序。* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>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=%d\n",iret);if (iret==-1) printf("%d:%s\n",errno,strerror(errno));
}

我们先测试执行失败的情况,启用以下代码。

  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执行的结果可以看出,主程序中成功调用execl后,execl函数之后的代码都不会被执行。

二、system函数

system函数提供了另一种简单的执行程序的方法,把需要执行的命令用一个参数传给system函数。

system函数的声明如下:

int system(const char * string);

system会调用fork产生子进程,由子进程来调用/bin/sh -c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system期间SIGCHLD信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

如果fork失败 返回-1,出现错误。

如果execl失败,表示不能执行shell,返回值相当于shell执行了exit(127)。

如果执行成功则返回子shell的终止状态。

如果system在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),仅当命令处理程序可用时,返回非零值。如果system调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

示例(book269.cpp)

/** 程序名:book269.cpp,此程序用于演示用system函数执行程序。* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>int main()
{ int iret;// 调用不成功的代码。iret=system("/bin/lss -l /usr/include/stdio.h"); printf("iret=%d\n",iret);if (iret==-1) printf("%d:%s\n",errno,strerror(errno));// 可以调用成功的代码。iret=system("/bin/ls -l /usr/include/stdio.h"); printf("iret=%d\n",iret);if (iret==-1) printf("%d:%s\n",errno,strerror(errno));
}

运行效果

三、版权声明

============
C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道

如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!

Linux调用可执行程序相关推荐

  1. Linux 调用openoffice报错 disconnected unexpectedly

    Linux 调用openoffice报错 disconnected unexpectedly 错误信息: 2020-10-28 22:15:42.305 ERROR com.xzl.common.ut ...

  2. 4. linux调用文件计算阶乘前5项和_嵌入式Linux系统编程——文件读写访问、属性、描述符、API

    Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...

  3. linux 调用动态库so文件

    关于动态调用动态库方法说明 一.        动态库概述 1.  动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输出操作或屏幕控制等标准任务函数).可以 ...

  4. java调用可执行程序 开销_java – 进行JNI调用的定量开销是多少?

    快速分析器测试产量: Java类: public class Main { private static native int zero(); private static int testNativ ...

  5. linux 调用redis cli,使用redis-cli定时执行指定命令

    java抽象-老师的生日-逻辑思维-有趣的面试题-遁地龙卷风 (-1)写在前面 都快去北京了,硬生生的安排一场java考试,对于那些特别细节的东西我忘了吧也不觉得有什么不好,以前都记得,也都见过,只不 ...

  6. linux调用一个函数失败 打印错误,linux系统调用出错时的处理函数

    在进行linux的系统调用, 要判断调用的成功与否, 调用失败的情况下就要进行一定的处理,除了打印出消息, 还可以打印系统调用的出错信息,  一般性的错误不必退出程序, 要是致命性的错误就终止整个程序 ...

  7. linux调用信号处理程序后返回,如何在Linux上执行异步信号处理程序?

    Source#1(Andries Brouwer)对于单线程进程是正确的 . 源#2(SCO Unix)对于Linux是错误的,因为Linux不喜欢sigwait中的线程(2) . 关于第一个可用的线 ...

  8. Linux调用外部服务出现java.net.UnknownHostException

    windows下调用某外部服务的接口正常,发布到测试环境中的linux下,短信服务接口.验证码接口齐刷刷的出现了UnknownHostException, java.net.UnknownHostEx ...

  9. java linux 调用32位so_Linux上TCP的几个内核参数调优

    Linux作为一个强大的操作系统,提供了一系列内核参数供我们进行调优.光TCP的调优参数就有50多个.在和线上问题斗智斗勇的过程中,笔者积累了一些在内网环境应该进行调优的参数.在此分享出来,希望对大家 ...

最新文章

  1. Hadoop集群的基本操作(二:HBase的基本操作)
  2. [你必须知道的.NET]第二十一回:认识全面的null
  3. SQL server 两台服务器间连接查询
  4. 数据库导出All about Oracle IMP/EXP
  5. Python入门100题 | 第007题
  6. openCV学习教程(一):Mat类的使用
  7. python实现排序算法_python实现各种排序算法
  8. RabbitMq org.springframework.amqp.AmqpIOException: java.io.IOException
  9. C++关联容器总结一
  10. 高精度室内外融合定位服务平台-“羲和”系统
  11. 网络安全实验室之基础关
  12. Invalid interval string, expecting a number followed by one of Mwdhmsy
  13. web - 常见浏览器及内核
  14. LikeLib:区块链+云计算的结合技术现在成熟了吗?
  15. CSS开发中所有基本属性的使用技巧
  16. 第16周项目3--用函数指针调用函数(吃饭,睡觉,打豆豆)
  17. ZLIB 压缩的数据格式规范
  18. 如何理解柯里化|函数式编程
  19. SSM中mybtis报错### The error may involve defaultParameterMap ### The error occurred while setting param
  20. java封神OL_MobaXterm:远程终端登录软件封神选手

热门文章

  1. Python保存任意长度的matplotlib动画为GIF动图
  2. Python制作词云图根据蒙板图像确定形状和文字颜色
  3. 微课|玩转Python轻松过二级(1.3节):编码规范与代码优化建议1
  4. Python使用numpy滤除图像中的低频信号
  5. Python+SQLite开发无界面版通信录管理系统
  6. linux下如何升级gcc和g++编译器
  7. Linux获取执行文件路径,如何 获取linux进程的执行文件路径
  8. html input 字体颜色_html 元素参考整合实用收藏!前端web工程师必备!
  9. jstack 脚本 自动日志_在 Linux 中使用 Bash 脚本删除早于 “X” 天的文件/文件夹...
  10. android dex2oatd e,解決android項目Error:Execution failed for task ':app:dexDebug'.ebug'錯誤