※ 引述《ttucse ((((>( ̄▽ ̄)<))))》之铭言:
: 我在读minix的那本作业系统教科书
: 读到system call的部分
: 介绍呼叫fork时
: 书上写
: 回传的值如果是0代表目前的行程是子行程
: 如果是正整数则代表目前的行程是父行程
: 回传的值是子行程的pid
: 我不懂的点是
: 你呼叫fork时
: 目前的行程一定是父行程吧
: 父行程产生一个子行程
: 然后回传子行程pid
: 怎么会有回传0
: 表示目前是子行程的情况
因为呢
当呼叫fork()时
系统将目前父行程"拷贝"出一个新的行程
所以~
当然!
他们这两个行程的"目前程式执行位置"(也就是ECS:EIP or PC 暂存器)也是一模一样
的,你可以想像他们目前这两个行程的"目前执行位置"都在fork()函式里面
然后两个行程开始继续跑,也就是说这两个父子行程都会从fork() 函式返回
系统核心自动会将父行程fork()返回值填入子行程的pid, 子行程的fork()返回值
填入0
所以,检查fork()的返回值,就可以知道目前这个行程是父还是子
一般人当接触的时候, 很难理解为什么生出子行程后子行程一样从fork()返回,
直觉上,人类会认为既然fork(), 那子行程自然要从我指定的,或是程式的main()
,或是我指定的另一个elf档案开始执行.但,UNIX的fork()设计就是如此,fork()
本质上一个行程的"当下的拷贝",连"目前程式执行位置"也是原样拷贝
因此,父子俩行程的程式执行必定都从fork()返回
希望有帮助到你