2011-09-02 16 views
5

これは、コンピューティングシステム101の質問のように思えますが、私は困惑しています。内部でキャプチャ/リダイレクトstdout?

私はC/C++プロジェクトAの既存のコードを自分のプロジェクトBに統合しています.AとBは両方とも、単一の実行可能なスレッドプロセスにリンクされます。プロジェクトAのコードはprintfを大量に出力して出力します。これは問題ありませんが、私はその出力を自分のバッファに取り込みたいと思います。 printf呼び出しが書き込まれたら、stdoutから読み込む方法はありますか?私はプロセスやパイプをフォークできません。そして、poll()stdoutやdup()への私の努力は成功しなかった(私はここで何か間違っているかもしれない)。

+0

Aの出力をBにパイプすることはできませんか? ( '$ commandprompt ./A |。/ B')。私はそれらの両方が実行可能であり、AがBの前に実行できると仮定しています –

+0

実行時にそれらを接続するためにパイプを使用してseprate実行可能ファイルとしてそれらを保持したいと思うようなサウンド。 –

+0

残念ながら、いいえ。 AとBは1つのexecにリンクする必要があります。 – MapMaker

答えて

4

に作成したパイプを閉じることができます。

#include<stdio.h> 

main(int argc, char** argv) { 
    FILE *fp = freopen("output.txt", "w", stdout); 
    printf("Hello\n"); 
    fclose(fp); 
} 

これを実行すると、printf出力がoutput.txtに表示され、何も画面に表示されません。

これでファイルを開いてデータを読み取ることができます。または、mmapをメモリ空間に挿入してそのように処理することもできます。

0

いったん消えてしまえば消えてしまいます。すべてを1つの実行可能ファイルにコンパイルしたい場合は、Aのコードを検索して置換し、すべてのファイルを自分のストリームに置き換えてコピーして渡す必要がありますスタンダードに。

+0

ニックが、これは実際に私が実装されますが、私は単に世論調査と間違って何かをやっていたことを期待していた回避策でした()とdup()です。ああ、時間を前に進める!答えをありがとう。 btw私はあなたのアイコンが好きです:) – MapMaker

+0

それは洗い流され、その事をするために消えます。パイプとstdoutの全体的なアイデアは、アプリケーションがこれらのことを回避しないということです。彼らは必要なだけバッファリングし、すぐに取り除きます。そうすれば、アプリケーションを一緒に配管してもメモリはあまり使われません。以前のすべての出力が後で使用できるように設計すると、それを得る方法はありません。 –

+0

あなたはいつも '#define printf(...)fprintf(myfile、__VA_ARGS __)' –

2

あなたは()をprintfの前に、FD 1、およびdup2の()あなたが記述子を変更するfreopenを使用することができますが、FD 1.

+0

...を実行することができます。fd1を閉じる必要はありません - 'dup2'はそれを行います。 – dragonroot

1

言うまでもなく、stdoutとstderrのリダイレクトを非常に簡単にする便利なU-Streams Cソースコードライブラリがあります。また、複数の宛先に簡単にリダイレクトすることもできます。そして、あなたはstdoutとstderrのふるまいとまったく同じ方法で使うことができるだけでなく、独自のストリームを作成することができます。

本当に便利なU-Streams Cライブラリを探してください。

関連する問題