私はクローンしたプロセスを待つことを試みています。しかし、親がシステムコールを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
注意と私は適切にすべての仕事を作るために、構造体をセットアップする必要があると思われます、しかし、私はアセンブリでそれを行う方法の例を発見していない。どうやってやるの?私は間違っていると私は言及したループの回避策に頼らなければならない?この場合には
で動作 'infop'はオプションです、それはあなたの問題とは無関係なのです。それを設定することは、適切な量のスペースをどこかで、スタックから都合よく割り当てることと同じくらい簡単です。 – Jester
@Jesterどのような問題が起こっているのか(クローンされたpidでwaitidを呼び出し、ECHILDを戻り値として取得するタイミングの問題に関して)また、私は 'siginfo_t'のドキュメントを見つけようとしましたが、ソースファイルを読みにくいものがいくつか見つかりました。あなたが知っているドキュメントはありますか? –
私は[この質問はここにあります](http://stackoverflow.com/questions/13853524/why-doesnt-waitid-block-until-child-terminates)しか見つかりませんでしたが、同様の問題。私はカーネルソースをチェックしましたが、 'ECHILD'は何よりも早くsiginfoに返されます。 – Jester