1

我正在尝试从用 C++ 编写的服务器应用程序中的线程调用子进程。

它起初看起来不错,但现在随着子进程的输出变大,我遇到了时间问题。

这就是我现在正在做的事情:

int readlinesFromCommandStdout( char * const *argv, int maxLines, int timeout, std::list<std::string> &destination )
{
    int count = 0;

    int filedes[2];
    pipe( filedes );
    dup2( filedes[0], 0 );
    dup2( filedes[1], 1 );

    int flags = fcntl( filedes[0], F_GETFL, 0 );
    flags |= O_NONBLOCK;
    fcntl( filedes[0], F_SETFL, flags );

    spawnv( P_NOWAITO, argv[0], (char * const *) argv );

    char *buffer = (char*) malloc(MAX_BUFFER);
    struct pollfd fds;
    fds.fd = filedes[0];
    fds.events = POLLRDNORM;
    int polling;

    if(!buffer)
        return -1;

    do {

        polling = poll( &fds, 1, timeout <= 0 ? 1000 : timeout );
        if ( gets( buffer ) == NULL ) {
            break;
        }
        destination.push_back( buffer );
        count++;

        if(count >= maxLines) {
            break;
        }
    } while ( polling > 0 );

    close( filedes[0] );
    close( filedes[1] );

    free(buffer);

    return count;
}

有时,两个独立孩子的输出会混淆。我很确定问题出在dup2()电话上。是否所有子stdout描述符都重定向到正确的父线程?

我错过了什么吗?

4

0 回答 0