0

私は、 2 つの子プログラムをフォークstraceするいくつかのプログラムを呼び出しました:と.ABC

にはstrace、次のものがあります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

Aプログラムを C で書き直そうとして3います。彼らが何であるかを知る方法はありますか?私は知っています。4563stderr

4

2 に答える 2

1

-f フラグを指定して strace を再度実行して、フォークに追従するようにしてください。現時点では、最上位プロセスの動作のみを確認できます。子プロセスの動作は確認できません。

最上位プロセスは 2 つのパイプを作成します。パイプは、プログラムが相互に通信するために使用されます。最初のパイプの読み取り終了は fd 3 で、書き込み終了は fd 4 です。2 番目のパイプの読み取り終了は fd 5 で、書き込み終了は fd 6 です。

最上位プログラムは 2 つの子プログラムを呼び出した後に 4 つの fd をすべて閉じるため、子プログラム (どちらも fd のコピーを取得する) によって内部的に使用されているように見えます。これは通常、親プロセスが子プロセスと通信するために開いたままにしておくことが期待されるためです。トレースには、各フォーク後に fds に何が起こったのかに関する重要な情報が欠けているようです。

これは、たとえば、プロセスが子から stdout をキャプチャするためにパイプを開いている場合に表示されると予想されるものです。

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()
于 2013-06-13T13:58:57.043 に答える
0

0はSTDIN、1はSTDOUT、2はSTDERRです。より高い数値はすべてアプリケーション次第です。この場合、フォークされたばかりのプログラムのstdout/stderrをキャプチャするために使用されていると思います。これは、「wc」がおそらくそのstdoutをfd 3に接続し、stderrをfd 4に接続して実行されることを意味します。したがって、メインアプリケーションはwcの出力を実行できます。

于 2012-02-22T23:33:03.003 に答える