一、fork入门知识
一个进程,就是程序的执行过程,包括代码、数据和分配给进程的资源。在linux 中 fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是克隆了一个自己。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
二、fork函数
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
引用一位网友的话来解释fpid的值为什么在父子进程中不同。“其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id,因为子进程没有子进程,所以其fpid为0。
三、具体示例
这是一段 C代码程序:
#include <unistd.h>
#include <stdio.h>
int main ()
{
int fpid; //fpid表示fork函数返回的值
int count=0;
fpid=fork();
if (fpid < 0)
printf("error in fork!\n");
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 parent process, my process id is 2947
我是孩子他爹
统计结果是: 1
i am the child process, my process id is 2948
我是爹的儿子
统计结果是: 1
四、代码思路:
首先是,父进程 2947 指行到 fork() 函数,创建了一个可以并发执行的子进程,返回值为子进程的id号,所以就进入else语句,count ++ 之后 输出 为 1。
然后是 父进程执行完成之后,子进程开始执行(将父进程的代码完全copy了一份), id 号 为 2948,所以 int count =0 再次执行了一遍,fork()的返回值为0,进入了 else if (fpid == 0) 的语句,count++ 之后,输出 1。
最后进程执行结束,父子进程都执行结束。