2012-10-24 34 views
5

我正在尝试编写运行外部程序的程序。从C++的外部程序捕捉stderr和stdout

我知道,我能赶上stdout,我能赶上stdoutstderr共同但问题是,我能赶上stderrstdout分开吗?

我的意思是例如stderr变量STDERRstdout变量STDOUT。我的意思是我希望他们分开。

此外,我需要在可变外部程序的退出代码。

+3

什么是操作系统?你知道怎样把它们聚在一起? – ybungalobill

+0

我正在使用Ubuntu,我知道我可以使用2>&1。但我希望他们分开。谢谢 –

+0

看看这个答案:http://stackoverflow.com/a/12839498/1741542 –

回答

2

在Windows上,您必须填写STARTUPINFOCreateProcess捕获标准流,并且您可以使用GetExitCodeProcess函数获取终止状态。有一个例子如何非标准流重定向到父进程http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499.aspx

在你可能想使用fork代替execve般的Linux操作系统,并配有派生进程的工作则是另一回事。

在Windows和Linux的重定向数据流具有普遍的做法 - 你必须创建若干管(每个流)和重定向子进程流成管道,父进程可以从管道中读取数据。为Linux

示例代码:

int fd[2]; 

if (pipe(fd) == -1) { 
    perror("pipe"); 
    exit(EXIT_FAILURE); 
} 

pid_t cpid = fork(); 
if (cpid == -1) { 
    perror("fork"); 
    exit(EXIT_FAILURE); 
} 

if (cpid == 0) { // child 
    dup2(fd[1], STDERR_FILENO); 
    fprintf(stderr, "Hello, World!\n"); 
    exit(EXIT_SUCCESS); 
} else { // parent 
    char ch; 
    while (read(fd[0], &ch, 1) > 0) 
     printf("%c", ch); 
    exit(EXIT_SUCCESS); 
} 

编辑:如果您需要从其他程序赶上流,使用相同的stragey如上,第一fork,第二 - 使用管道(如在上面的代码) ,然后execve在子过程中的另一个progrram并使用父进程的代码等待执行结束,赶上返回代码:

int status; 
if (waitpid(cpid, &status, 0) < 0) { 
    perror("waitpid"); 
    exit(EXIT_FAILURE); 
} 

可以在手册页找到更多细节,dup2waitpid