捕获孩子stdio / stderr

时间:2017-07-30 06:27:08

标签: linux stdout capture

我试图在分叉后捕获一个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文件描述符的后续读取不返回任何内容。

1 个答案:

答案 0 :(得分:1)

似乎我在SYS_DUP2调用中混淆了RSI和RDI。 一切似乎现在都运作良好。 干杯