基础理论

在 Linux 中,fork() 函数是一个非常重要的系统调用,它是创建新进程的主要方式。它会创建一个新的进程,该进程与父进程几乎完全相同,包括代码段、数据段和堆栈等。但是,新的进程有自己的进程 ID(PID),并拥有自己的地址空间和资源。

函数原型与实例

fork() 函数的调用格式如下:

#include<unistd.h>
pid_t fork(void);

与fork()函数常常一起出现的两个函数

pid_t getpid()       获取当前进程id
pid_t getppid()     获取当前进程的父进程id

该函数(fork)没有参数,返回一个 PID,表示当前进程的子进程的 PID。如果 fork() 函数失败,返回 -1。
在调用 fork() 函数后,会创建一个新的进程,它是原始进程的副本。子进程的地址空间与父进程相同,但是子进程的堆栈和程序计数器等寄存器的值是不同的。子进程从 fork() 函数返回 0,父进程从 fork() 函数返回子进程的 PID。
总的来说,如果成功的话,从宏观上看,返回了两次,一次是父进程返回子进程PID,一次是子进程返回0;
父子进程代码段是完全一样的,但是子进程会从fork()以后开始运行,也就是说,在fork前的代码子进程虽然有,但是不会运行。
下面是一个简单的例子,展示了如何使用 fork() 函数创建新进程。

#include<stdio.h>#include<unistd.h>intmain() {pid_t pid;printf("before fork()\n");//父进程运行,子进程不运行pid = fork();if (pid == -1) {printf("Error: fork failed.\n");} elseif (pid == 0) {printf("I'm the child process, my PID is %d.\n", getpid());} else {printf("I'm the parent process, my PID is %d and my child's PID is %d.\n", getpid(), pid);}return0;
}

在这个例子中,我们首先声明了一个 pid 变量,然后调用 fork() 函数。如果 fork() 函数返回 -1,表示创建进程失败,我们将打印一条错误消息。否则,我们检查 pid 的值。如果 pid 是 0,表示当前进程是子进程。如果 pid 大于 0,表示当前进程是父进程,并且 pid 是子进程的 PID。我们可以根据 pid 的值,打印不同的消息。
具体执行结果:
执行后我们会发现,大部分情况下,子进程PID会等于父进程PID+1.
总结一下,fork() 函数是 Linux 中创建新进程的一种常用方法。通过调用该函数,可以在当前进程的基础上创建一个新进程,使得父进程和子进程可以独立运行。如果你想要深入了解 Linux 进程的创建和管理,可以进一步学习 Linux 进程的相关知识

拓展:创建n个进程


运行结果

我们会发现进程是异步执行的,为什么呢?因为fork()在操作系统中相当于几乎同步创建了子进程,所以大家抢占CPU,谁先拿到谁先执行,如果想有顺序,可以sleep一下

父子进程关系

父子进程相同:
刚fork后。 data段、text段、堆、栈、环境变量、全局变量、宿主目录位置、进程工作目录位置、信号处理方式

父子进程不同:
进程id、返回值、各自的父进程、进程创建时间、闹钟、未决信号集

父子进程共享:
1.文件描述符 2. mmap映射区。
读时共享、写时复制。———————— 全局变量。(意思就是对于全局变量,读取的话是共享的,要写的话,会先复制一份到本地,再写,也就是说写的时候不共享)

总结

在Linux中,fork函数是多进程编程中最常用的函数之一,

linux fork函数及其简单应用相关推荐

  1. linux fork函数的精辟解说

    此文原文来源于一个blog,文章的名称为:linux fork函数的精辟解说原文地址:http://blog.chinaunix.net/space.php?uid=12461657&do=b ...

  2. Linux fork()函数底层CopyOnWrite写时复制实现原理剖析

    创建子进程的速度应该是怎么样的? 如果父进程是redis,内存数据比如说有10G,需要考虑的有两个点: ①速度如何 ②内存空间够不够 在Linux中有个系统调用--fork(): ①速度:快 ②空间: ...

  3. Unix/Linux fork()函数的理解

    作者:王姗姗,华清远见嵌入式学院讲师. 对于刚刚接触Unix/Linux操作系统,在Linux下编写多进程的人来说,fork是最难理解的概念之一:它执行一次却返回两个值. 首先我们来看下fork函数的 ...

  4. linux fork函数详解

    引言 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做 ...

  5. fork是linux函数吗,linux fork()函数

    概述 最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解.现总结如下: 1.函数本身 (1)头文件 #include #include (2)函数原型 pid_t fo ...

  6. linux fork函数浅析

    #include <sys/types.h> #include <unistd.h> /* 功能:复制进程 參数:无 返回值: 成功: 父进程:返回子进程id 子进程:返回0 ...

  7. linux fork 函数,Linux的fork()系统调用

    Linux的fork()系统调用,就是以父进程为模版创建子进程,是Linux系统的进程管理机制的核心API之一,另一个是调度器函数schedule(),它的用户态API就是之前说自旋锁时提到的sche ...

  8. 【Linux系统编程】fork()函数详解

    00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...

  9. 【Linux系统编程】fork() 函数详解

    需要的头文件: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 功能: 用于从一个已存在的进程中创建一 ...

最新文章

  1. 第三个Sprint冲刺第八天(燃尽图)
  2. android zip解压缩
  3. 2015年中国人才招聘趋势报告
  4. 使用ipmitool命令检测电源模块状态
  5. python install_[Python] Linux下python install
  6. HDU 1527 取石子游戏
  7. 机器学习(Machine Learning)深度学习(Deep Learning)较全面的资料
  8. 利用PS制作GIF动图
  9. c语言 计算机 只用if,C语言if语句的用法
  10. 秒懂三层交换机的作用及使用
  11. Eclipse中的工作空间(Workspace)
  12. 地图刷新 android,android – 如何刷新谷歌地图.
  13. 关于哪些信息是个人隐私信息
  14. 用计算机绘制函数图像数学大师,用Excel来绘制数学中的函数图像
  15. 【小常识】打印机身份证双面打印方法
  16. Android系统各个版本系统特性整理(1.1-6.0)
  17. Tensroflow 手动编译TFLite
  18. MySQL枚举类型的“八宗罪”
  19. 心血来潮,总结技术框架
  20. echarts——颜色控制

热门文章

  1. 如何通过发送短信办理移动电话卡流量套餐
  2. BBEdit for Mac,专业html文本编辑器
  3. 如何开发通达信,东方财富,飞狐等股票dll插件呢?
  4. 【生态大会】CDEC2019上海站 倒计时3天!软件国际巨头齐聚上海滩
  5. 无线风力报警仪塔吊安全助手使用的意义
  6. 三星发布Galaxy A9s,欲重树中国市场领先地位
  7. java计算机毕业设计商院足球赛事管理源程序+mysql+系统+lw文档+远程调试
  8. 提高编程技能的5种方法
  9. C# Trim函数所有用法快速掌握
  10. HTML5音乐播放器 1