Process strace中的系统调用
我在某个程序Process strace中的系统调用,process,pipe,system-calls,strace,Process,Pipe,System Calls,Strace,我在某个程序A上调用了strace,该程序分为两个子程序:B和C 在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) = 7
A
上调用了strace
,该程序分为两个子程序:B
和C
在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
我正试图用C重写程序
A
。在这种情况下,我真的不需要知道那些文件描述符3
,4
,5
和6
代表什么,是吗?有没有办法找出它们是什么?我知道3
代表stderr
0代表STDIN,1代表STDOUT,2代表stderr。所有较高的数字取决于应用程序。在本例中,我怀疑它们是用来捕获新分叉程序的stdout/stderr的。这意味着“wc”可能在其stdout连接到fd3和stderr连接到fd4的情况下运行,因此主应用程序可以控制wc的输出 您应该再次尝试使用-f标志运行strace,以便它跟随forks。目前,您只能看到顶级流程的功能,而无法看到子流程的功能
顶级流程将创建两个管道。程序使用管道彼此通信。第一个管道的读取端位于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()
为什么文件描述符是空文件呢?他们将如何处理数据管道?为了能够在C中实现它,什么是
4
和所有更高的文件描述符都无关紧要,不是吗?我可以将它们传递到管道中,对吗?文件描述符是(打开的)管道的表示。你需要一个fd来识别你写信的目的地。-由于您的strace不包含read()或write(),因此似乎没有任何内容通过这些管道发送,这有点奇怪但是“fork(program)”建议您编辑它:-)