fork()如何返回两次不同的值

pid=fork()

fork()内会用一段嵌入式汇编进行系统调用:int 0x80(具体代码可参见内核版本0.11的unistd.h文件的133行_syscall0函数)。

这时进入内核根据此前写入eax的系统调用功能号 便会运行sys_fork系统调用。

接着,sys_fork中首先会调用C函数find_empty_process产生一个新的进程,然后会调用copy_process将父进程的内容复制给子进程,

但是子进程tss中的eax值赋值为0(这也是为什么子进程中返回0的原因),当赋值完成 后,copy_process会返回新进程(该子进程)的pid,

这个值会被保存到eax中。这时子进程就产生了,此时子进程与父进程拥有相同的代码空 间,程序指针寄存器eip指向相同的下一条指令地址,

当fork正常返回调用其的父进程后,因为eax中的值是新创建的子进程号,所以,fork()返回 子进程号,执行else(pid>0);

当产生进程切换运行子进程时,首先会恢复子进程的运行环境即装入子进程的tss任务状态段,其中的 eax值(copy_process中置为0)也会被装入eax寄存器,

所以,当子进程运行时,fork返回的是0执行if(pid==0)。

http://blog.csdn.net/livingpark/article/details/4069049

http://blog.chinaunix.net/space.php?uid=20753645&do=blog&id=1877915

vfork为什么会段错误或者循环打印

http://hi.baidu.com/_kouu/blog/item/3e92640e3b6393e4ab645784.html

原文地址:https://www.cnblogs.com/moonflow/p/2459041.html