2011-10-09 52 views
0

我想fork和exec,父进程在stdout/stderr上处理任何东西。 不幸的是父进程没有得到任何输出。也就是说,读取的调用总是返回一个非正整数。POSIX:捕获子进程输出

这是代码。怎么了?

#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

#include <iostream> 
#include <string> 

int main() 
{    
    int out[2],err[2],in[2]; 
    pipe(out); 
    pipe(err); 
    pipe(in); 

    int fork; 
    if(!(fork=::fork())) 
    { 
     dup2(in[0],STDIN_FILENO); 
     dup2(out[1],STDOUT_FILENO); 
     dup2(err[1],STDERR_FILENO); 

     execlp("/bin/ls","/bin/ls","-la","/"); 
    } 

    fcntl(out[0], F_SETFL, fcntl(out[0], F_GETFL) | O_NONBLOCK); 
    fcntl(err[0], F_SETFL, fcntl(err[0], F_GETFL) | O_NONBLOCK); 
    for(;;) 
    { 
     int result; 
     waitpid(fork,&result,WNOHANG); 

     char ac[256]; 
     int cnt; 
     while((cnt=read(out[0], ac, 256))>0) 
    { 
      std::cout << std::string(ac,ac+cnt) << std::flush; 
     } 
     while((cnt=read(err[0], ac, 256))>0) 
     { 
      std::cout << std::string(ac,ac+cnt) << std::flush; 
     } 
     if(WIFEXITED(result)) 
    { 
      return 0; 
     } 
    } 
} 

当删除这两个行:

fcntl(out[0], F_SETFL, fcntl(out[0], F_GETFL) | O_NONBLOCK); 
fcntl(err[0], F_SETFL, fcntl(err[0], F_GETFL) | O_NONBLOCK); 

一切正常。我想要非阻塞IO,但...

感谢您阅读我的文章。

+0

看起来像这样的问题:http://stackoverflow.com/questions/7292642/grabbing-output-from-exec/7292659 – Aif

+0

不完全。至少它不会帮助这个代码:( – user986331

回答

-1

您的代码几乎不会执行任何错误验证。

我一个人会检查errno的返回值,当你从读取-1时,可能会有一个问题。