Re: [問題] fork回傳的值
※ 引述《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://www.ptt.cc/bbs/LinuxDev/M.1771838085.A.8E5.html
推
02/23 17:32,
20小時前
, 1F
02/23 17:32, 1F
→
02/23 17:32,
20小時前
, 2F
02/23 17:32, 2F
推
02/23 17:35,
20小時前
, 3F
02/23 17:35, 3F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):