【Linux】fork()函数

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

操作系统给用户提供了一系列的函数接口,让用户进行与进程有关的编程。

一、fork()函数

fork()函数用于创建一个子进程 ,调用fork()函数的是父进程

该子进程与父进程几乎完全相同,父子进程的代码共享,但是他们的进程id(PID)不同。

fork()函数拥有两个返回值:

  • 父进程的fork()函数返回子进程的pid
  • 子进程的fork()函数返回0

父进程进行代码的全部,子进程执行从fork()函数后的代码,父子进程同时执行

fork()函数的使用举例:

cpp 复制代码
#include <stdio.h>
#include <unistd.h>
int main()
{
	printf("11111111\n");
	pid_t pid;
	pid = fork();
	if(pid > 0)
	{
		//Father
		printf("Father pid:%d \n",getpid());
	}
	else if(pid == 0)
	{
		//Child
		printf("Child pid:%d,Father pid:%d\n",getpid(),getppid());
	}
	else
	{
		perror("processs fail\n");
	}
	printf("22222\n");
	getchar();
	return 0;
}

可以看出 父进程执行了:

printf("11111111\n");

printf("Father pid:%d \n",getpid());

printf("22222\n");

getchar();

子进程执行了:

printf("Child pid:%d,Father pid:%d\n",getpid(),getppid());

printf("22222\n");

getchar();
子进程并没有执行fork()函数以上的代码。

如何看出父子进程是同时执行的呢?

在子进程代码块中加入getchar()阻塞,

这次子进程并没有继续向下执行printf("22222\n");

二、fork()函数的读时共享,写时复制

传统的fork()函数会将父进程的资源拷贝一份继承给子进程,但是子进程可能不会用到这个拷贝的资源,造成浪费

写时复制指的是在子进程(或父进程)试图访问父进程的资源时,才将父进程的资源拷贝一份,然后修改这个资源的副本,不影响其他进程共享读取原来的资源(读时共享)

三、循环fork

以下的代码会创建几个子线程,共有多少个线程?

cpp 复制代码
fork();
fork();
cpp 复制代码
for(int i = 0;i < 3;i++)
{
	fork();
}

子进程: 2 i − 1 2^i -1 2i−1个

总进程数量: 2 i 2^i 2i个


|--------------------------------------|
| 大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |

|---------------------------------------------------------------|
| 大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |

相关推荐
rellvera14 分钟前
【强化学习的数学原理】第02课-贝尔曼公式-笔记
笔记·机器学习
Mephisto.java25 分钟前
【大数据学习 | Spark-Core】Spark提交及运行流程
大数据·学习·spark
blessing。。1 小时前
I2C学习
linux·单片机·嵌入式硬件·嵌入式
PandaCave1 小时前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习
yuwinter1 小时前
鸿蒙HarmonyOS学习笔记(2)
笔记·学习·harmonyos
2202_754421541 小时前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
red_redemption1 小时前
自由学习记录(23)
学习·unity·lua·ab包
幽兰的天空2 小时前
默语博主的推荐:探索技术世界的旅程
学习·程序人生·生活·美食·交友·美女·帅哥
运维&陈同学2 小时前
【zookeeper03】消息队列与微服务之zookeeper集群部署
linux·微服务·zookeeper·云原生·消息队列·云计算·java-zookeeper
游走于计算机中摆烂的2 小时前
启动前后端分离项目笔记
java·vue.js·笔记