關於linux下fork()函數的解析:子進程繼續創建子進程,如何停止?

先貼代碼:

for(i = 0; i < 4; i++)
{
    fork();
    printf("a\n");
}

問:一共輸出多少個a?  答:30個(2+4+8+16)

先說下思路:父進程創建子進程後,fork函數是讓子進程完全拷貝父進程,包括父進程上下文,什麼意思呢?就是說父進程的EIP(CPU的下一條指令地址)以及變量等等一律拷貝,也就是說,父進程執行過的代碼子進程是不會再執行,子進程下一條該執行的命令與父進程完全一樣!!!

解析:

i=0時;fork()後,產生一個子進程,然後父子進程共同printf各1次;共兩次;

之後,父子進程都進入i=1:

  • 父子進程都會fork,也就是父進程fork了一個新的子進程;i=0的子進程也fork了一個子進程,共4個進程,每個進程都繼續往下執行,也就是printf一次;共4次

以此類推:也就是2+4+8+16=30次。具體看下圖:

共打印30次

 

fork會讓子進程拷貝一切父進程的信息,包括這裏面的變量i的值,所以子進程不會一直循環的fork下去,在i=2時,子進程(稱爲p2吧)fork出p3,然後p2繼續執行printf,fork後創建的p3子進程的執行位置也和p2一樣爲printf,同時該創建的p3子進程自然下一次循環是從i=3開始,當i=3完成之後,i變成4,所有由總父進程創建出來的子進程都同時結束。

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