1

名前付きパイプのバッファをポーリングする短いプログラムを書いています。テストするために、'nobody' にログインし、パイプにエコーします。ハングしている間に、別のユーザーからログインして、バッファーを読み取るプログラムを実行します。実行すると、プログラムは何も返さず、他のユーザーはシステムからログアウトされます。読み取り関数は次のとおりです。

void ReadOut( char * buf )
{
    ZERO_MEM( buffer, BUF_SIZE );

    int pipe = open( buf, O_RDONLY | O_NONBLOCK );

    if( pipe < 0 )
    {
            printf( "Error %d has occured.\n" , pipe );
            return;
    }

    while( read( pipe, buffer, 2 ) > 0 ) printf( "%s \n" , buffer );
    close( pipe );

    return;
}
4

1 に答える 1

1

この機能は、O_NONBLOCKを取り出したときにも機能します

ファイル記述子を非ブロックとしてマークすると、通常はブロックできるすべての操作(たとえば、、read(2))が代わりにwrite(2)返さ-1れ、が設定されerrno = EAGAINます。

したがって、あなたの場合、readすぐに-1シグナリングを返します。「今は準備ができていません。後でもう一度やり直してください」。

于 2013-03-17T04:51:42.100 に答える