我试图在分叉后捕获一个childs stdio / stderr(Linux)。 我玩过sys_pipe和sys_dup2而没有运气。我所提供的大多数参考文献都指的是孩子要完成的工作,但由于我无法控制孩子,我不确定我必须做些什么。
据我所知,到目前为止,我需要打开一个管道并在分叉之前复制句柄。父母然后尝试读取管道,但它没有返回任何东西......这样的代码是..
mov rax,22 ; open a pipe
mov rdi,h_Pipe
syscall
mov rax,33
mov rdi,1 ; duplicate stdout to pipe write
mov esi,dword[h_Pipe+4]
syscall
mov rax,33 ; duplicate stderr to pipe write
mov rdi,2
mov esi,dword[h_Pipe+4]
syscall
........叉... ........等待孩子完成
mov rax,0 ; Read the pipe
mov edi,dword[h_Pipe]
mov rsi,w_Buffer
mov rdx,256
syscall
有人可以帮忙吗?
要打算.....
mov rax,57 ; fork
syscall
mov [CHILD_PID],rax
.child: cmp qword[CHILD_PID],0
je _CHILD
mov rax,3 ; Close
mov edi,dword[pipe_write]
syscall
mov r15d,dword[pipe_read]
jmp _RUN_EXIT
_child: mov rax,3;关 mov edi,dword [pipe_read] 系统调用
mov rax,33
mov rdi,1 ; duplicate stdout to pipe write
mov esi,dword[pipe_write]
syscall
mov rax,33 ; duplicate stderr to pipe write
mov rdi,2
mov esi,dword[pipe_write]
syscall
sys_execve
对pipe_read文件描述符的后续读取不返回任何内容。
答案 0 :(得分:1)
似乎我在SYS_DUP2调用中混淆了RSI和RDI。 一切似乎现在都运作良好。 干杯