0%

Linux下fork()函数笔记

一个现有进程可以调用fork()函数创建一个新进程(即子进程)。fork()函数被调用一次但返回两次,两次返回的唯一区别是子进程中返回0而父进程中返回子进程PID
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。父、子进程间共享的存储空间只有代码段

  • 函数定义:pid_t fork(void);

    pid_t是一个宏定义,其实质是int,被定义在#include<sys/types.h>中。

  • 返回值:若成功调用一次则返回两个值,子进程返回0父进程返回子进程PID;出现错误则返回-1

  • 所需的头文件:#include<unistd.h>#include<sys/types.h>

fork()应用示例1

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{
int count=0;
pid_t fpid;
fpid=fork();

if(fpid<0)
{
printf("fork()函数调用出现错误!\n");
}

else if(fpid==0)
{
count++;
printf("子进程,PID为%d!\n",getpid()); //getpid()函数用于获取当前进程的PID
}

else
{
count++;
printf("父进程,PID为%d!\n",getpid());
}

printf("count=%d\n",count);
}

在语句fpid=fork()之前,只有一个进程在执行该段源码;但在fpid=fork()语句之后,就有两个进程在执行,这两个进程几乎完全相同。fork()函数是将父进程当前的所有值复制到子进程(子进程只有少数值与父进程不同),而在执行fpid=fork()时,进程已执行int count=0;因为两个进程的变量是相互独立存储于不同的地址(也因此可以通过PID来识别父、子进程,PID也是进程的一个变量),所以父、子进程执行完毕后的变量count均为1

fork()应用示例2

#include<stdio.h>
#include<unistd.h>

int main()
{
printf("当前进程的PID为%d!\n",getpid());
printf("fork PID %d!\n",fork());
printf("fork PID %d!\n",fork());
return 0;
}

连续调用2次fork()函数,生成3个子进程。


参考资料

linux中fork()函数详解(原创!!实例讲解)

fork函数