fork()函數 圖解


 

code

#include<stdio.h>
#include <getopt.h>
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;

int main(int argc, char* argv[]) {
    pid_t pid=0;
    int clients=2;
    printf("parent %d\n",getpid());

    for(int i=0;i<clients;i++)
    {
        //在fork函數執行完畢后,如果創建新進程成功,則出現兩個進程,一個是子進程,一個是父進程。
        //在子進程中,fork函數返回0,在父進程中,fork返回新創建子進程的進程ID。
        //我們可以通過fork返回的值來判斷當前進程是子進程還是父進程。
        pid=fork();

        if( pid < (pid_t) 0)
        {
            printf("something wrong!");
        }
        if(pid <= (pid_t) 0)
        {
            /* child process or error*/
            //sleep(1); /* make childs faster */
        }
        if(pid == (pid_t) 0)
        {
            printf("index%d child : ppid:%4d pid:%4d fpid:%4d\n",i,getppid(),getpid(),pid);
        }
        else
        {
            printf("index%d parent : ppid:%4d pid:%4d fpid:%4d\n",i,getppid(),getpid(),pid);
        }
    }
    return 0;
}

輸出

parent 88993

index0 parent : ppid:88994 pid:88993 fpid:88996
index0 child : ppid:88993 pid:88996 fpid:   0

index1 parent : ppid:88994 pid:88993 fpid:88997
index1 child : ppid:88993 pid:88997 fpid:   0
index1 parent : ppid:88993 pid:88996 fpid:88998
index1 child : ppid:88996 pid:88998 fpid:   0

Program ended with exit code: 0

根據輸出結果,我們畫出下面這個結構圖

可以看到,由於我是使用Xcode運行的代碼,Xcode的pid是88994

以上代碼運行后的進程pid是88993

兩次循環以后,88993 fork 出了88996,88997,88998三個子進程,算上自身,一共有四個進程。

i=0時,88993創建了一個子進程88996,此時這兩個進程的程序的i=1,也就是說,此時兩個進程開始執行的位置是一樣的,是從88993執行完第一次循環后的那個 位置開始執行。

 

參考:

https://www.cnblogs.com/love-jelly-pig/p/8471206.html

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM