我正在尝试编写一个执行fork()
系统调用的程序,而子/父每个编写一个不同的字符串并exit(0)
。
问题是 - 虽然fork()
成功(因为我看到2行输出),但由于某种原因,父进程和子进程都输出父字符串。
以下是代码:
BITS 64
section .data
msg1: db "Hello from child", 0x0a
len1: equ $-msg1
msg2: db "Hello from parent", 0x0a
len2: equ $-msg2
section .text
global start
start:
xor rax,rax
mov rax,0x2000002 ; fork() syscall
syscall
test eax,eax
jne flow_parent
mov rax, 0x2000004 ; SYS_write
mov rdi, 1 ; stdout
mov rsi, msg1
mov rdx, len1
syscall
xor rdi,rdi
mov rax,0x2000001
syscall
flow_parent:
mov rax, 0x2000004 ; SYS_write
mov rdi, 1 ; stdout
mov rsi, msg2
mov rdx, len2
syscall
xor rdi,rdi
mov rax,0x2000001
syscall
我的输出:
$ nasm -f macho64 code.s -o code.o
$ ld -o code -e start -macosx_version_min 10.7 code.o
$ ./code
Hello from parent
Hello from parent
$
有关如何解决此问题的任何想法?
答案 0 :(得分:2)
首先,你在Mac OS X上进行系统调用,假设它的行为与Linux内核一样,这显然是错误的(Linux fork syscall convention!= XNU fork syscall convention)。 Mac OS X不支持用户直接进行系统调用而无需通过libSystem库。
现在把它放在一边,我不确定你正在运行哪个版本的XNU内核,但是如果你实际看一下libsyscall库中fork function的源代码,你呢? ll会发现使用edx寄存器(orl%edx,%edx)来确定进程是子进程还是父进程。
同样,这仍然不是实现这一目标的可靠方式,因为Apple可能会在未来轻松更改界面。