fork的使用

在牛客做题时遇到了这样一个问题:

int main(){fork()||fork();}共创建几个进程:_____

回想之前一直在这里跌倒从来没有爬起来过的经历,痛定思痛,来好好的思考了一下fork()函数的使用

fork函数初识

在linux中fork函数是非常重要的函数,它从已经存在的进程中创建一个新进程。新进程为子进程,而原进程为父进程。

#include <unistd.h>
pid_t fork(void);
返回值:
	子进程中返回0
	父进程中返回子进程id
	出错返回-1

进程调用fork,当控制转移到内核中的fork代码后,内核会做这样的操作:

  1. 分配新的内存块和内存数据结构给子进程
  2. 将父进程部分数据结构内容拷贝到子进程中
  3. 添加子进程到系统进程列表中
  4. fork返回,开始调度器调度

在这里插入图片描述

当一个进程调用fork后,就会有两个二进制代码相同的进程,而且他们都运行到相同的地方。

注意:fork后父进程还是子进程先执行决定于调度器

fork调用失败的原因

  • 系统中有太多进程
  • 实际用户的进程数超过了限制

fork常规用法

  1. 一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求
  2. 一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数

子进程继承父进程

使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。

子进程与父进程的区别在于:

1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)

2、各自的进程ID和父进程ID不同

3、子进程的未决告警被清除;

4、子进程的未决信号集设置为空集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值