重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
函數簽名: pid_t fork(void);
創新互聯主營瑪多網站建設的網絡公司,主營網站建設方案,app開發定制,瑪多h5小程序定制開發搭建,瑪多網站營銷推廣歡迎瑪多等地區企業咨詢
子進程中返回0,父進程中返回子進程ID,出錯返回-1
函數簽名:
pid_t waitpid(pid_t pid,int* stat_loc,int options);
函數簽名:
pid_t getpid(void);
pid_t getppid(void); //用于獲取父(parent)進程的pid
函數簽名:
void eixt(int status);
示例1 創建一個這樣的進程
創建一個如下的
首先你調用fork函數時,會創建一個子進程。fork會有兩個返回值,一個是為0的值(父進程的PID)在父進程里執行的時候icount++ 最后printf打印的結果為3,還有一個是大于0的值(創建后的子進程PID)子進程里執行icount-- 最后打印的結果為1。 當然fork失敗的時候返回值就是小于0了。
提醒一下
創建子進程時,系統并沒有立即復制一個父進程的數據段、棧、堆的副本,而是由內核把父進程的這些內存設置為只讀,由父子進程共享,若父子進程有任意一個試圖修改該區域,內核為修改頁面復制一個副本,達到父子進程互不干擾。
純手打,希望對你有幫助!!!!!!
1、fork一般用于處理多線程任務。比如在網絡中,需要同時發送多種請求報文,則可以fork出子進程來進行發包任務,而父進程則直接去做自己的邏輯任務。
2、所謂運行時間指的是已經運行了多長時間還是從進程創建到進程退出的時間?輸入的程序是由程序啟動還是已經在運行的
,如果是已經存在的,就試著去獲取進程創建時間(WIN32
提供這樣的API),然后獲取當前時間,就可以得到進程已經運行了多久。如果是程序啟動的,那就用類似time這種函數打樁就可以了。
看起來你這段程序很難結束了。
首先父進程會創建4個子進程;
然后,因為父子進程共用代碼段,于是子進程也會把for循環執行4次,每個子進程繼續4個子進程;
最后,子進程創建的子進程,依然會繼續創建4個子進程,所以,沒完沒了。
因fork會返回2個值,返回非零,是創建的子進程號,此時在父進程中;返回零是在子進程中;
所以,一般來說:應該根據fork的返回值來使代碼選擇不同的執行路徑,簡單舉例:
if (fork() !=0 )
{
parent process do something
}
else
{
child process do something
}
fork一般用于處理多線程任務。比如在網絡中,你需要同時發送多種請求報文,則可以fork出子進程來進行發包任務,而父進程則直接去做自己的邏輯任務。
學習函數可以從功能入手,看它能夠實現那些特定的需求。網絡上給的只能是教科書似的定義,要是你想收獲更多,建議看一些開源代碼。
c語言調用函數while((p1=fork())==-1)的意思是:
fork函數是在當前進程中新建立一個子進程,如果這個創建子進程失敗,那么返回-1,這個實際是把創建進程的返回值和-1比較看看是否創建失敗。
因為是寫在while語句里,那么當創建失敗之后,如果在while里面沒有break或者跳出,當while執行體執行結束后又會執行(p1=fork())==-1,等于不斷重復創建子進程一直到創建成功為止。
注意這里會返回兩次,因為父進程創建子進程的時候復制了父進程的地址空間,那么父子進程地址空間的語句執行都在等待fork返回的那句話里。
所以返回兩次是父進程返回一個,返回的是子進程的ID,子進程返回一次,返回的是0.
那么我們根據不同的返回值就可以分別寫出我們想要的父子進程的邏輯。