2012-02-22 7 views
0

straceは、Aという2つの子プログラムをフォークするプログラムのうち、とCと呼ばれました。 stracestrayscのシステムコール

、私はsyscallsを次ています

pipe[([3,4]) = 0 
pipe([5,6]) = 0 
fork(wc) = 7135 
fork (gnetcat) = 7136 
close(3) = 0 
close(5) = 0 
close(4) = 0 
close(6) = 0 
wait4(-1, NULL, 0, NULL) = 7136 
wait4(-1, NUKLL, 0, NULL) = 7135 

が、私はその場合はCでプログラムAを書き換えしようとしています、私は本当に知っている必要はありませんどのようなものをファイルディスクリプタ3456はどうですか?彼らが何であるかを知る方法はありますか?私は3stderrであることを知っています。

答えて

0

0 ist STDIN、1はSTDOUT、2はSTDERRです。すべての数値はアプリケーションによって異なります。この場合、私は彼らが新しくフォークされたプログラムのstdout/stderrをキャプチャするために使用されていると思われます。これは、おそらく "wc"がstdoutがfd 3に接続され、stderrがfd 4に接続されているため、メインアプリケーションがwcの出力になる可能性があります。

+0

はなぜ、空のファイルのファイル記述子ですか?彼らはデータを配管するのにどのように機能しますか? Cでそれを実装できるようにするには、本当に '4 'とそれより上位のすべてのファイル記述子がどういう意味であるのでしょうか?パイプにそれらを渡すことはできますか? – darksky

+0

ファイル記述子は(開かれた)パイプの表現です。書いている場所を特定できるようにするには、fdが必要です。 - あなたのstraceにはread()やwrite()が含まれていないので、これらのパイプには何も送信されていないようです。 - しかし、 "fork(プログラム)"はあなたがそれを編集したことを示唆しています:-) – Sec

1

-fフラグを指定してstraceを再度実行して、フォークを実行するようにしてください。現時点では、トップレベルプロセスが何をしているかだけ見ることができます。あなたの子プロセスが何をするのかを見ることはできません。

トップレベルプロセスは2つのパイプを作成します。パイプは、プログラムが相互に通信するために使用されます。第1のパイプは、fd 3に読取り終了点を有し、fd 4に書込み終了点を有する。第2のパイプは、fd 5に読取り終了点を有し、fd 6に書込み終了点を有する。

トップレベル・プログラムは、 2つの子プログラムを呼び出すと、子プログラムが内部的に使用しているように見えます(両方ともfdsのコピーを取得します)。これは通常、親プロセスが子供とコミュニケートするためにオーファーに開いた状態を維持することを期待しているので、通常は普通です。あなたのトレースに、各フォークの後でfdsに何が起こったかに関する重要な情報が欠落しているように見えます。

これは私がprogcessは、例えば、子供から標準出力をキャプチャする順序どおりのパイプを開いたかどうかを確認するために期待するものです。

parent_pid: pipe[3,4] 
parent_pid: clone() = child_pid 
parent_pid: close(4) 
child_pid: dup(4,1) 
child_pid: close(4) 
child_pid: close(3) 
child_pid: execve(some program) 
child_pid: write(1) 
parent_pid: read(3) 
parent_pid: wait(child_pid) 
child_pid: exit()