在C/C++中执行指定命令是比较常见的功能,但是其输出对调用者来讲是非常重要的参考,亦或者通过获知调用程序运行成功与否做下一步处理。
Win32平台方法
Win32平台上的程序员貌似总不是对返回码那么感兴趣,不像Linux程序员随随便便在脚本都是 $?
,但事实上确实是有专门的API提供了方法,而且总体上API功能很强大,也使用起来较复杂,此处只以最简单的功能作为介绍,读者可自行参考修改。
int RunCmd(const std::string& cmd, int& code, std::string& out) { |
其中接口的各个参数如下
- 返回值,如果调用使用返回
-1
或者错误码,调用成功返回0
- 参数
cmd
,是要执行的命令行命令 - 参数
code
,是执行命令的返回码,一般0
表示成功(当然取决于程序自己的退出定义了) - 参数
out
,执行命令的标准输出和错误输出,即该程序输出的信息内容
Linux平台方法
POSIX平台上实现这种功能其实就非常简单了,API也更容易使用,直接上代码
int RunCmd(const std::string& cmd, int& code, std::string& out) { |
接口参数和意义说明见上面。
测试验证和其他问题
函数实现了,可以进行测试了,测试使用上面的代码,最简单的使用Shell脚本(Win下的批处理),比如
!/bin/sh #这是Linux上的,Win下不需要 |
上面仅提供了退出码操作,正常执行的程序都有退出码的,跟上面其实类似,想想C语言的 main
函数,比如
int main(){ |
写个程序调用验证一下,代码简单,功能齐全。
上面程序执行命令并没有其他方面的设置,比如切换运行目录等等,如果确实需要这样的功能,
- WinAPI直接有参数定义
- Linux下可能需要自己
fork
和处理程序
另外一般的程序可以考虑设置一个超时参数,通过异步处理或者起线程读取,并通过定时关闭实现功能。