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