子プロセスで stdout としてリダイレクトされたパイプをポーリングする比較的単純なコードを作成しました。しかし、poll 関数が戻り、データの準備ができていると言うと、read 関数は常に 0 を返します。
これが機能しない理由として際立っている理由はありますか? 子プロセスから親プロセスへのパイプに直接書き込んだところ、うまくいきました。ioを間違ってリダイレクトしているだけだと思います。
親プロセスのコードは次のとおりです。
注: すべてのマクロはエラーを説明し、エラー ログに出力します。
pollData.fd = out.fd[ READ_INDEX ];
pollData.events = POLL_IN;
pollData.revents = 0;
printf( "Polling pipe for data...\n" );
if( poll( &pollData, 1, 5000 ) > 0 )
{
int bytesRead = 0, trys = TRYS;
printf( "Data has been received: " );
Read:
bytesRead = read( out.fd[ READ_INDEX ] , out.buf, BUF_SIZE );
if( bytesRead > 0 ) printf( "%s" , out.buf );
else if( bytesRead < 0 ) printf( "Error receiving data.\n" );
else
{
trys--;
printf( "No data was read.\n" );
sleep( SLEEP );
if( trys > 0 ) goto Read;
}
}
else LOG( ERR_POLLING, 0 );
子プロセスのコードは次のとおりです。 注: FD_REPLACE は dup2 を使用し、古いハンドルを閉じます。
FD_CLOSE_PACK( out.fd[ READ_INDEX ],
err.fd[ READ_INDEX ],
in.fd[ WRITE_INDEX ] );
FD_REPLACE( fileno( stdout ) , out.fd[ WRITE_INDEX ] , Child_Fail );
FD_REPLACE( fileno( stderr ) , err.fd[ WRITE_INDEX ] , Child_Fail );
FD_REPLACE( fileno( stdin ) , in.fd[ READ_INDEX ] , Child_Fail );
printf( "This is a message from the test program!\n Hope it works!\n" );
sleep( 10 );
Child_Fail:
FD_CLOSE_PACK( out.fd[ WRITE_INDEX ],
err.fd[ WRITE_INDEX ],
in.fd[ READ_INDEX ] );
return -1;
マクロの 1 つを次に示します。
#define FD_REPLACE( old_fd, fd , addr )
if( dup2( old_fd, fd ) < 0 )
{
LOG( ERR_DUP2, #old_fd " with " #fd );
goto addr;
}
ターミナルからの出力は次のとおりです。
Polling pipe for data...
Data has been received: No data was read.
No data was read.
No data was read.
No data was read.
No data was read.
Now closing...