學習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