2012-02-13 7 views
3

私はバイナリストリームを非常に密接に(バッファリングされていない)パイプ処理する必要のある小さなプログラムに取り組んでいます。それはselect()の多重化に依存しなければならず、さらに価値がないので、入力が増えない限り既存の入力を保持することはできません。C stdio unbuffered multiplexing

システムコールを使用することは可能ですが、もう一度、stdioを便利に使用したいと思います(文字列フォーマットも含まれます)。

  • select()は、バッファされていないstdioを使用している限り、ストリームのファイル記述子に安全に使用できますか?そうでない場合は、セットからブロックされないファイルストリームをどのようにして判断できますか?
  • char-by-char関数(getchar()とフレンド)のほかに、libcのすべての入力をアプリケーションに転送する呼び出しはありますか?

答えて

2

私はそれがfがバッファリングされていないとき、実際の作業にfileno(f)selectをすべき使用して、標準化によって認可されますかどうかに完全に明確ではないですしながら。ただし、バッファされていないstdioは病的に悪いことがあります。ストリームをまったく使用する前に、最初の操作以外のバッファリングを変更することはできません。

フォーマットされた出力しかできない場合は、新しく標準化されたPOSIX-2008 dprintf(およびvdprintf)関数を使用して問題を解決することをお勧めします。

+0

+1これは非常に良い答えと思われます(そして、dprintfのおかげで、私はそれが存在しなければならないことを知っていました!)。誰でもそれを打つことができますか? –

+0

dprintf()は、利用可能な場所があればいつでも入手できます。 –

関連する問題