在CSAPP课程学习中,教材的第八章:异常控制流中出现了一个名为Fork的函数,在书中提到它可以将一个进程复制为几乎相同却不完全相同的两个进程,被用于系统调用错误处理中,这使我对它产生了浓厚的兴趣。
下面是对于书中fork函数的部分的个人理解:
调用:父进程通过调用fork函数创建一个新的运行的子进程。

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

fork函数只被调用一次却会返回两次,其中,子进程返回0,父进程返回子进程的PID,当发生错误时返回-1,返回值被用于区分父进程与子进程。
新创建的子进程与父进程几乎但是不完全相同。
子进程会得到与父进程用户及虚拟地址空间相同但是完全独立的一份副本,包括代码、数据段、堆、共享库和用户栈。
子进程可以读写父进程中打开的任何文件。
子进程与父进程的最大不同是PID不同。
如下是一个使用fork创建一个新进程的例子:

int main(){pid_t pid;int x = 1;pid = Fork();if (pid == 0){//Childprintf("child : x=%d\n",++x);exit(0);}//Parentprintf("parent : x=%d\n",--x);exit(0);
}

运行结果:

linux> ./fork
parent : x=0;
child : x=2;

这个例子其中的一些规律:
fork函数被调用了一次但是出现了两次返回;
父进程与子进程是并发执行的;
父进程与子进程具有相同但是相互独立的地址空间,正如上文所说,子进程会得到与父进程用户及虚拟地址空间相同但是完全独立的一份副本,但是由于子进程与父进程的地址空间是相互独立的,所以当进程执行时,对于变量等所做的任何改变都是相互独立互不干涉的,不会反映在对方的进程内存中,因此可见最后子进程与父进程输出的x值是不同的。
父进程与子进程共享文件,所以他们都在屏幕上进行了输出。

再来看看另一个例子:

int main(){int x =  1;if(Fork()==0)printf("p1:x=%d\n",++x);printf("p2:x=%d\n",--x);exit(0);
}

这个例子中需要注意的是,我们使用了第一个if语句来判断fork()的返回值,依据上文我们可以知道,当fork返回值为0时,表示这个是子进程,而在这块代码中,if语句判断完成后会执行第一句printf,因此我们可知第一句printf属于子进程,但是父进程呢?父进程则不会进入if语句中,所以父进程的代码只执行第二条printf,与此同时我们知道子进程与父进程会共享代码,因此父进程仅有的这个printf也会被子进程复制一份再执行一次,因此我们可知最后的运行输出结果为:
p1:x=2
p2:x=1 //这两行是子进程的输出结果
p2:x=0 //这一行是父进程的输出结果

通过这两个例子,我们可以大致明白fork函数的作用了,那么回到课本上对于调用fork函数进行系统调用错误处理的部分:
pid = Fork();
我们展开这个函数:

pid_t Fork(void)
{pid_t pid;if ((pid = fork()) < 0)unix_error("Fork error");return pid;
}void unix_error(char *msg) //Unix_style error
{fprintf(stderr, "%s : %s\n",msg,strerror(errno));//strerror()为错误报告函数exit(0);
}

可以看到在此当我们调用一次fork函数时,我们运行的进程会自动再创建一个子进程,当我们的程序出现系统调用错误时,如果不调用fork,Unix系统通常会直接将函数返回-1,但是如果调用了fork函数,我们将可以在出错时利用到子进程中的错误报告函数来向我们报告具体发生了什么错误,并且也不会影响父进程的正常运行。

以上就是本人对于fork函数知识点的学习感悟。

CSAPP作业:Fork函数的学习感悟相关推荐

  1. Linux基础学习系列:对于fork()函数的学习,及进程创建相关知识

    fork()函数 :由当前进程再生成一个进程出来 #include <sys/types.h> #include <unistdh> pid_t fork(void); 返回: ...

  2. UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习

    在"进程控制三部曲"中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork 创建的新进程与调用进 ...

  3. linux系统编程学习_(2)进程控制-- fork函数、exec函数族、回收子进程--孤儿进程僵尸进程、wait函数

    linux系统编程学习_(2)进程控制-- fork函数.exec函数族.回收子进程–孤儿进程僵尸进程.wait函数 进程控制 fork()函数 创建一个子进程. pid_t fork(void); ...

  4. linux_进程类相关学习-fork函数-getpid函数-getppid函数-getuid函数-geteuid函数-getgid函数-getegid函数-进程之间共享数据-进程gdb调试

    接上一篇:linux_环境变量-C语言代码打印环境变量-getenv函数-setenv函数-unsetenv函数 本次来分享进程类相关的学习,主要就是分享一些函数的使用,来,开始上菜: 目录 1.fo ...

  5. 学习分享:fork函数与vfork函数的区别

    一.fork函数 (一)fork函数头文件 #include <sys/types.h>        #include <unistd.h> (二)fork函数原型 pid_ ...

  6. 浅显理解*nix下的守护进程机制及fork函数

    最近空闲时间重新仔细看了一下memcached的使用说明文档,硬着头皮看了一点源码,有时候看到一些晦涩的c函数感觉实在恍惚只能跳过.不过也不算是全无收获,终于LZ还敢再看c语言,终于LZ又看起了c语言 ...

  7. 4. 吴恩达机器学习课程-作业4-神经网络学习

    fork了别人的项目,自己重新填写,我的代码如下 https://gitee.com/fakerlove/machine-learning/tree/master/code 代码原链接 文章目录 4. ...

  8. fork函数产生进程

    Chinaunix首页 | 论坛 | 认证专区 | 博客 登录 | 注册 hhktonybutbueatiful.blog.chinaunix.net 目标赋予我们生命的意义和目的.有了目标,我们才会 ...

  9. 管理经济学的大作业——边际效应分析在学习生活中的应用

    边际效应分析在学习生活中的应用 目录 边际效应分析在学习生活中的应用 1.引言 2.边际效应 3生活中的边际效应 3.1递增的边际效应 3.2递减的边际效应 3.3边际效应的综合分析 本文为我管理经济 ...

最新文章

  1. 规范化制度保障安擎高品质产品
  2. Web应用扫描测试工具Vega
  3. java多态性详解——父类引用子类对象
  4. protobuf编码
  5. php空间限制磁盘限额,ORA-01536:超出表空间XXXX的空间限额
  6. 高并发第一弹:准备阶段 了解高并发
  7. C++实现的队列queue
  8. 民办大学计算机专业教师,干货!民办大学和独立院校教师创新排行榜,这五个高校最亮眼...
  9. 图解算法系列笔记(二)
  10. 异构计算 软硬协同设计_优雅的设计CNN并行架构-软硬协同之位宽设置(2)
  11. iOS开发项目篇—02添加子控制器以及项目分层
  12. 学生选课系统代码-6-conf配置层
  13. 隐藏activity的头部的activity名
  14. Daily Scrum 12.13
  15. 常用的数据库索引优化语句总结
  16. 删除word文档中的空白页
  17. 计算机专业期末总结200字,学期末自我总结200字
  18. 关于读书学习与思考力。 文/江湖一剑客
  19. openwrt 无线基础知识介绍
  20. 魔兽对战平台官网地图《小兵合成》 最强攻略+合成表+隐藏合成+隐藏英雄+

热门文章

  1. 水果销售系统功能设计
  2. 手机APP抓包问题总结及相关解决方案
  3. Hadoop新手篇:hadoop入门基础教程 1
  4. ffmpeg examples -- demuxing_decoding
  5. vue(移动端)使用高德地图实现精准定位
  6. 下着雨的星期天下午,年素清一个人走在外面
  7. 排球分组循环交叉编排_【排球】二青会体校组男子排球(B组)预赛落幕 海口队顺利晋级决赛...
  8. 南京大学计算机考研考试大纲,南京大学计算机技术(专业学位)研究生考试科目和考研参考书目...
  9. 【架构风格】架构风格演进和领域架构分类
  10. x123.fun gf.php,hao123网址源码下载,hao123源码php版带后台 v2.1