多数のワーカー スレッドを持つ C アプリケーションがあります。ワーカー スレッドがブロックされないことが重要なので、ワーカー スレッドがディスク上のファイルに書き込む必要がある場合は、ワーカー スレッドをメモリ内の循環バッファに書き込ませ、そのバッファをディスクに書き込むための専用スレッドを用意します。
ワーカー スレッドはブロックしなくなりました。専用スレッドは、ワーカー スレッドに影響を与えることなく、ディスクへの書き込み中に安全にブロックできます (ディスクへの書き込み中にロックを保持しません)。メモリ バッファーは、ライター スレッドが追いつくのに十分な大きさに調整されています。
これはすべてうまく機能します。私の質問は、stdout に同様のものを実装するにはどうすればよいかということです。
メモリ バッファーに書き込むために printf() をマクロ化することはできますが、stdout に書き込まれる可能性のあるすべてのコードを制御することはできません (一部はサードパーティのライブラリにあります)。
どう思いますか?NickB
ベストアンサー1
を使うというアイデアは気に入りました。また、次のようにしてパイプにfreopen
リダイレクトすることもできるかもしれません。stdout
重複そして重複2、そしてread
パイプからデータを取得するために使用します。
次のようなものです:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAX_LEN 40
int main( int argc, char *argv[] ) {
char buffer[MAX_LEN+1] = {0};
int out_pipe[2];
int saved_stdout;
saved_stdout = dup(STDOUT_FILENO); /* save stdout for display later */
if( pipe(out_pipe) != 0 ) { /* make a pipe */
exit(1);
}
dup2(out_pipe[1], STDOUT_FILENO); /* redirect stdout to the pipe */
close(out_pipe[1]);
/* anything sent to printf should now go down the pipe */
printf("ceci n'est pas une pipe");
fflush(stdout);
read(out_pipe[0], buffer, MAX_LEN); /* read from pipe into buffer */
dup2(saved_stdout, STDOUT_FILENO); /* reconnect stdout for testing */
printf("read: %s\n", buffer);
return 0;
}