2017-07-30 16 views
1

我試圖在fork(Linux)後捕獲孩子stdio/stderr。 我玩過沒有運氣的sys_pipe和sys_dup2。我提供的大部分參考資料都是指孩子要完成的工作,但由於我無法控制孩子,我不知道我必須做什麼。捕獲孩子stdio/stderr

從我瞭解到目前爲止,我需要打開一個管道並複製之前分手。父然後嘗試讀取管道,但它不返回任何東西...該代碼,因此是..

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 

任何人都可以協助嗎?

要calify .....

 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

直到你調用'exec *()',你才能控制孩子。 –

回答

1

看來我在SYS_DUP2調用中混淆了RSI和RDI。 現在一切似乎都很順利。 乾杯