这只是本人的学习笔记,记下对fork()的理解,当然也是通过多位前辈的文章学习的。理解错误之处恳请高人指出,谢谢!
先贴出几个前人的链接。
http://blog.chinaunix.net/uid-24460251-id-2626279.html。对系统调用进程还不是很理解的可以先看看这篇。
http://blog.163.com/huww_vip/blog/static/185913087201151153625168/
http://blog.csdn.net/jason314/article/details/5640969
上面几处的内容都差不多,我是因为看一篇还不是很理解所以又看了几篇。推荐先看上面的,完全理解后就可以关闭我这个页面了。
fork()是系统调用库unistd.h里的一个函数,是Linux系统提供的一个用于创建新进程的方法。
我们平时可能还用别的方法来创建新进程,但它们最终还是通过调用fork()来创建的。
fork()函数的功能是创建一个新的进程,新进程为当前进程的子进程,当前进程就是新进程的父进程了。这个新进程几乎和父进程一样,因为系统创建进程时会给进程分配必要的存储空间,fork()会把父进程的数据空间、堆、栈等资源复制一份给新进程。所以新进程与它的父进程是不共享存储空间的。那它俩还有什么不同呢?最大的不同就是进程的唯一标识PID了。Linux内核在进程表中为子进程分配一个表项,然后分配PID。在系统中是用pid_t来保存进程PID信息的。先看下面代码。
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
int main(void)
{
pid_t pid;
int count = 0;
printf("Hello!!!\n");
if((pid = fork()) < 0)
{
printf("fork error!\n");
exit(1);
}
else if(pid == 0)
{
count++;
printf("in the child process!\n");
}
else
{
count++;
printf("in the parent process!\n");
}
printf("count=%d\n", count);
exit(0);
}
输出结果:
1 Hello!!!
3 in the parent process!
2 in the child process!
4 count=1
4 count=1
注意:第1句只输出一次,而且第2、3句同时输出了。count也输出了两次。
先看一张图
下面一条线可以理解为父进程,上面一条可以理解为子进程。两个进程同时运行。
首先这里代码里有一个pid变量用于保存进程的PID。它是pid_t类型,而pid_t是系统宏定义的一个unsigned int类型。在执行pid=fork()这句之前,只有一个进程在运行,也就是父进程,所以 1 Hello!!! 只输出了一次。而执行fork()之后,子进程被创建了,这时就有两个进程在运行了,所有出现了上图的分支。fork()复制了在它之后的代码。很多文章说一个进程调用一次fork()而有两次返回。但这其实是两个进程里的各自的返回,不是这个调用进程返回两次。父进程有一份,子进程也有一份,这两个进程都执行fork()之后的代码。而在子进程中,fork()最终会返回0,在父进程中返回1。代码中加了if的判断,所以当是子进程在执行时fork()返回了0,执行了if(pid=0)的语句,当是父进程在执行时fork()返回了1,所以执行了if(pid=1)的语句。所以 3 in the parent process!; 2 in the child process! 这两句都输出了。而最后一次printf()被两个进程执行了,所以有了两个count=1的输出。如果创建子进程失败,则返回-1。
我就记到这里了,当然fork()的内容不止这些,建议多看看各种博客里的文章。
本人是学生linux初学者,笔记中内容有的来自前辈的文章,如果有觉得“抄袭是不对的”,请告知本人!