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