1

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

あとは、通信の各方向に1つずつ、合計2つのファイルハンドルを作成し、通信をバッファリングする必要があります。これはどのように行うことができますか?

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

特に、一方のスレッドがscanf( "%s"、&x)を呼び出すと、もう一方のスレッドが文字列を書き込んで空白追加するまでブロックされることが重要です(したがって、文字列は完全に書き込まれる前に読み取られません)。

4

1 に答える 1

2

パイプが使えます。http://linux.die.net/man/2/pipe。printfとscanfをオーバーライドする代わりに、stdoutとstdinをリダイレクトするだけです。ただし、printfとscanfは再入可能ではないため、注意してください。

于 2011-06-29T21:46:39.953 に答える