fork()函数  

在 Linux 中创建一个新进程的唯一方法是使用fork()函数。fork()函数是 Linux 系统中一个非常重要的函数,和咱们以前遇到过的函数由一些区别,因为它看起来执行一次却返回两个值,这又作何解释?不着急,慢慢看。

函数说明

fork()函数用于从已存在的一个进程中创建一个新的进程,新进程称为子进程,而原进程称为父进程。使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。

因为子进程几乎是父进程的完全复制,所以父子进程会运行同一个程序。这就需要用一种方式来区分它们,并使它们照此运行,否则,这两个进程不可能做不同的事。

实际上是在父进程中执行fork()函数时,父进程会复制出一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行,从而使两个进程分别获得其所属fork()函数的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0。因此,可以通过返回值来判定该进程是父进程还是子进程。

同时可以看出,使用fork()函数的代价是很大的,它复制了父进程中的代码段、数据段和堆栈段里的大部分内容,使得 fork()函数的系统开销比较大,而且执行速度页不是很快。

函数语法

下表列出了 fork() 函数的语法要点

基础实验

如下为fork()函数的基础实验程序

程序代码我上传到资源,可以自己下载,点此下载

将它编写成C文件,然后输入命令:gcc fork.c -o fork

接着执行命令:./fork,就可以看到如下图的成功执行结果

当然,你也可以使用命令:arm-linux-gcc fork.c -o fork 交叉编译后下载到板子上运行也可。

转载于:https://www.cnblogs.com/snake-hand/archive/2013/06/08/3127402.html

Linux多任务编程(二)---fork()函数及其基础实验相关推荐

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

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

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

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

  3. Linux系统编程:fork函数的使用【循环创建N个子线程】

    fork函数介绍 在linux下面进行系统编程,一定要养成一个好习惯,不懂的函数 直接 找男人,用man 指令进行查看,虽然是全英文 但是要强迫自己 学会看英文文档!下面是介绍,我们看重点. FORK ...

  4. Linux多任务编程之五:exit()和_exit()函数(转)

    来源:CSDN  作者:王文松   转自:Linux公社 ----------------------------------------------------------------------- ...

  5. Linux多任务编程之七:Linux守护进程及其基础实验(转)

    来源:CSDN  作者:王文松  转自Linux公社 ------------------------------------------------------------------------- ...

  6. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  7. Linux 串口编程二 深入了解 termios

    前言 这一系列串口编程重点在应用层编程,但是在讲解原理与相关概念时需要对驱动框架有个基础的认识.如果只是浅尝辄止,以后在遇到串口驱动与应用层程序调试难免遇到瓶颈.关于 tty驱动架构参见我的其他博客: ...

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

    00. 目录 文章目录 00. 目录 01. vfork函数 02. fork和vfork区别 03. 父子进程地址空间 04. 附录 01. vfork函数 函数分析 #include <sy ...

  9. Linux网络编程之套接字基础

    Linux网络编程之套接字基础 1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_ ...

最新文章

  1. 想学Python?快看看这个教程!收藏!
  2. 13个球一个天平,现知道只有一个和其它的重量不同,怎样称才能用三次就找到那个球?...
  3. 凸优化 [Convex Optimization] — [美] 鲍德(Stephen Boyd),Lieven Vandenberghe 著,王书宁,许鋆,黄晓霖 译
  4. 20 岁发表 SCI 的学霸,梦想用算法改变世界
  5. 前端学习(727):冒泡排序原理
  6. 【HDU - 6186】CS Course(按位与,按位或,按位异或的区间统计,二进制拆位)
  7. java并发编程实战阅读总结(a)
  8. java初学者定远期目标_JAVA题,新手求解
  9. DOM 事件深入浅出(一)
  10. 10种开发以及改善应用的低成本方法
  11. C++ 事件驱动型银行排队模拟
  12. 6-1 多态性与虚函数
  13. 基于Android的家校联系平台开发(论文)
  14. 达观电网故障知识图谱,三大功能全面提升电网故障处置效率
  15. QT报错:The inferior stopped because it received a signal from the Operating System.
  16. 谷歌发布 12 款 Chrome 新皮肤
  17. my read travel
  18. 2020年北大软微推免经历
  19. 7-4 求幂级数展开的部分和(20 分)
  20. c语言编程电机星三角启动,三相异步电动机星三角减压启动控制plc编程实例

热门文章

  1. 递归法:从n个小球中取m个小球(不放回),共有多少种取法?
  2. GameObject.Find() 和 Transform.Find()的区别
  3. Unity3D之UGUI基础6:Slider滑条
  4. 圆方树(bzoj 2125: 最短路)
  5. bzoj 4017: 小Q的无敌异或(线段树)
  6. POJ 2243:Knight Moves(双向BFS)
  7. C++vector基础容器3.0
  8. [paper reading] CenterNet (Object as Points)
  9. SDK中利用COM打印helloworld时报错DONE pin is not high on target FPGA的一种可能的解决办法
  10. 计算机课有什么作业,计算机组成原理课堂作业