Linux   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了linux – 使用waitid系统调用在程序集中等待克隆的子进程大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在尝试等待我克隆的过程.但是,当父进程使syscall等待时,我在使用strace时得到-1 ECHILD.尽管克隆调用返回了创建的子节点的PID,如下所示: clone(child_stack=0x7ffe2b412d10, flags=CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWPID) = 3735 waitid(P_PID, 3735,
我正在尝试等待我克隆的过程.但是,当父进程使syscall等待时,我在使用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,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,我怀疑我需要正确设置该结构以使一切正常,但我没有找到任何关于如何在汇编中执行此操作的示例.我怎样才能做到这一点?或者我错了,我只需要诉诸我提到的循环解决方法

解决方法

在这种情况下,需要添加flags = SIGCHLD | …当调用clone时,所以孩子在退出时发送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

大佬总结

以上是大佬教程为你收集整理的linux – 使用waitid系统调用在程序集中等待克隆的子进程全部内容,希望文章能够帮你解决linux – 使用waitid系统调用在程序集中等待克隆的子进程所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。