我正在写一个c++程序,它可以执行并输出(实时)shell脚本、makefile或其他程序,但是我希望我的程序在有错误或没有错误时返回不同的结果。
#include "execxi.h"
using namespace std;
int execXI::run(string command)
{
FILE *in;
char buff[512];
// is this the check for command execution exited with not 0?
if(!(in = popen(command.c_str(), "r"))){
// I want to return the exit code and error message too if any
return 1;
}
// this part echoes the output of the command that's executed
while(fgets(buff, sizeof(buff), in)!=NULL){
cout << buff;
}
pclose(in);
return 0;
}
字符串
这是我目前所知道的
让我们假设这个脚本运行make
来构建一个程序,它给出了这样的错误
on_target_webkit_version out/Release/obj/gen/webkit_version.h
Traceback (most recent call last):
File "../build/webkit_version.py", line 107, in <module>
sys.exit(main())
File "../build/webkit_version.py", line 103, in main
return EmitVersionHeader(*sys.argv[1:])
File "../build/webkit_version.py", line 86, in EmitVersionHeader
webkit_revision = GetWebKitRevision(webkit_dir, version_file)
File "../build/webkit_version.py", line 60, in GetWebKitRevision
version_info = lastchange.FetchVersionInfo(
AttributeError: 'module' object has no attribute 'FetchVersionInfo'
make: *** [out/Release/obj/gen/webkit_version.h] Error 1
型
- 我是否可以知道这是错误退出的?
- 这是一个错误,是否以代码
else than 0
退出? - 最后一部分是用
stderr
输出的吗?
考虑到make
退出的代码不是0
,假设是1
,它输出为stderr
,我最终是否可能捕获这些退出代码和错误消息?
如何在输出程序结果后捕获退出代码和stderr
,并在函数中返回exit code
/stderr
?
4条答案
按热度按时间1dkrff031#
如果您对错误代码感兴趣,这是一种更便携的获取方法,而不是除以256:
字符串
但是,
popen
是一种方式,因此您可以通过shell中通常的重定向风格创建更多的解决方案,或者遵循以下未经测试的代码来正确执行:型
代码来自这里:
http://jineshkj.wordpress.com/2006/12/22/how-to-capture-stdin-stdout-and-stderr-of-child-program/
64jmpszr2#
子进程的返回值在前16个8位。你必须将pclose的返回值除以256,然后你得到子进程的搜索返回值。
从http://bytes.com/topic/c/answers/131694-pclose-returning-termination-status-command获得
我的答案是
pclose(in)/256
是退出代码。我仍然不知道如何以不同的方式捕获stderr或sdtout,但在有答案之前,我将接受这作为我的答案。
ifmq2ha23#
谢谢你的回复关于退出代码洛根。
我相信获取stderr的往返过程是将其重定向到一个临时文件:
字符串
9udxz4iz4#
这个问题已经很老了,但我仍然找不到一个真正完整和优雅的解决方案来解决这里处理的问题-执行OS命令并捕获所有的stdout,stderr和退出状态。所以我提出了下面的例子,它没有使用popen(),而是分叉一个进程并试图拦截所有信息。还有一个stdin管道用于更多的交互式使用,但在下面的例子中没有使用。
字符串