fork()與vfork()

  進程在系統的唯一標識是PID,PID是一個從1到32768的正整數,其中1一般是特殊進程init,其它進程從2開始依次編號.當用完32768後,從2重新開始.

函數原型:(from百度)

pid_t fork( void);
(pid_t 是一個宏定義,其實質是int 被定義在#include<sys/types.h>中)
返回值: 若成功調用一次則返回兩個值,子進程返回0,父進程返回子進程ID;否則,出錯返回-1

getpid();函數可以獲取子進程id;getppid();可以獲取父進程id。
子進程是父進程的副本,它將獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味着父子進程間不共享這些存儲空間。因此,子進程有了獨立的地址空間,有兩個和父進程相同的兩個地址空間。而vfork和父進程共享一個空間(當有和父進程不同的內容是才另外開闢空間),實際上只有一個內存空間,是兩個進程共享使用的。
如果使用vfork(),fork()的時候,父進程的緩衝區被更新了,則子進程就無法獲取裏面的內容,也就無法執行。(tip:因爲緩衝區裏面的內容有可能是變化的,有可能被更新了,相當於fflush());

 vfork 保證子進程先運行,在她調用 exec 或 exit 之後父進程纔可能被調度運行。如果在 調用這兩個函數之前子進程依賴於父進程的進一步動作,則會導致死鎖。



                                
第21行和22行後面沒有  \n  (回車);因爲fork();是複製了父程序,包括物理空間,他都是新開闢的。上面的對比,因爲要輸出的內容(printf)是存在於緩衝區的,linux是行緩衝的,加\n相當於把緩衝區更新輸出了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章