Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Process strace中的系统调用_Process_Pipe_System Calls_Strace - Fatal编程技术网

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)”建议您编辑它:-)