POSIX:捕获子进程输出

时间:2011-10-09 12:23:08

标签: posix exec fork

我正在尝试fork和exec,父进程处理stdout / stderr上的任何内容。 不幸的是,父进程没有得到任何输出。也就是说,对read的调用总是返回一个非正整数。

这是代码。怎么了?

#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,但是......

感谢您阅读我的帖子。

1 个答案:

答案 0 :(得分:-1)

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

我会检查errno的返回值,当你从read读取-1时,可能会出现问题。