fork的使用

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

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

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

fork函数初识

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

1
2
3
4
5
6
#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、子进程的未决信号集设置为空集。

0%