Re: [问题] fork回传的值

楼主: leolarrel (真.粽子无双)   2026-02-23 17:14:43
※ 引述《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()返回
希望有帮助到你
作者: ttucse ((((>( ̄▽ ̄)<))))   2026-02-23 17:32:00
我懂了。非常感谢你。我以为这个板很久没文章,会没什么人看了。没想到你这么快回答我。PC是Program Counter是不是,如果我没记错。
楼主: leolarrel (真.粽子无双)   2026-02-24 12:35:00
linux板上也是很多高手,你若怕这边没人回也可以在那边
作者: ttucse ((((>( ̄▽ ̄)<))))   2026-02-24 21:35:00
我以为linux板是讨论使用linux的,所以没有去那边问。
作者: Bencrie   2026-02-25 09:01:00
可以顺便去看一下 system() 怎么实作的。fork+exec

Links booklink

Contact Us: admin [ a t ] ucptt.com