Я пытаюсь захватить дочерний 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 ничего не возвращают.
exec*()
. - person Ignacio Vazquez-Abrams   schedule 30.07.2017