POSIX: захватить вывод дочернего процесса - PullRequest
0 голосов
/ 09 октября 2011

Я пытаюсь форк и 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);

все работает как положено. Я хочу неблокирующий ввод-вывод, хотя ...

Спасибо за чтение моего поста.

1 Ответ

0 голосов
/ 09 октября 2011

Ваш код не выполняет почти никакой проверки ошибок.

Я бы, например, проверил возвращаемое значение errno, когда вы получаете -1 из read, там может быть проблема.

...