Linux:进程创建(进程控制一)

前言:

前面我们已经学习了进程初识,现在我们来深入进程的学习,也就是进程的控制

1.前面我们已经了解了fork创建子进程,但是这篇博客我们将结合前面的虚拟地址空间与物理地址空间,再次深入学习fork函数

在 linux 中 fork 函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程,

⽽原进程为⽗进程

我们创建一个code.c来实验一下

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    pid_t id = fork();
    if (id == 0)
    {
        printf("我是子进程,pid : %d, ppid : %d\n", getpid(), getppid());
    }
    else 
    {
        printf("我是父进程,pid : %d\n", getpid());
    }
    return 0;
}

运行一下就有如下结果:

返回值:⼦进程中返回0,⽗进程返回⼦进程id,出错返回-1
1. 为什么要给⼦进程返回0,⽗进程返回⼦进程pid?

因为父进程有很多子进程,所以需要每个子进程的pid,而子进程只有一个父进程,可以通过ppid来找到,所以只需要.-1 / 0来判断是否创建成功

2. 为甚⼀个函数fork会有两个返回值?

因为有两个进程在进行代码

3. 为什么⼀个id即等于0,⼜⼤于0?

这就是虚拟地址的原因,两个进程的id指向同一块虚拟地址,但是不同进程通过该虚拟地址映射到的物理地址不一样,导致id即等于0,⼜⼤于0

进程调⽤ fork ,当控制转移到内核中的 fork 代码后,内核做:

• 分配新的内存块和内核数据结构给⼦进程

• 将⽗进程部分数据结构内容拷⻉⾄⼦进程

• 添加⼦进程到系统进程列表当中

• fork 返回,开始调度器调度

可以用下图来表示fork的过程

所以,fork之前⽗进程独⽴执⾏,fork之后,⽗⼦两个执⾏流分别执⾏。注意,fork之后,谁先执⾏完全由调度器决定

2.对于上面的问题三,我们刚刚只是简单的解答,下面我们来具体解答

写时拷⻉

通常,⽗⼦代码共享,⽗⼦再不写⼊时,数据也是共享的,当任意⼀⽅试图写⼊,便以写时拷⻉的⽅式各⾃⼀份副本。具体⻅下图:

因为有写时拷⻉技术的存在,所以⽗⼦进程得以彻底分离离!完成了进程独⽴性的技术保证!

写时拷⻉,是⼀种延时申请技术,可以提⾼整机内存的使⽤率

所以刚刚发生了写实拷贝,使id = 0 且 > 0!!

3.fork常规⽤法

• ⼀个⽗进程希望复制⾃⼰,使⽗⼦进程同时执⾏不同的代码段。例如,⽗进程等待客⼾端请求,

⽣成⼦进程来处理请求

• ⼀个进程要执⾏⼀个不同的程序。例如⼦进程从fork返回后,调⽤exec函数

4.fork调⽤失败的原因

• 系统中有太多的进程

• 实际⽤⼾的进程数超过了限制

这就是关于fork的补充博客啦,充分了解fork可以更好的帮助我们了解进程知识,所以大家记得温故而知新哦~~

相关推荐
£漫步 云端彡2 分钟前
Golang学习历程【第十二篇 错误处理(error)】
开发语言·学习·golang
代码AI弗森7 分钟前
NAS 服务器 vs 普通服务器:一场关于「存储中心」与「计算中心」的系统分工之争
运维·服务器
£漫步 云端彡7 分钟前
Golang学习历程【第九篇 结构体(struct)】
学习·golang·xcode
川西胖墩墩8 分钟前
新手在线画泳道图PC端简单操作快速做出标准化流程图表
学习·流程图·敏捷流程
saoys11 分钟前
Opencv 学习笔记:提取轮廓中心点坐标(矩计算法)
笔记·opencv·学习
来鸟 鸣间11 分钟前
linux下ffmpeg源码编译
linux·运维·ffmpeg
赛博云推-Twitter热门霸屏工具16 分钟前
Twitter 自动化与热门霸屏实战:以赛博云推为例的技术解析
运维·自动化·twitter
菜鸟程序猿小章19 分钟前
人大金仓服务器定时备份
运维·服务器
zt1985q24 分钟前
本地部署静态网站生成工具 Vuepress 并实现外部访问
运维·服务器·网络·数据库·网络协议
拾光Ծ26 分钟前
【Linux】文件系统核心(二):深入 Ext2 底层:Block Group 结构 + inode 索引,轻松锁定文件的增删改查
linux·软硬链接·inode·ext2文件系统·block group·文件系统原理·linux面试