3.4.4.fork创建子进程

文章详细介绍了Linux中使用fork函数创建子进程的过程,包括为何创建子进程(如实现并行执行),fork的内部原理——进程的分裂生长模式,以及fork函数的返回值如何帮助区分父进程和子进程。通过示例代码展示了如何在C语言中使用fork,并打印出各自的进程ID和父进程ID,证明了子进程和父进程是独立的实体,各自拥有独立的PCB结构体。
摘要由CSDN通过智能技术生成

3.4.4.fork创建子进程

拿老进程 来复制 一个 新进程
3.4.4.1、为什么要创建子进程
(1)每一次程序的运行都需要一个进程
(2)多进程实现宏观上的并行

 

3.4.4.2、fork的内部原理
(1)进程的分裂生长模式。如果操作系统需要一个新进程来运行一个程序,那么操作系统会用一个现有的进程来复制生成一个新进程老进程叫父进程复制生成的新进程叫子进程
(2)fork的演示

代码:

#include <stdio.h>
#include <unistd.h>


int main(void)
{
	pid_t p1 = -1;
	
	p1 = fork();  //fork 函数返回 2 次  : 等于0 是子进程, 大于0是父进程
	
	if(0 == p1)
	{
		/* 这里一定是 子进程 */
		
	}
	
	if (p1 > 0)
	{
		/* 这里一定是 父进程 */
		
	}
	
	if (p1 < 0)
	{
		/* 这里一定是 fock出错了  */
		
	}
	

	
		/* 在这里 所做的 操作, 父进程和 子进程 都有的,所以会打印 两次 printf */
		printf("hello word, pid = %d \n",getpid());  //getpid() 打印进程 ID 号
	
	
	return 0;
}

(3)fork函数调用一次会返回2次,返回值等于0的就是子进程,而返回值大于0的就是父进程。

运行结果:



(4)典型的使用fork的方法:使用fork后然后用if判断返回值,并且返回值大于0时就是父进程,等于0时就是子进程。

代码:

#include <stdio.h>
#include <unistd.h>


int main(void)
{
	pid_t p1 = -1;
	
	p1 = fork();  //fork 函数返回 2 次  : 等于0 是子进程, 大于0是父进程
	
	if(0 == p1)
	{
		/* 这里一定是 子进程 */
		printf(" 子进程 hello word, pid = %d \n",getpid());  //getpid() 打印进程 ID 号
		printf("子进程 : 你好 \n");
	}
	
	if (p1 > 0)
	{
		/* 这里一定是 父进程 */
		printf(" 父进程 hello word, pid = %d \n",getpid());  //getpid() 打印进程 ID 号
	}
	
	if (p1 < 0)
	{
		/* 这里一定是 fock出错了  */
		
	}
	

	
		/* 在这里 所做的 操作, 父进程和 子进程 都有的,所以会打印 两次 printf */
		//printf("hello word, pid = %d \n",getpid());  //getpid() 打印进程 ID 号
	
	
	return 0;
}

运行结果:

(5)fork的返回值在子进程中等于0,在父进程中等于本次fork创建的子进程的进程ID

代码:

#include <stdio.h>
#include <unistd.h>


int main(void)
{
	pid_t p1 = -1;
	
	p1 = fork();  //fork 函数返回 2 次  : 等于0 是子进程, 大于0是父进程
	
	if(0 == p1)
	{
		/* 这里一定是 子进程 */
		printf("子进程 的 父进程id = %d \n",getppid());
		printf(" 子进程 hello word, pid = %d \n",getpid());  //getpid() 打印进程 ID 号
		printf("子进程 : 你好 \n");
		
	}
	
	if (p1 > 0)
	{
		/* 这里一定是 父进程 */
		printf(" 父进程 hello word, pid = %d \n",getpid());  //getpid() 打印进程 ID 号
		printf("父进程 p1 = %d \n",p1);
	}
	
	if (p1 < 0)
	{
		/* 这里一定是 fock出错了  */
		
	}
	

	
		/* 在这里 所做的 操作, 父进程和 子进程 都有的,所以会打印 两次 printf */
		//printf("hello word, pid = %d \n",getpid());  //getpid() 打印进程 ID 号
	
	
	return 0;
}


 运行结果:

 fork 建立成功以后, 

子进程 和 父进程都是一个独立的个体

子进程也有单独的 PCB结构体

子进程、和父进程都会 被调度系统 调用

代码:来自朱老师物联网大讲堂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大漠飞鹰6666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值