【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个


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

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

相关推荐
云上艺旅18 小时前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes
你觉得20518 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
cg501718 小时前
Spring Boot 的配置文件
java·linux·spring boot
暮云星影18 小时前
三、FFmpeg学习笔记
linux·ffmpeg
rainFFrain19 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon19 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
mingqian_chu19 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu
A旧城以西19 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
无所谓จุ๊บ19 小时前
VTK知识学习(50)- 交互与Widget(一)
学习·vtk
FAREWELL0007519 小时前
C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法
学习·c#·面向对象·运算符重载·oop·拓展方法