0

子プロセスで 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...
4

1 に答える 1

1

私はそれを働かせました。ファイル記述子を誤って置き換えていました。間違った記述子を置き換えましたが、古い記述子を閉じる前にそれを行っていました。上記のコードは、古いマクロを示しています。新しいマクロは (エラー チェックなし):

#define FD_REPLACE( old_fd, fd, addr )
close( old_fd );
dup2( fd, old_fd );
于 2013-03-21T06:26:08.807 に答える