初学者对fork()函数的理解

这只是本人的学习笔记,记下对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初学者,笔记中内容有的来自前辈的文章,如果有觉得“抄袭是不对的”,请告知本人!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值