2011-06-29 19 views
1

Linuxでの作業とC++を使用しています。 私はスレッドを開始するプログラムを持っています。 メインスレッドと子スレッドがprintfとscanfで通信する必要があります (両方のスレッドのコードはscanfとprintfを使い、stdinとstdoutと通信していると仮定しています。 私はprintfとscanfをオーバーライドできたので、これらの関数を完全に制御しています (そして、* pthread_self *を使って呼び出しスレッドを識別できます)。printfとscanf(linux)によるスレッド通信

2つのファイルハンドルを作成し、通信の方向ごとに1つずつ作成し、通信をバッファします。 これはどのように行うことができますか?

ディスク上のファイルに書き込むことは、通信が非常に長く、ディスクに保存する余裕がないため、私の問題を解決しません。しかし、私は、読み込みスレッドが書かれた後もデータを読んでしまうので、多くのバッファリングは必要ないことを知っています。

特に

、一つのスレッドがのscanf(「%sの」、& X)を呼び出した場合、他のスレッドがいくつかの文字列を書き込むまで、それがブロックされることが重要である空白文字を追加します(そうた文字列ではありません完全に書き込まれる前に読んでください)。

答えて

2

パイプを使用できます。 http://linux.die.net/man/2/pipe。 printfとscanfを上書きするのではなく、単にstdoutとstdinをリダイレクトすることができます。 printfとscanfは再入可能ではないので注意してください。

+0

はfprintfとfscanfのリエントラントですか? – user302099

+0

(同時呼び出しが別のファイルハンドルに書き込むと仮定した場合) – user302099

+0

呼び出し元のスレッドが誰であるかを認識するためにscanfとprintfをオーバーライドする必要があります。しかしパイプは本当に私が尋ねたものに対する解決策なので、私は受け入れました。ありがとうございました。 – user302099