为什么fork()
函数在父进程和子进程中返回不同的值?
假设父进程及其子进程都没有写操作。
答案1
父母或孩子不需要将任何 pid 放入对方的内存中。
在分叉发生时,内核的任务是复制父进程的整个进程空间(这可以在没有完整副本的情况下实现,例如通过最初将页表条目复制到写入某些内存)。
在任何系统调用期间,内核都能够通过在将用户进程返回到用户模式之前修复用户进程堆栈来传递调用的返回值。这就是系统调用的所有返回值的来源。
对于内核来说,修复父级和子级具有不同值的两个堆栈帧是绝对没有问题的。两个进程都没有执行,它们都在系统调用中,因此堆栈帧定义良好,并且内核可以访问所有内存。