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