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;
}