學習linux期間,看到一個語句 pid_t pid = fork(); 想要理解pid_t 與 fork() 的意義為何,。 pid_t是一個數(shù)據(jù)類型,,定義的類型是進程號id,fork()函數(shù)則返回一個id號 pid_t需要頭文件 <sys/types.h> 支持 分析一波
運行結(jié)果如下圖
運行發(fā)現(xiàn),,在執(zhí)行了上面7次后,,又運行了兩次 從運行結(jié)果開始分析fork() 1)父進程初始化 2)父進程調(diào)用了fork(),fork為系統(tǒng)調(diào)用,,進入內(nèi)核 3)內(nèi)核根據(jù)父進程復(fù)制一個子進程,,父子兩個進程信息一樣,代碼和數(shù)據(jù)也相同,,所以都會執(zhí)行接下來的語句,,如圖
4)兩個進程都進入內(nèi)核然后等待從內(nèi)核中返回,但是究竟是父進程先返回還是子進程先返回呢,,就取決于內(nèi)核的調(diào)度算法了 5)當父進程被調(diào)度時,,pid變量被fork()賦予的值是子進程的id,是大于0的,,所以就調(diào)用第二個message賦值,,并執(zhí)行3次for循環(huán) 6)如果某時刻子進程被調(diào)用了,就會從內(nèi)核中被返回,,返回的值是0,,就會執(zhí)行第一個message賦值,并執(zhí)行6次for循環(huán),。(在這個過程中,,兩個進程對于message與n變量的賦值是互不影響的) 7)父進程打印一次睡眠1秒,在這1秒中子進程很可能被調(diào)度,,子進程打印一次也休眠1秒,,又有可能調(diào)度父進程,所以基本上是父子進程輪流調(diào)度打印,。如果將sleep去掉,,結(jié)果是:
就會發(fā)現(xiàn)是父進程執(zhí)行結(jié)束后子進程才有被調(diào)度的空間 8)這個程序是在shell下運行的,shell也是一個進程,,而且是父進程的父進程,,在父進程結(jié)束之后,shell會認為進程結(jié)束了,,然后打印shell提示符,,然而此時子進程還在運行,所以才會在shell提示符后輸出信息
總結(jié): fork()函數(shù)的特點是“調(diào)用一次,,返回兩次”,,父進程中調(diào)用一次,父子進程中返回兩次,,本來是一個控制流程的程序,,在調(diào)用fork()函數(shù)之后會裂開變?yōu)閮蓚€控制流程,'fork'為“派生,、分支”,,父進程的fork返回的是子進程的id,子進程中的fork返回的是0
12/12/20 DJ
|
|
來自: python_lover > 《待分類》