linux fork()函数浅析

fork()顾名思义是分支的意思,也就是克隆程序后面的代码至新的进程中,直接上程序:

#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("I am son\n");
		count++;
	}
	else {
		printf("i am the parent process, my process id is %d\n", getpid());
		printf("I am father\n");
		count++;
	}
	printf("result: %d\n", count);
	return 0;
}

运行结果:

i am the parent process, my process id is 10742
I am father
result: 1
i am the child process, my process id is 10743
I am son
result: 1

可以看出,fork确实开了两个进程,将之后的代码复制到另一个进程中去执行,也线程不同,进程中的程序并不会共享变量等资源,因此这里同时满足了两个对立的条件。其中,父进程的fpid值不为零,子进程fpid为零,可以通过这点来区分父进程和子进程。
那么,如果fork()用在循环中会怎么样了,会将循环到额判断条件写入子进程吗?

#include <unistd.h>  
#include <stdio.h>   
int main() {
	for (int i = 0; i <2; i++) {
		pid_t fpid = fork();
		if (fpid == 0)
			printf("%d child  %4d %4d %4d\n", i, getppid(), getpid(), fpid);
		else
			printf("%d parent %4d %4d %4d\n", i, getppid(), getpid(), fpid);
	}
return 0;
}

运行结果:

0 parent 11041 11044 11045
0 child  11044 11045    0
1 parent 11041 11044 11046
1 child  11044 11046    0
1 parent 11044 11045 11047
1 child  11045 11047    0

可以看出,pid号有点像链表的原理,将父子进程链接在一起,例如:

11041->11044->11045->0

这是由同一次产生的父子进程,而同一类进程除了当前的fpid不同,其他id均相同。所以循环中的fork可以理解为二叉树结构,该程序执行了6次printf函数。
那我们再看一个例子:

#include <unistd.h>  
#include <stdio.h>   
int main() {
	for (int i = 0; i <3; i++) {
		fork();
		printf("%d cc\n",i);
	}
return 0;
}

请问打印了几个cc,具体是如何打印?
运行结果:

0 cc
0 cc
1 cc
1 cc
1 cc
2 cc
1 cc
2 cc
2 cc
2 cc
2 cc
2 cc
2 cc
2 cc

具体原因,留给大家思考!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值