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