захватить дочерний stdio/stderr

Я пытаюсь захватить дочерний 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

........ fork... ........ дождитесь завершения дочернего элемента

    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 ничего не возвращают.


person roger tunnicliffe    schedule 30.07.2017    source источник
comment
Вы имеете контроль над потомком до тех пор, пока не вызовете exec*().   -  person Ignacio Vazquez-Abrams    schedule 30.07.2017


Ответы (1)


Кажется, я перепутал RSI и RDI в вызове SYS_DUP2. Теперь все работает хорошо. Ваше здоровье

person roger tunnicliffe    schedule 31.07.2017