我试图从用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
描述符是否都重定向到正确的父线程?
我错过了什么吗?