快速理解 Linux 中 的 fork( ) 函数
ps: 如果有任何问题可以评论留言,我看到后会及时解答,评论或关注,您的鼓励是我分享的最大动力
转载请注明出处:https://blog.****.net/qq_40938301/article/details/89103234
1、fork的作用:
当一个进程调用fork( )函数时,会产生一个新进程(即子进程),而自己本身也还存在,作为父进程。
子进程相当于父进程的复制,拥有与父进程相同的数据结构(即 数据+数据空间),但数据结构并不是共享的,
只有代码段是共享的。
ps:共享的意思指用同一个数据结构,子进程、父进程改变该数据结构都会对他产生影响。具体可见下分析部分
fork( ) 之后生成的父、子进程会分别执行fork语句之后的代码,因此需要通过fork的返回值区分自己是父进程还是子进程
fork( ) 返回值是一个整型数 fpid,有3种情况
(1) 父进程: fpid = 子进程的pid ( fpid > 0)
(2) 子进程: fpid = 0
(3) 创建失败: fpid < 0
2、实例分析
#include <unistd.h>
#include <stdio.h>
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
int count=0;
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d/n",getpid());
printf("子进程/n");
count++;
}
else {
printf("i am the parent process, my process id is %d/n",getpid());
printf("父进程/n");
count++;
}
printf("统计结果是: %d/n",count);
return 0;
}
运行结果:
i am the child process, my process id is 5574
子进程
统计结果是: 1
i am the parent process, my process id is 5573
父进程
统计结果是: 1
(1) fork出来的父子进程是并发的,执行的先后顺序是根据当前操作系统的调度算法决定的,并不一定。
即可能 父进程先运行, 也可能 子进程先运行。
(2) getpid( )可以获取当前进程的 进程号pid(process id)
getppid( )可以获取当前进程的父进程的 进程号pid(parent process id)
(3) count 在 fork( ) 前被初始化为 0
因为数据相同但不共享,因此父子进程的 count 分别 ++ ,结果都为 1 。
(4) 如果在父进程的代码中加入
printf("my fpid is %d/n",fpid);
则结果为:
my fpid is 5574
因为父进程的 fpid 等于 新建的子进程的 pid