linux 子程序返回错误代码,execvp:在程序中调子程序并获取返回值
在linux中我们可以很方便的使用system启动子程序,但是system有个不足就是它对子程序的掌控很弱,连返回数值都很难获取。
下面是一段使用execvp来调用子程序的示例代码,关于下面的代码有几点特殊说明:
1) folk(): 会从主程序中复制出一个新的程序,如果folk返回0就是子程序,否则那就是还是当前的程序。
2) wait() : 在主程序中你可以自己决定要等待子程序返回才继续运算这样保持同步还是异步的不等子程序的结果就继续往下运行。
3) WEXITSTATUS: 用来获取子程序的返回值
4) freopen: 默认情况下子程序的log会和主程序的一起都在终端中打印出来,这可能不是我们想要的,所以要把子程序的log重新导入到其他的log
5) execvp: 这个函数如果正常运行是不会有返回的,有返回说明启动的程序出现异常。对于没有返回的函数理解起来比较费劲,因为通常我们讲函数都会有返回的,但如果想到这个是一个独立的进程,那就可以理解了。
#include
#include
int callApp (char* program, char** arg_list, bool isWaiting) {
pid_t child_pid;
/* Duplicate this process. */
child_pid = fork ();
//return child_pid;
if (child_pid != 0){
/* This is the parent process. */
if(isWaiting == true){
/* Wait for the child process to complete. */
int child_status;
wait (&child_status);
int retCode = WIFEXITED (child_status);
// cout << "Finish " << program << " " << retCode << " " << WEXITSTATUS (child_status) << endl;
if (retCode){
// printf ("the child process exited normally, with exit code %d\n", WEXITSTATUS (child_status));
return WEXITSTATUS(child_status);
} else{
// printf ("the child process exited abnormally\n");
return -1;
}
}
}else {
/* Now execute PROGRAM, searching for it in the path. */
string fLog = _temp_path+"/subprocess_log.log";
freopen(fLog.c_str(), "w", stdout);
string fErrorLog = _temp_path+"/subprocess.log";
freopen(fErrorLog.c_str(), "w", stderr);
chdir(_temp_path.c_str());
int ret = execvp (program, arg_list);
fclose(stdout);
/* The execvp function returns only if an error occurs. */
cout << "execvp failed with error code " << ret << endl;
abort();
return -1;
}
}
// call sample
char subProcessBin[1024] = "myBin";
char* configFile = "myConfig";
char* arg_list[]= {
subProcessBin,
"-c",
configFile,
NULL
};
int retCode = callApp(subProcessBin, arg_list, true);
linux 子程序返回错误代码,execvp:在程序中调子程序并获取返回值相关推荐
- oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...
java程序调用Oracle 存储过程 获取返回值(无返回,非结 果集,结果集) oracle中procedure是不能有返回值的,要想返回值,就得有 输出参数,同样要想返回记录集,可以把游标类型作为 ...
- java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)
oracle中procedure是不能有返回值的,要想返回值,就得有输出参数,同样要想返回记录集,可以把游标类型作为输出参数. 下面是详细情况说明: 一:无返回值的存储过程调用 存储过程: creat ...
- 微信小程序-后台使用富文本编辑器返回数据,小程序编译富文本编辑器返回的数据
最近遇到一个功能,后台管理系统添加商品的时候,商品详情是使用富文本编辑器添加的.小程序获取的商品详情数据是含有<p>标签的. 后台管理系统 百度了多种方法,也试用了很多方法,最终觉得wxP ...
- Linux c modbus 线程,Modbus TCP Slave Thread - 设置和获取寄存器值
根据这个howToModbusSlave我试图用选定值的寄存器构建我自己的modbus slave(后来我想用来自使用python / jython的受监视设备的数据填充这些值),并使用Predix( ...
- 解析淘宝淘口令获取商品ID/uland链接e参数获取返回商品优惠券方法说明
解析淘宝淘口令获取商品ID/uland链接e参数获取返回商品优惠券方法说明 /*1. 商品id获取返回商品详情:http://47.106.188.80/api/tao/v1.0/goods/deta ...
- 微信退款返回58 linux,小程序微信支付申请退款返回cUrl错误,错误码:58
2019-04-03 15:15:29 如何看待微信公开课小程序热门讨论「小程序微信支付申请退款返回cUrl错误,错误码:58」 摘要:小程序微信支付申请退款返回cUrl错误,错误码:58 展开:调用 ...
- 嵌入式linux网络编程之——5年程序员给你深度讲解socket套接字
以下内容转载自 https://www.toutiao.com/i6827837032622981636/ 本文主要给大家分享网络七层概念之网络编程socket,前边的章节已经给大家讲述了链路层.物理 ...
- ProGuard的返回错误代码1。异常的解决方法
引用:http://wangwei121004-163-com.iteye.com/blog/1206595 ProGuard的返回错误代码1.See控制台 情况1: Proguard的返回错误代码1 ...
- Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间
1.问:知道程序执行时间我们能够做什么? 在<C++应用程序性能优化>一书中,假设大家读过相信大家一定对性能优化这一块很上心,文中总是对优化前后的时间对照很直观给我们一个感受. 那么我们怎 ...
最新文章
- 性价比高出英特尔45%,亚马逊的云服务器芯片如何做到?| 解读
- 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件对齐 )
- 补第一阶段冲刺站立会议1(应发表日期5月13日)
- PHP Curl多线程原理实例详解
- mysql 排序去重复_php mysql 过滤重复记录并排序
- oledb vc访问mdb数据库_一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE...
- DNS 系统解析过程概述
- 蓝桥杯 ALGO-102 算法训练 数对
- Sublime 输入中文显示方框问号乱码
- Git(14)-- Git分支-- 分支管理
- 与走在创业路上的学子交流——记网维“海大快点”创业团队
- 第九届蓝桥杯c语言b组试题+部分答案
- 电脑微信多开方式(两种实现方案, 适合中文路径)(办公, 生活两不误 / 海王必备)
- 随滚动条变动的圆环滚动进度条,goTop按钮整合案例
- ArcGIS创建tpk切片缓存
- /etc/shadow文件是什么?
- 微信邮箱格式是什么意思?为什么我们都在使用微信邮箱?
- 关于达芬奇调色台的那些事儿
- 3D打印肝模型抢救生命
- CSS3彩色渐变的电脑键盘js特效