fork函數(shù)說明:
頭文件: <unistd.h>
功能: fork函數(shù)通過系統(tǒng)調(diào)用創(chuàng)建一個與原來進(jìn)程幾乎完全相同的進(jìn)程香府,也就是說兩個進(jìn)程可以做完全相同的事,但如果初始參數(shù)或者傳入的變量不同,兩個進(jìn)程也可以做不同的事。
若成功調(diào)用一次則返回兩個值掖看,子進(jìn)程返回0,父進(jìn)程返回子進(jìn)程ID面哥,否則哎壳,出錯返回-1。
調(diào)用失敗大多是因為內(nèi)存不夠用了幢竹,或者進(jìn)程太多而系統(tǒng)不允許創(chuàng)建了耳峦。
進(jìn)程常見函數(shù):getpid(), getppid()
getpid() 返回當(dāng)前進(jìn)程的標(biāo)識
getppid() 返回父進(jìn)程的標(biāo)識
進(jìn)程的標(biāo)識和使用fork函數(shù)返回的數(shù)值是不同的,返回值不是進(jìn)程的標(biāo)識焕毫。
示例程序:
說明:
本質(zhì)來說,fork函數(shù)啟動一個新的進(jìn)程驶乾,這個進(jìn)程幾乎是當(dāng)前進(jìn)程的一個副本:子進(jìn)程和父進(jìn)程使用相同的代碼段邑飒;子進(jìn)程復(fù)制父進(jìn)程的堆棧段和數(shù)據(jù)段。子進(jìn)程一旦開始運(yùn)行级乐,雖然他繼承了父進(jìn)程的一切數(shù)據(jù)疙咸,但實(shí)際上數(shù)據(jù)已經(jīng)分開,相互之間沒有影響了风科。他們之間再交互信息是撒轮,只有通過進(jìn)程間通信實(shí)習(xí)。
連續(xù)調(diào)用多次fork函數(shù):
步驟:
當(dāng)i=0時:
使用fork函數(shù)贼穆,父進(jìn)程符合if條件题山,pid為2972,執(zhí)行此句故痊,并執(zhí)行sleep(1)顶瞳,子進(jìn)程返回0,pid為2973,執(zhí)行else慨菱,因為子進(jìn)程被創(chuàng)建時有和父進(jìn)程一樣的部分焰络,所以root++ ,root=1符喝,這就是返回的前兩行闪彼,屬于第一次循環(huán)(i=0)
當(dāng)i=1時:
對于子進(jìn)程2973,執(zhí)行if語句协饲,創(chuàng)建下一代子進(jìn)程2974畏腕,自己作為父進(jìn)程,輸出第三行囱稽,而第二代子進(jìn)程2974則有和2973一樣的root值郊尝,執(zhí)行else語句,root++,root=2
對于父進(jìn)程2972战惊,執(zhí)行if,創(chuàng)建另一個子進(jìn)程2975,自己則執(zhí)行if語句,子進(jìn)程2975有和父進(jìn)程一樣的root=0,所以執(zhí)行else語句,root++,root=1,為第六行流昏。