【问题标题】:Waiting for cloned child in assembly with waitid syscall使用 waitid 系统调用在程序集中等待克隆的孩子
【发布时间】:2016-11-21 08:46:59
【问题描述】:

我正在尝试等待我克隆的进程。但是,当父级对waitid 进行系统调用时,我在使用 strace 时会得到一个-1 ECHILD。尽管克隆调用返回了创建的孩子的 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) 参数传递给 waitid,我怀疑我需要正确设置该结构以使一切正常,但我还没有找到任何关于如何在装配中做到这一点。我怎样才能做到这一点?还是我弄错了,我只需要求助于我提到的循环解决方法?

【问题讨论】:

  • infop 是可选的,与您的问题无关。设置它就像在某个地方分配适当数量的空间一样简单,方便地从堆栈中。
  • @Jester 知道问题可能是什么(关于在克隆的 pid 上调用 waitid 并将 ECHILD 作为返回值的时间问题)?我也试图找到siginfo_t 的文档,但发现一些难以阅读的源文件。有你知道的文档吗?
  • 我只找到了this question here on SO,但除了表明其他人遇到了类似问题外,没有多大帮助。我检查了内核源代码,ECHILD 比对 siginfo 的任何操作都更快返回。
  • 您的clone 调用不包括SIGCHLD 标志,因此您正在创建一个所谓的克隆孩子。如果您将WEXITED|__WALL 作为标志传递给waitid,您的等待会更好吗?如果没有__WALL(或__WCLONE),waitid 应该只等待非克隆子代。
  • @MarkPlotnick 我刚刚将SIGCHLD 包含在标志中,waitid 现在总是成功。奇怪的是 waitid 最终会起作用(例如,当我反复调用 waitid 直到它没有出错时),知道为什么吗?如果您想要一些互联网积分,请将您的评论放在答案中:)

标签: linux assembly x86-64


【解决方案1】:

在这种情况下,需要在调用clone时添加flags=SIGCHLD | ...,以便子进程在退出时发送SIGCHLD,如include/uapi/linux/sched.h所述。

此 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    相关资源
    最近更新 更多