學習linux期間,看到一個陳述句 pid_t pid = fork();
想要理解pid_t 與 fork() 的意義為何,
pid_t是一個資料型別,定義的型別是行程號id,fork()函式則回傳一個id號
pid_t需要頭檔案 <sys/types.h> 支持
分析一波

運行結果如下圖

運行發現,在執行了上面7次后,又運行了兩次
從運行結果開始分析fork()
1)父行程初始化
2)父行程呼叫了fork(),fork為系統呼叫,進入內核
3)內核根據父行程復制一個子行程,父子兩個行程資訊一樣,代碼和資料也相同,所以都會執行接下來的陳述句,如圖

4)兩個行程都進入內核然后等待從內核中回傳,但是究竟是父行程先回傳還是子行程先回傳呢,就取決于內核的調度演算法了
5)當父行程被調度時,pid變數被fork()賦予的值是子行程的id,是大于0的,所以就呼叫第二個message賦值,并執行3次for回圈
6)如果某時刻子行程被呼叫了,就會從內核中被回傳,回傳的值是0,就會執行第一個message賦值,并執行6次for回圈,(在這個程序中,兩個行程對于message與n變數的賦值是互不影響的)
7)父行程列印一次睡眠1秒,在這1秒中子行程很可能被調度,子行程列印一次也休眠1秒,又有可能調度父行程,所以基本上是父子行程輪流調度列印,如果將sleep去掉,結果是:

就會發現是父行程執行結束后子行程才有被調度的空間
8)這個程式是在shell下運行的,shell也是一個行程,而且是父行程的父行程,在父行程結束之后,shell會認為行程結束了,然后列印shell提示符,然而此時子行程還在運行,所以才會在shell提示符后輸出資訊
總結:
fork()函式的特點是“呼叫一次,回傳兩次”,父行程中呼叫一次,父子行程中回傳兩次,本來是一個控制流程的程式,在呼叫fork()函式之后會裂開變為兩個控制流程,'fork'為“派生、分支”,父行程的fork回傳的是子行程的id,子行程中的fork回傳的是0
12/12/20 DJ
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/233742.html
標籤:Linux
上一篇:磁盤掛載——ext4方式
下一篇:運維管理命令系列--ip命令詳解
