52_进程之fork创建子进程

为什么需要创建子进程

每一次程序运行都需要创建一个进程,成本就是需要创建一个进程,并把程序加载进去

每一个进程在调度表中的体现是一个进程控制块PCB 

每一个PCB填充上合适的内容,在内存中构建一个PCB结构体,放在调度表中

所以运行一个程序是需要成本的

系统希望快速便捷的创建PCB

Linux的方法,创建新进程,把老进程复制一份,进程的分裂生长模式

如果操作系统需要新进程来运行一个程序,那么OS会用现有的一个进程复制生成一个新进程,再改动一下PID,这样PCB就不一样了

这样的好处是,我们先有一个原版,可以说,两个完全不相关的进程相似度还是很高的,这样提高创建进程的效率

所以Linux中用fork的方法复制(创建)新的进程,老进程叫父进程,新进程叫子进程。

fork函数调用一次会返回两次,返回值等于0的是子进程,返回值大于0的是父进程

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
	pid_t pid  = -1;
	 
	
	pid = fork();
	if(pid < 0)
	{
		perror("fork");
		return -1;
	}
	else if(pid == 0)
	{
		printf("这里是子进程.\n");	
		printf("pid = %d.\n", pid);	
		sleep(1);
	}
	else
	{
		printf("这里是父进程.\n");	
		printf("pid = %d.\n", pid);	
		sleep(1);
	}
	
	return 0;
}

为什么一个main函数就分了这几个进程

main函数分了好多段  代码段 数据段 bss段

main函数是代码段在不同进程里面有副本,父进程和子进程里面都有main的代码段,都是可以调度的,调度的结果,父进程被轮番调度,子进程也被轮番调度,所以在不同进程中执行了两次,这两次的fork返回值是不一样的,也就是进入了不同的逻辑语句执行了打印输出

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>


int main(void)
{
	pid_t pid  = -1;
	 
	
	pid = fork();
	if(pid < 0)
	{
		perror("fork");
		return -1;
	}
	else if(pid == 0)
	{
		printf("这里是子进程.\n");	
		printf("pid = %d.\n", pid);	
		sleep(1);
	}
	else
	{
		printf("这里是父进程.\n");	
		printf("pid = %d.\n", pid);	
		sleep(1);
	}
	printf("这一句是否打印两次pid = %d.\n",getpid());//确实打印了两次
	
	return 0;
}

父进程在if的大于零里面执行,写父进程应用,

子进程在if等于零里面执行,写子进程的应用

以上是典型的fork的使用方法,即fork后,用if看fork的返回值,根据返回值决定在父进程或者子进程干什么

fork创建完,fork的返回值,在子进程等于0,在父进程大于零等于本次创建的子进程的进程ID

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>


int main(void)
{
	pid_t pid  = -1;
	 
	
	pid = fork();
	if(pid < 0)
	{
		perror("fork");
		return -1;
	}
	else if(pid == 0)
	{
		printf("这里是子进程.\n");	
		printf("pid = %d.\n", pid);	
		printf("子进程中的父进程id = %d.\n", getppid());	
		sleep(1);
	}
	else
	{
		printf("这里是父进程.\n");	
		printf("pid = %d.\n", pid);	
		sleep(1);
	}
	printf("这一句是否打印两次pid = %d.\n",getpid());
	
	return 0;
}

子进程一旦建立起来,这就是两个独立的进程了

总的来说还是有一点的关联

子进程有自己独立的PCB 进程控制块

子进程会被同等的参与调度

这两个进程不是 公用代码段,而是分别都有一份

一般在if的下面不会再有什么代码,因为两个进程都会执行后面的部分,不便于分辨,技巧





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值