用waitid系统调用等待克隆的子程序

我试图等待我已经克隆的过程。 但是,当父母使系统调用waitid我使用strace时得到-1 ECHILD 。 尽pipe克隆调用为创build的子项返回一个PID,如下所示:

 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。

以下是相关的汇编代码:

 _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 

请注意,我将NULL作为第三个( siginfo_t *infop )parameter passing给waitid ,我怀疑我需要正确设置该结构以使所有工作正常,但是我还没有find任何有关如何在汇编中执行此操作的示例。 我怎样才能做到这一点? 还是我错了,我只是诉诸我提到的循环解决方法?

在这种情况下,需要添加flags=SIGCHLD | ... flags=SIGCHLD | ...在调用clone ,这样SIGCHLD就是在include / uapi / linux / sched.h中所描述的那样在退出时由子SIGCHLD发送的。

这个GAS代码只适用于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