亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

Linux下C語言的fork()子進程函數用法及相關問題解析

2020-01-26 14:33:46
字體:
來源:轉載
供稿:網友

fork
fork()函數是linux下的一個系統調用,它的作用是產生一個子進程,子進程是當前進程的一個副本,它跟父進程有一樣的虛存內容,但也有一些不同點。
但是,值得注意的是,父進程調用fork()后,fork()返回的是生成的子進程(如果能順利生成的話)的ID。子進程執行的起點也是代碼中fork的位置,不同的是下面這段C語言代碼展示了fork()函數的使用方法:

// myfork.c#include <unistd.h>#include <stdio.h>int main(int argc, char **argv) {  while (1) {    pid_t pid = fork();    if (pid > 0) {      // 主進程      sleep(5);    } else if (pid == 0) {      // 子進程      return 0;    } else {      fprintf(stderr, "fork error/n");      return 2;    }  }}

調用fork()函數后,系統會將當前進程的絕大部分資源拷貝一份(其中的copy-on-write技術這里不詳述),該函數的返回值有三種情況,分別是:
1.大于0,表示當前進程為父進程,返回值是子進程號;
2.等于0,表示當前進程是子進程;
3.小于0(確切地說是等于-1),表示fork()調用失敗。

看兩個比較有意思的C語言題目。
 
第一題:計算下面代碼理論上總共打印了多少行:(網易2011筆試題)

#include#include#includeint main(){    int i;    for(i = 0; i<5; i++){        fork();        printf("%d/n",getpid());        fflush(stdout);    }}

問題解答:
這道問題并不難,最快的想法就是2+4+8+16+32,因為第一層的printf會有兩個進程打印,第二層會增加到4個,以此往下,就得出62行。
 
但我這里打算采用另外一種方法,一種更加直觀的方法,就是直接數出來,這樣會避免大腦短路,而且對下一題目有幫助。
 
要直接數出來也很簡單,只是有些繁瑣,因為每循環一次,都會打印一行并且產生一個子進程,子進程又會繼續循環打印并產生新的進程。我們可以在草稿紙上畫一棵樹,畫出每個進程的子進程以及循環次數,如果你眼力夠好,腦子不容易亂,這種方法很快會讓你得到正確答案。但我恰好腦子不是能夠保證清醒的人,畫了三遍樹得到的都是錯誤答案。
 
隨后,我在紙上用了一種更簡單的數據結構――隊列進行計算,并且順利得出了答案。我是這樣計算的:

首先,主進程會循環5次,則我們將5壓入到隊列中:

queue =" 5 ";sum = 0; //sum是總打印次數

主進程會循環5次,打印5行并且產生5個子進程,這5個子進程分別會打印5,4,3,2,1行,則我們將這5個數放入隊列,并將第一個5出隊列加入到sum中:

queue = " 5 4 3 2 1 ";sum = sum + 5;

這樣,我們再取隊列首元素,即5,他會打印5行,并且生成4個子進程,子進程的分別會打印4,3,2,1行,我們把這4個數放入到隊列中,并將第一個5出隊列加入到sum中:

queue = " 4 3 2 1 4 3 2 1";sum = sum + 5;

我們繼續重復上面的工作,取首元素4,他會打印4行,并且會聲稱3個子進程,子進程分別打印3,2,1行,重復上面的入隊列和出隊列操作:

queue = " 3 2 1 4 3 2 1 3 2 1 ";sum = sum + 4;

這樣,以此重復以上的操作,當遇到元素1的時候,只有出隊列而沒有入隊列的操作,因為只打印1行的子進程不會再循環產生新的子進程。最后,當隊列中不再有元素的時候,sum就是總共打印的行數。
 
這種方法的有點是你可以很輕松、很清醒的在紙上把隊列寫出來并算出答案,缺點是如果你加法不好,很容易算錯答案!
 

第二題:問下面的代碼執行后總共產生了多少進程(不包括主進程)?(2009 EMC筆試)

#includeint main(){    fork();    fork() && fork() || fork();    fork();}

這個題目跟上一個對比起來就稍微有點難度了,因為你就算畫樹也有可能算錯!
 
我個人感覺這個題目考察兩方面的知識:1、開頭所講的fork()返回值;2、&&和||的運算。
 
讓我們現討論下&&和||的運算再來繼續討論這個題目。&&是“邏輯與”操作,如果兩個操作數有一個為0,則整個式子為0。標準C中規定,如果&&運算符的左操作數為0,則不計算右操作數;如果左操作數為1,才計算右操作數。
與之類似,||操作符是“邏輯或”操作,標準C規定如果||運算符左操作數為1,則不計算右操作數;如果左操作數為0,則計算右操作數。
 
繼續來看我們的題目,我們把題目中的5個fork()分別標記為A,B,C,D,E。則我們可以看到,主進程一共產生4個進程,分別產生在A,B,C,E位置上(B,C兩個fork()返回值都不是0,因此B&&C不為0,因此不計算D)。讓我們仍然采用上題的算法,使用一個隊列:

首先,將主進程產生子進程的位置放到隊列中:

queue = " A B C E ";sum = 0;

我們從隊列中取首元素A,我們分析A處產生的進程,發現它會在B, C, E三處產生子進程,我們把這三個元素插入到隊列中,并將sum+1。

queue = " B C E B C E ";sum ++;

然后,我們從隊列中取出首元素B,B處產生的子進程稍稍不一樣,因為子進程中B所代表的fork()返回值為0,因此C得不到執行,而D會得到執行。因此,B處產生的子進程會執行D, E,將這兩個元素送入隊列,sum++:

queue = " C E B C E D E ";sum ++;

下面,我們取首元素C,分析發現,C處產生的進程會執行D, E,送入隊列并且sum++:

queue = " E B C E D E D E ";sum ++;

同上一題一樣,依次這樣執行,遇到E則沒有元素入隊列,直到最后隊列為空,sum就是總共產生的進程個數。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产va免费精品高清在线观看| 成人在线免费观看视视频| 国产精品视频一区国模私拍| 日韩精品久久久久久久玫瑰园| 欧美成人午夜激情在线| 欧美成人激情视频| 国产999在线观看| 91精品视频一区| 日本久久精品视频| 国产精品视频在线观看| 亚洲性无码av在线| 日韩欧美国产免费播放| 亚洲影院色无极综合| 国产精品视频大全| 国产+人+亚洲| 欧美日韩亚洲激情| 亚洲一区二区精品| 一色桃子一区二区| 97视频在线观看网址| 国产乱人伦真实精品视频| 69影院欧美专区视频| 亚洲欧美精品中文字幕在线| 久久亚洲国产精品成人av秋霞| 最近2019中文字幕第三页视频| 在线播放亚洲激情| 国产做受高潮69| 亚洲偷欧美偷国内偷| 成人免费观看网址| 色综合天天狠天天透天天伊人| 在线亚洲午夜片av大片| 97久久精品人搡人人玩| 日韩中文在线观看| 久久精品在线视频| 57pao国产精品一区| 精品久久久久久中文字幕| 中文字幕欧美日韩在线| 国产91网红主播在线观看| 亚洲欧美激情另类校园| 中文字幕精品国产| 国产精品www网站| 日韩精品视频免费在线观看| 亚洲性无码av在线| 性欧美暴力猛交69hd| 91香蕉电影院| 中国人与牲禽动交精品| 国产精品久久久久秋霞鲁丝| 91中文在线视频| 亚洲国产婷婷香蕉久久久久久| 欧美视频精品一区| 国产成人精品久久久| 97香蕉超级碰碰久久免费的优势| 欧美野外wwwxxx| 国产精品免费一区| 精品av在线播放| 性欧美xxxx交| 97婷婷大伊香蕉精品视频| 国产成人一区二区三区小说| 亚洲性日韩精品一区二区| 69久久夜色精品国产69| 久久久久久网址| 亚洲成人av中文字幕| 色综合久久久888| 精品视频在线播放色网色视频| 亚洲国产欧美一区| 91综合免费在线| 久久亚洲成人精品| 亚洲欧美国产精品| 日韩久久午夜影院| 色狠狠久久aa北条麻妃| 色爱精品视频一区| 日本韩国欧美精品大片卡二| 欧美国产日韩一区二区| 亚洲成人a级网| 亚洲成av人乱码色午夜| 国产欧美va欧美va香蕉在| 欧美日产国产成人免费图片| 91久久精品久久国产性色也91| 亚洲精品一区二区在线| 欧美色欧美亚洲高清在线视频| 亚洲国产天堂久久国产91| 欧美在线日韩在线| 日韩一区二区欧美| 欧美色视频日本版| 亚洲第一免费网站| 91精品国产91久久| 亚洲黄色片网站| 色妞色视频一区二区三区四区| 91久久精品美女高潮| 欧美最猛性xxxxx(亚洲精品)| 欧美大片大片在线播放| 日韩高清电影免费观看完整版| 中文字幕自拍vr一区二区三区| 一道本无吗dⅴd在线播放一区| 午夜精品一区二区三区在线视| 久热在线中文字幕色999舞| 欧美在线一区二区三区四| 国产精品69av| 久久99久国产精品黄毛片入口| 亚洲欧洲av一区二区| 日韩精品视频在线免费观看| 日韩美女免费视频| 日韩一区二区av| 国产精品美女免费看| 国产精品香蕉国产| 国产v综合ⅴ日韩v欧美大片| 亚洲第一免费播放区| 色偷偷av亚洲男人的天堂| 亚洲国产另类 国产精品国产免费| 国产一区二区黑人欧美xxxx| 欧美精品电影在线| 国模精品视频一区二区三区| 午夜精品久久17c| 亚洲欧洲日产国码av系列天堂| 尤物精品国产第一福利三区| 国产综合香蕉五月婷在线| 国产成人在线一区| 久久久久久久国产精品视频| 丝袜亚洲欧美日韩综合| 日本精品久久久久久久| 日韩激情视频在线播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品一区二区三区在线播放| 欧美理论片在线观看| 国产精品成av人在线视午夜片| 国产精品色午夜在线观看| 欧美日韩一区二区在线播放| 国产精品久久久久久亚洲影视| 91亚洲精品一区二区| 免费不卡在线观看av| 日韩中文字幕视频在线观看| 日韩视频第一页| 亚洲视频日韩精品| 久久精品在线视频| 日韩三级成人av网| 欧美久久精品一级黑人c片| 亚洲va欧美va国产综合久久| 欧美午夜电影在线| 久久九九有精品国产23| 亚洲精品国产品国语在线| 永久免费毛片在线播放不卡| 国产精品免费视频久久久| 国产区亚洲区欧美区| 97视频在线看| 久久精品久久久久电影| 亚洲人成电影网站色www| 中文精品99久久国产香蕉| 日韩中文娱乐网| 精品亚洲精品福利线在观看| 国产福利精品av综合导导航| 欧美刺激性大交免费视频| 亚洲色图av在线| 亚洲天天在线日亚洲洲精| 国产日韩精品在线观看| 久久久久久成人精品| 久久人人爽人人爽人人片亚洲| 九九久久久久久久久激情| 欧美综合在线第二页| 日韩av在线网站| www.亚洲一区| 欧美黑人一区二区三区| 国内精品久久久久久| 欧美疯狂性受xxxxx另类| 亚洲人成欧美中文字幕| 日韩综合中文字幕|