2016-11-21 6 views
4

私はクローンしたプロセスを待つことを試みています。しかし、親がシステムコールをwaitidにすると、straceを使うときには-1 ECHILDになります。このここに見られるように作成された子のためのPIDを返すクローンコールにもかかわらず:waitid syscallを使用してアセンブリ内のクローンされた子を待っています

clone(child_stack=0x7ffe2b412d10, flags=CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWPID) = 3735 
waitid(P_PID, 3735, NULL, WEXITED, NULL) = -1 ECHILD (No child processes) 

私は繰り返しwaitidを呼び出すループを作る場合、それは最終的に子供を待っているの予想される結果を与えます。それは、子供がまだ適切に始まっていないが、PIDを与えられている競合状態があると私に信じさせる。

以下は、関連するアセンブリコードです:私はwaitidに第三(siginfo_t *infop)の引数としてNULL渡している

_start: 
    mov rax, SYS_CLONE 
    mov rdi, CLONE_FLAGS 
    mov rsi, rsp 
    mov rdx, 0 
    mov r10, 0 
    syscall 

    cmp rax, 0 
    je _clone 

    mov rdi, PPID  
    mov rsi, rax ; pid 
    mov rdx, 0 
    mov r10, 4  ; exited 
    mov rax, SYS_WAITID 
    syscall 

    mov rdi, OK_EXIT 
    jmp _exit 

_clone: 
    mov rax, SYS_EXECVE 
    mov rdi, [rsp + 16] 
    lea rsi, [rsp + 16] 
    lea rdx, [rsp + 40] 
    syscall 

    mov rdi, rax 
    jmp _exit 

_exit: 
    mov rax, SYS_EXIT 
    syscall 

注意と私は適切にすべての仕事を作るために、構造体をセットアップする必要があると思われます、しかし、私はアセンブリでそれを行う方法の例を発見していない。どうやってやるの?私は間違っていると私は言及したループの回避策に頼らなければならない?この場合には

+2

で動作 'infop'はオプションです、それはあなたの問題とは無関係なのです。それを設定することは、適切な量のスペースをどこかで、スタックから都合よく割り当てることと同じくらい簡単です。 – Jester

+0

@Jesterどのような問題が起こっているのか(クローンされたpidでwaitidを呼び出し、ECHILDを戻り値として取得するタイミングの問題に関して)また、私は 'siginfo_t'のドキュメントを見つけようとしましたが、ソースファイルを読みにくいものがいくつか見つかりました。あなたが知っているドキュメントはありますか? –

+1

私は[この質問はここにあります](http://stackoverflow.com/questions/13853524/why-doesnt-waitid-block-until-child-terminates)しか見つかりませんでしたが、同様の問題。私はカーネルソースをチェックしましたが、 'ECHILD'は何よりも早くsiginfoに返されます。 – Jester

答えて

1

、一つはcloneを呼び出すときinclude/uapi/linux/sched.hで説明したようにSIGCHLDが出口で子によって送信されるように、flags=SIGCHLD | ...を追加する必要があります。

このガスコードのみSIGCHLD

.globl _start 

.text 
a:.quad 1 
    .quad 0 
b:.quad d 

c: 
mov $56,%rax 
#SIGCHLD 
mov $17,%rdi 
mov $b,%rsi 
syscall 
ret 

d: 
mov $35,%rax 
mov $a,%rdi 
syscall 
mov $60,%rax 
syscall 

_start: 
call c 
mov %rax,%rsi 
mov $247,%rax 
mov $1,%rdi 
mov $4,%r10 
syscall 
mov $60,%rax 
syscall 
関連する問題