2

次のコードがあります。

int buffer_max_size = 1024;
char* buffer = new char[buffer_max_size]
FILE* cout_file = fdopen(cout_pipe[0], "r");
while (fread( &buffer[0], sizeof(char),sizeof(char)*buffer_max_size, cout_file) != 0 )
{...}

cout_file は FILE* 型で、バイナリの stdout に接続されています。そのバイナリは、5 秒間隔で std_out にテキストを出力します。

cout_file に buffer_max_size バイトが含まれるまで、fread がブロックされているようです。それは正常ですか?

ブロックせずに現在パイプにあるものを読み取れるようにしたい..それは可能ですか?

4

1 に答える 1

2

ノンブロッキング I/O が必要な場合は、OS の関数readfcntl関数を使用します。

<stdio.h>API (および も) は追加のバッファリングを実行し、<fstream>早期に終了する読み取りを自動的に再試行する場合があります (たとえば、シグナルによって中断されたために)。それのための。

すべての OS がこれらの POSIX 名を使用するわけではありません。その場合、オプションはプラットフォーム固有のコード (たとえば、Windows では と を使用ReadFileするSetNamedPipeHandleState) か、Boost ASIO などのラッパー ライブラリを使用して違いを抽象化します。ただし、ラッパーが非ブロッキング動作を公開するように設計されていることを確認してください。そうしないと、次のような問題が発生します。<stdio.h>

于 2014-05-26T21:01:11.040 に答える