2016-10-06 16 views
0

私は1つの他のプログラムのprintf()を介在させるタスクを書いています.1つの子プロセスをフォークし、すべてのプログラムの出力を子プロセスにリダイレクトします。以下のコードは、私がまだ実行していないものを書いたものです。この関数を追加する必要があります。子プロセスをフォークして、すべてのプログラム出力を子プロセスにリダイレクトする方法はありますか?

int printf(char* format, ...) 
{ 
    int res; 
    static void *(*mallocp)(size_t size); 
    char *error; 
    if (!mallocp) { 
    mallocp = dlsym(RTLD_NEXT, "printf"); 
     if ((error = dlerror()) != NULL) { 
      fputs(error, stderr); 
      exit(1); 
     } 
    } 
    va_list args; 
    va_start(args, format); 
    res=mallocp(format, args); 
    va_end(args); 
    return res; 
} 

私は1つの同様の解決策を見出しますが、少し異なります。 Redirect stdin and stdout in child in c 子プロセスをフォークしてパイプをうまく設定した後で、どうすれば親プロセスがシステム "printf" mallocpに進み、子プロセスにリダイレクトされるべきstdoutを与えることができますか。 (この例ではsystem("./calc/calc ");のようなものかもしれません)私はこの分野では新しいです。教えてくださいますか ?

私はプロセス全体の実装を理解できないのか分かりません。なぜならそれは1つの質問であり、私は公式の解決策を知らないからです。

+0

あなたがこの方法を解決しようとしているproblem_ _actualは何ですか? –

答えて

0

"dup2"を使用し、 "stdout"を "pipe"書き込みファイル記述子に置き換えます。

あなたのパイプが親から子にうまく構成されていると仮定します。

次に、子供は他端から読むことができます。

dup2(fd、1); // 1は標準出力

ためである

番目のオプション:

使用する共有メモリ(場合には、あなたのパイプが任意のより良いではありません)。

共有メモリオブジェクトを作成します。

STDOUTを親から共有メモリにリダイレクトします。

子供が見ることができます。ここ

は例 http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/shm/example-1.html

+0

まあ、リンクは私のコードではなく、まったく同じ例です。私は 'system(" ./ calc/calc ");は私のqestionに応じて変更する必要がある場所だと思います。私は親プロセスを必要とします。 'printf'システムを実装しています。子はstdoutをlistenしています。 – shen

+0

共有メモリオブジェクトを試してみてください。更新された答え – Naidu

関連する問題