0

我调用strace了一些A分叉两个子程序的程序:BC.

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,和代表什么4,对吗?有没有办法找出它们是什么?我知道是为了.563stderr

4

2 回答 2

1

您应该尝试使用 -f 标志再次运行 strace,以便它跟随分叉。目前你只能看到你的顶级进程做了什么,你看不到你的子进程做了什么。

顶级进程创建两个管道。管道被程序用来相互通信。第一个管道在 fd 3 上有读端,在 fd 4 上有写端。第二个管道在 fd 5 上有读端,在 fd 6 上有写端。

由于顶级程序在调用两个子程序后关闭了所有四个 fd,看起来它们只是由子程序在内部使用(它们都获得 fd 的副本)。这是不寻常的,因为通常我希望看到父进程保持打开状态以与子进程进行通信。看起来您的跟踪缺少一些关于每次分叉后 fds 发生了什么的重要信息。

这是我希望看到的进程是否正在打开管道以从孩子那里捕获标准输出,例如:

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。所有更高的数字都取决于应用程序。在这种情况下,我怀疑它们被用来捕获新分叉程序的标准输出/标准错误。这意味着“wc”可能在其 stdout 连接到 fd 3 和 stderr 到 fd 4 的情况下运行,因此主应用程序可以输出 wc。

于 2012-02-22T23:33:03.003 回答