函數(shù)簽名: pid_t fork(void);

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都攪拌罐車小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站制作營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。
子進(jìn)程中返回0,父進(jìn)程中返回子進(jìn)程ID,出錯返回-1
函數(shù)簽名:
pid_t waitpid(pid_t pid,int* stat_loc,int options);
函數(shù)簽名:
pid_t getpid(void);
pid_t getppid(void); //用于獲取父(parent)進(jìn)程的pid
函數(shù)簽名:
void eixt(int status);
示例1 創(chuàng)建一個這樣的進(jìn)程
創(chuàng)建一個如下的
Fork:創(chuàng)建一個和當(dāng)前進(jìn)程映像一樣的進(jìn)程可以通過fork( )系統(tǒng)調(diào)用:
#include sys/types.h
#include unistd.h
pid_t fork(void);
成功調(diào)用fork( )會創(chuàng)建一個新的進(jìn)程,它幾乎與調(diào)用fork( )的進(jìn)程一模一樣,這兩個進(jìn)程都會繼續(xù)運行。在子進(jìn)程中,成功的fork( )調(diào)用會返回0。在父進(jìn)程中fork( )返回子進(jìn)程的pid。如果出現(xiàn)錯誤,fork( )返回一個負(fù)值。
最常見的fork( )用法是創(chuàng)建一個新的進(jìn)程,然后使用exec( )載入二進(jìn)制映像,替換當(dāng)前進(jìn)程的映像。這種情況下,派生(fork)了新的進(jìn)程,而這個子進(jìn)程會執(zhí)行一個新的二進(jìn)制可執(zhí)行文件的映像。這種“派生加執(zhí)行”的方式是很常見的。
在早期的Unix系統(tǒng)中,創(chuàng)建進(jìn)程比較原始。當(dāng)調(diào)用fork時,內(nèi)核會把所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)復(fù)制一份,復(fù)制進(jìn)程的頁表項,然后把父進(jìn)程的地址空間中的內(nèi)容逐頁的復(fù)制到子進(jìn)程的地址空間中。但從內(nèi)核角度來說,逐頁的復(fù)制方式是十分耗時的。現(xiàn)代的Unix系統(tǒng)采取了更多的優(yōu)化,例如Linux,采用了寫時復(fù)制的方法,而不是對父進(jìn)程空間進(jìn)程整體復(fù)制。
1、fork一般用于處理多線程任務(wù)。比如在網(wǎng)絡(luò)中,需要同時發(fā)送多種請求報文,則可以fork出子進(jìn)程來進(jìn)行發(fā)包任務(wù),而父進(jìn)程則直接去做自己的邏輯任務(wù)。
2、所謂運行時間指的是已經(jīng)運行了多長時間還是從進(jìn)程創(chuàng)建到進(jìn)程退出的時間?輸入的程序是由程序啟動還是已經(jīng)在運行的
,如果是已經(jīng)存在的,就試著去獲取進(jìn)程創(chuàng)建時間(WIN32
提供這樣的API),然后獲取當(dāng)前時間,就可以得到進(jìn)程已經(jīng)運行了多久。如果是程序啟動的,那就用類似time這種函數(shù)打樁就可以了。
看起來你這段程序很難結(jié)束了。
首先父進(jìn)程會創(chuàng)建4個子進(jìn)程;
然后,因為父子進(jìn)程共用代碼段,于是子進(jìn)程也會把for循環(huán)執(zhí)行4次,每個子進(jìn)程繼續(xù)4個子進(jìn)程;
最后,子進(jìn)程創(chuàng)建的子進(jìn)程,依然會繼續(xù)創(chuàng)建4個子進(jìn)程,所以,沒完沒了。
因fork會返回2個值,返回非零,是創(chuàng)建的子進(jìn)程號,此時在父進(jìn)程中;返回零是在子進(jìn)程中;
所以,一般來說:應(yīng)該根據(jù)fork的返回值來使代碼選擇不同的執(zhí)行路徑,簡單舉例:
if (fork() !=0 )
{
parent process do something
}
else
{
child process do something
}
fork一般用于處理多線程任務(wù)。比如在網(wǎng)絡(luò)中,你需要同時發(fā)送多種請求報文,則可以fork出子進(jìn)程來進(jìn)行發(fā)包任務(wù),而父進(jìn)程則直接去做自己的邏輯任務(wù)。
學(xué)習(xí)函數(shù)可以從功能入手,看它能夠?qū)崿F(xiàn)那些特定的需求。網(wǎng)絡(luò)上給的只能是教科書似的定義,要是你想收獲更多,建議看一些開源代碼。
c語言調(diào)用函數(shù)while((p1=fork())==-1)的意思是:
fork函數(shù)是在當(dāng)前進(jìn)程中新建立一個子進(jìn)程,如果這個創(chuàng)建子進(jìn)程失敗,那么返回-1,這個實際是把創(chuàng)建進(jìn)程的返回值和-1比較看看是否創(chuàng)建失敗。
因為是寫在while語句里,那么當(dāng)創(chuàng)建失敗之后,如果在while里面沒有break或者跳出,當(dāng)while執(zhí)行體執(zhí)行結(jié)束后又會執(zhí)行(p1=fork())==-1,等于不斷重復(fù)創(chuàng)建子進(jìn)程一直到創(chuàng)建成功為止。
注意這里會返回兩次,因為父進(jìn)程創(chuàng)建子進(jìn)程的時候復(fù)制了父進(jìn)程的地址空間,那么父子進(jìn)程地址空間的語句執(zhí)行都在等待fork返回的那句話里。
所以返回兩次是父進(jìn)程返回一個,返回的是子進(jìn)程的ID,子進(jìn)程返回一次,返回的是0.
那么我們根據(jù)不同的返回值就可以分別寫出我們想要的父子進(jìn)程的邏輯。
分享標(biāo)題:c語言fork函數(shù) c語言fork函數(shù)原理
網(wǎng)頁路徑:http://chinadenli.net/article42/hgpjhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、Google、網(wǎng)站營銷、手機(jī)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)