大佬教程收集整理的这篇文章主要介绍了linux – 使用waitid系统调用在程序集中等待克隆的子进程,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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,我怀疑我需要正确设置该结构以使一切正常,但我没有找到任何关于如何在汇编中执行此操作的示例.我怎样才能做到这一点?或者我错了,我只需要诉诸我提到的循环解决方法?
此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,请注明来意。