我正在编写一个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
?
答案 0 :(得分:14)
如果您对错误代码感兴趣,这是一种更便携的方法,而不是除以256:
printf("Exit code: %i\n", WEXITSTATUS(pclose(fp)));
但是,popen
是一种方式,因此您要么通过shell中常用的重定向样式创建更多变通方法,要么按照此未经测试的代码执行此操作:
#include <unistd.h>
#include <stdio.h>
/* since pipes are unidirectional, we need two pipes.
one for data to flow from parent's stdout to child's
stdin and the other for child's stdout to flow to
parent's stdin */
#define NUM_PIPES 2
#define PARENT_WRITE_PIPE 0
#define PARENT_READ_PIPE 1
int pipes[NUM_PIPES][2];
/* always in a pipe[], pipe[0] is for read and
pipe[1] is for write */
#define READ_FD 0
#define WRITE_FD 1
#define PARENT_READ_FD ( pipes[PARENT_READ_PIPE][READ_FD] )
#define PARENT_WRITE_FD ( pipes[PARENT_WRITE_PIPE][WRITE_FD] )
#define CHILD_READ_FD ( pipes[PARENT_WRITE_PIPE][READ_FD] )
#define CHILD_WRITE_FD ( pipes[PARENT_READ_PIPE][WRITE_FD] )
void
main()
{
int outfd[2];
int infd[2];
// pipes for parent to write and read
pipe(pipes[PARENT_READ_PIPE]);
pipe(pipes[PARENT_WRITE_PIPE]);
if(!fork()) {
char *argv[]={ "/usr/bin/bc", "-q", 0};
dup2(CHILD_READ_FD, STDIN_FILENO);
dup2(CHILD_WRITE_FD, STDOUT_FILENO);
/* Close fds not required by child. Also, we don't
want the exec'ed program to know these existed */
close(CHILD_READ_FD);
close(CHILD_WRITE_FD);
close(PARENT_READ_FD);
close(PARENT_WRITE_FD);
execv(argv[0], argv);
} else {
char buffer[100];
int count;
/* close fds not required by parent */
close(CHILD_READ_FD);
close(CHILD_WRITE_FD);
// Write to child’s stdin
write(PARENT_WRITE_FD, "2^32\n", 5);
// Read from child’s stdout
count = read(PARENT_READ_FD, buffer, sizeof(buffer)-1);
if (count >= 0) {
buffer[count] = 0;
printf("%s", buffer);
} else {
printf("IO Error\n");
}
}
}
代码来自这里:
http://jineshkj.wordpress.com/2006/12/22/how-to-capture-stdin-stdout-and-stderr-of-child-program/
答案 1 :(得分:10)
子进程的返回值位于顶部
168位。你有 将pclose的返回值除以256,然后得到 搜索子进程的返回值。
来自http://bytes.com/topic/c/answers/131694-pclose-returning-termination-status-command
我的答案是pclose(in)/256
退出代码。
我仍然不知道如何以不同的方式捕获stderr或sdtout,但在得到答案之前我会接受这个作为我的答案。
答案 2 :(得分:1)
感谢关于退出代码Logan的回复。
我认为获得stderr的往返是将其重定向到临时文件:
FILE* f = popen("cmd 2>/tmp/tmpfile.txt", "r");