父子进程与fork函数
一.父进程与子进程
进程id (PID)
父进程id(PPID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{printf("pid: %d\n",getpid());printf("ppid: %d\n",getppid());return 0;
}
二.系统调用创建进程-fork函数
fork创建子进程,fork之前的代码被父进程执行,fork之后的代码,默认情况下被父子进程都可以执行;fork之后,父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
fork( )创建子进程操作系统做了什么?系统内存多了一个进程,先描述再组织;子进程执行的数据和代码来源是父进程
#include <stdio,h>
#inculde <sys/types.h>
#include <unistd.h>int mian()
{int ret=fork();printf("hello proc: %d!,ret: %d\n",getpid(),ret);sleep(1);return 0;
}
fork之后就有2个进程,这两个进程谁先被调度不确定,要看操作系统的调度算法
1.fork函数初识
进程调用fork函数,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给子进程,将父进程部分数据结构内容拷贝至子进程,添加子进程到系统进程列表当中,fork返回开始调度器调度
2.fork函数返回值
fork函数会有两次返回值,给父进程返回子进程的pid(本质是用来区分子进程),给子进程返回0
父子进程立场:父进程不需要标识,子进程需要标识,子进程是要执行任务的,父进程需要区分子进程,子进程不需要
如何理解fork有两个返回值的问题?
pid_t fork()
{
1.拷贝来自父进程,形成子进程对应的数据结构
task_struct,mm_struct,页表,文件,其他信息
2.操作系统也要管理子进程,描述+组织
task_struct链接进入系统的进程列表中
add task_struct cpu_runqueue
3.走到这里操作系统能看到多了一个task_struct,多个进程从这里开始,子进程创建完成
return pid;
}
3.写时拷贝
通常父子代码共享,父子进程在不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本(这里的共享指父子进程对应的页表指向的是同一块物理内存)
为什么要写时拷贝?
1.进程具有独立性,父子进程也如此
2.不在创建时就分开因为子进程不一定会使用父进程所有的数据写入本质需要的时候:按需分配,延时分配(本质可以更高效使用任何内存空间)
4.fork常规用法
一个父进程希望复制自己,使父子进程同时执行不同的代码段,比如父进程等待客户端请求,生成子进程来处理请求。一个进程要执行一个不同的程序,例如子进程从fork返回后,调用exe函数
5.fork调用失败的原因
系统中有太多的进程,实际用户的进程数量超过了限制
父子进程与fork函数相关推荐
- linux系统编程学习_(2)进程控制-- fork函数、exec函数族、回收子进程--孤儿进程僵尸进程、wait函数
linux系统编程学习_(2)进程控制-- fork函数.exec函数族.回收子进程–孤儿进程僵尸进程.wait函数 进程控制 fork()函数 创建一个子进程. pid_t fork(void); ...
- Linux_父子进程与fork
进程标识 每个进程都有一个非负整数表示的唯一进程ID,如交换进程(即调度进程)ID为0,init进程ID为1,页守护进程ID为2: 函数fork 原型如下: fork函数被调用一次,但返回两次,两次返 ...
- linux创建多个子进程,[Linux进程]使用fork函数创建多个子进程
#include #include int main (void) { pid_t pid1,pid2; //进程标识符 pid1 = fork(); //创建一个新的进程 if(pid ...
- 理解进程、通过调用 fork 函数创建进程
文章目录 1.理解进程 1.1 CPU核的个数与进程数 1.2 进程 ID 2.通过调用 fork 函数创建进程 1.理解进程 进程(Process),其定义如下:"占用内存空间的正在运行的 ...
- linux中fork函数及子进程父进程执行顺序
目录 一.fork入门知识 二.fork进阶知识 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以 ...
- c语言fork函数fpid初始值,进程创建,fork()函数讲解
一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也 就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同 ...
- linux进程管理fork,Linux -- 进程管理之 fork() 函数
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. Test1 f ...
- 【Linux系统编程】fork()函数详解
00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...
- 【Linux系统编程】fork() 函数详解
需要的头文件: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 功能: 用于从一个已存在的进程中创建一 ...
- 【Linux】写实拷贝、父子进程间数据共享以及僵死进程
目录 一.写实拷贝 二.父子进程间数据共享 三.僵死进程 我们都知道fork之后,会产生子进程,那么今天就来看一下,产生的子进程与父进程之间的数据共享问题.要说这个我们必须明确写实拷贝的概念 一.写实 ...
最新文章
- zabbis监控mysql数据库
- BugkuCTF web基础$_GET
- 【建议收藏】这个工具专门用于寻找路由器中的安全漏洞
- 天啊!NBA球星将举办第一届科技峰会!
- Java学习笔记之:Java String类
- python连接数据库mysql错误1045、手动登录可以_登录mysql错误1045解决方法
- 蚂蚁森林:不存在网友反馈的“没有造林”的情况 干旱造成梭梭矮小
- 机器学习算法之手撕SVM-线性(理论)
- 大专适合学习php么_中专毕业上大专好还是出来工作?
- Bar函数--Matplotlib
- 《Cocos2D-x权威指南》——第3章 Cocos2D-x中的核心类
- 深度学习神经网络中的梯度检查
- 最爱的文本编辑器_VS Code——插件推荐整理
- Gerber文件各层的介绍
- CentOS 7下安装svn版本访问工具rabbitvcs
- oracle for扫描行,请教索引范围扫描具体IO行为?
- 太难了 | 2019年互联网寒冬,如何防止自己被裁员失业?
- 上中下结构DIV CSS布局实例
- sql 树形 子节点获取最顶级的节点
- 脊髓空洞症先知先觉早期症状
热门文章
- 海康摄像头使用RTSP
- oracle常见sql笔试题,一路SQL笔试题
- 信号与系统19(拉普拉斯逆变换)
- 中国分布式光纤传感(DFOS)行业竞争现状与未来趋势预测报告2022-2027
- 关于EasyExcel 优化,实现格式自定义,数据字典自动转化。
- 信捷PLC Modbus通讯 (Modbus_TCP与Modbus_RTU)
- Cknife(中国菜刀) and AntSword(中国蚁剑)使用
- 获取目标服务器c盘下flag文件信息,公开课基础演练靶场 第六章 webshell控制目标详细解题思路...
- RabbitMQ-KeepLive
- cad转dxf格式文件太大_如何将DWG DXF互转,一招教你解决难题