作者leolarrel (真.粽子无双)
看板LinuxDev
标题Re: [问题] fork回传的值
时间Mon Feb 23 17:14:43 2026
※ 引述《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()返回
希望有帮助到你
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.98.66 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/LinuxDev/M.1771838085.A.8E5.html
1F:推 ttucse: 我懂了。非常感谢你。我以为这个板很久没文章,会没什麽人 02/23 17:32
2F:→ ttucse: 看了。没想到你这麽快回答我。 02/23 17:32
3F:推 ttucse: PC是Program Counter是不是,如果我没记错。 02/23 17:35
4F:→ leolarrel: linux板上也是很多高手,你若怕这边没人回也可以在那边 02/24 12:35
5F:推 ttucse: 我以为linux板是讨论使用linux的,所以没有去那边问。 02/24 21:35
6F:推 Bencrie: 可以顺便去看一下 system() 怎麽实作的。fork+exec 02/25 09:01