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;
}
2 つの独立した子の出力が混同されることがあります。dup2()
間違いは通話にあると確信しています。すべての子の記述子は正しい親スレッドstdout
にリダイレクトされていますか?
何か不足していますか?