2016-11-08 7 views
1

Linuxでプロセス間通信にパイプを使用して、fdopenを使用してパイプからストリームを作成し、その代わりread/writeのストリームにfread/fwriteを使用する任意の利点はありますか? fdopen()を使用してファイルディスクリプタから作成Linux上のパイプ上でストリームを使用する価値がありますか?

+0

[名前付きパイプ](https://en.wikipedia.org/wiki/Named_pipe)を作成する価値があるのですか? –

+0

stdio.hはバッファリングとフォーマットされたIO(fprintf/fscanf)を提供します。それを使用するかどうかはあなたの選択です。 –

+0

@ Peregring-lkm、no。 –

答えて

-1

FILE*は、あなたがしてもしなくてもよいが必要な場合があり、バッファリング、エラーチェック(feof()ferror())などの追加機能を提供します。 fdopen()を使用する利点はありません。これは、パイプ自体が一定レベルのバッファリングを行うためです(現代のLinuxでは64Kです)。 さらに、パイプがIPCで使用されるほとんどの使用例では、バッファリングは望ましくありません。

だから、私はfdopen()を使用する利点はありません。 read() & write()を直接使用すれば十分であり、しばしばIPCで望ましい。

+0

_パイプ自体は一定レベルのバッファリングを行います_パイプはカーネルによって維持されるバッファです。 –

+0

'fxxxx'呼び出しを使って提供されるバッファリングはユーザプロセスで行われますが、' write'/'read'はそれぞれシステムコールが必要です。前者は、小さな書き込み/読み取りの多くの場合に高速になる可能性があります。 – davmac

+0

@MaximEgorushkin "pipe is a buffer"は誤解を招きます。パイプは、バッファされた通信チャネルです。 – davmac

0

標準入力/出力(標準入出力)

fdopenstdioライブラリの一部です。 stdio manualから、あなたはこれを取得:

標準I/Oライブラリは、シンプルかつ効率的なバッファリング ストリームI/Oインタフェースを提供します。入力および出力は論理データ ストリームにマッピングされ、物理I/O特性は隠されます。 関数とマクロは以下のとおりです。より詳しい情報は、個々のマニュアルページの から入手できます。

そして:

stdioライブラリはライブラリlibcの一部であり、(1)とPC(1)コンパイラCCで、必要に応じてルーチンが 自動的にロードされます。 以下のマニュアルページのセクションでは、使用するファイルが であるか、 関数のコンパイラ宣言がどのようなものか、どの外部変数が対象かを示しています。のlibc の一部である

、それはこれらの機能を使用して書かれたプログラムは、すべての標準準拠のコンパイラでコンパイルすることを意味します。 のオープン/ライトPOSIX)を使用してプログラムを作成すると、プログラムはPOSIXシステムでのみ実行されます。

ですから(a)の、それが原因で可搬性の価値があるとあなたが唯一のLinuxでそれを使用している場合、その後open/writeを使用すると、あなたは抽象化の全体の多くを取り除くため(b)のそれは、それだけの価値はないという理由でした(stdioから) - GNU GLibCの下にあるopen/writeは、syscallsの周りのラッパーであることを覚えておいてください。実際に直接呼び出しているわけではないので、少量の抽象化が存在します。

0

パイプに書き込むには、システムコールとコンテキストスイッチが必要です。これらを最小限に抑えたい場合は、stdio関数を使用してユーザー空間でバッファリングすることができます。これにより、書式付き出力もfprintfになります。

関連する問題