Linux之fork()函數淺析

fork函數的特點概括起來就是“調用一次,返回兩次”,在父進程中調用一次,在父進程和子進程中各返回一次。

fork的另一個特性是所有由父進程打開的描述符都被複制到子進程中。父、子進程中相同編號的文件描述符內核中指向同一個file結構體,也就是說,file結構體的引用計數要增加。

/*當程序調用fork函數時,系統會創建新的進程併爲其分配資源;然後,會將原來進程的相關內容全部複製到新的進程中。

fork()函數的神奇之處在於它僅僅被調用一次,但是會返回兩次(父子進程各一次)。我們可以通過返回值來區分父子進程:

    1.返回值爲0時,表示子進程。
    2.返回值大於0時,表示父進程,且返回值爲新創建的子進程的PID。
    3.返回值小於0時,表示fork出現錯誤。
*/
/*
    for        i=0          i=1            i=2

              parent(241)   parent(241)   parent(241)

                                           son(248)

                             son(244)     parent(244)

                                           son(246)

               son(242)     parent(242)    parent(242)

                                           son(247)

                             son(243)      parent(243)

                                           son(245)
*/
#include<iostream>
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
using namespace std;
int main()
{
    pid_t fpid;
    int countn=10,i;
    for(i=0;i<3;i++)
    {cout<<i<<":\n";
      fpid=fork();
    if(fpid<0)
        printf("error in fork\n");
    else if(fpid == 0)
    {
      printf("son id:%d\n ",getpid());
      sleep(3);
      countn--;

    }
     else
     {
       printf("parent id:%d\n ", getpid());
       sleep(5);

     }

    }
    return 0;
}

 

 

 

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