[Chapter 3 Process]Practice 3.1 相关知识:进程创建、fork函数
3.1 Using the program shown in the Figure3.30, explain what the output will be at LINE A

答案:LINE A 处的输出是PARENT: value = 5。
解析: 此问题的相关知识有进程创建、fork函数。
当父进程调用fork函数时, 新创建的子进程几乎但不完全与父进程相同, 子进程会获得一份父进程用户级虚拟地址空间的拷贝, 但是此拷贝是独立的, 拷贝内容包括文本、数据和bss段、堆以及用户栈。
所以在图中程序执行时, 子进程有一份自己的虚拟地址空间, 里面存放着和父进程相同的一份代码、数据、用户栈的拷贝, 而且是与父进程的地址空间是独立的。 因此, 子进程和父进程都有一个value变量, 二者互不影响。程序执行时, 子进程中的value会改变为20, 但是父进程的value值依然是5.
扩展: 在父进程创建新的子进程时, 子进程还会获得与父进程打开文件描述符相同的拷贝, 也就是说, 当父进程调用fork函数时, 子进程可以读写父进程中打开的任何文件。 父进程和子进程之间的最大区别在于它们有不同的PID。
fork函数是有趣的(也是常常令人迷惑的), 因为它只被调用一次, 却会返回两次: 一次是在调用进程(父进程)中返回, 返回值是新建的子进程的PID; 一次是在新建的子进程中返回, 返回值是0。 因此总是可以利用fork的返回值来判断程序是在父进程还是子进程中执行。
#include <sys/types.h>
#include<unistd.h>
pid_t fork(void);
返回: 子进程返回0, 父进程返回子进程的PID, 如果出错, 则为-1。
如果是第一次学习fork函数, 画进程图通常会有所帮助, 其中每个水平的箭头对应与从左到右执行指令的进程, 而每个垂直的箭头对应于fork函数的执行。


下面的图示是一个父进程创建子进程的实例

当在Linux系统上运行这个程序时, 我们得到下面的结果:
parent: x = 0
child : x = 2
这个简单的例子有一些微妙的方面。
*调用一次, 返回两次。 对于只创建一个子进程来说, 这还是挺直接的, 但是具有多个fork实例的程序可能会令人迷惑。
*并发执行。 父进程和子进程是并发运行的独立进程。 内核能够以任意方式交替执行他们的逻辑控制流中的指令。在此系统上运行这个程序时, 父进程先完成它的printf语句, 然后是子进程。 然而, 在另一个系统上可能正好相反。 一般而言, 作为程序员, 决不能对不同进程中指令的交替执行做出任何假设。
*相同的但是独立的地址空间。 如果能够在fork函数在父进程和子进程中返回后立即暂停这两个进程, 我们会看到每个进程的地址空间都是相同的。 每个进程的有相同的用户栈、 相同的本地变量值、相同的堆、相同的全局变量值, 以及相同的代码。 因此, 在实例程序中, 当fork在第8行返回时, 本地变量x在父进程和子进程都为1. 然而因为父进程和子进程都是独立的进程, 它们都有自己的私有地址空间。 父进程和子进程对x所做的任何改变都是独立的, 不会反映在另一个进程的存储器中。 这就是为什么当父进程和子进程调用各自的printf语句时, 它们中的变量x会有不同的值的原因。 3.1问题同样是这个原因。
*共享文件。 当运行这个实例程序时, 我们注意到父进程和子进程都把它们的输出显示到了屏幕上。 原因就是子进程继承了父进程所有打开的文件。 当父进程调用fork函数时, stdout文件是被打开的, 并指向屏幕。 所以子进程的输出也指向了屏幕。
文章中的理论知识摘自《Computer Systems: A Programmer's Perspective second edition》
[Chapter 3 Process]Practice 3.1 相关知识:进程创建、fork函数的更多相关文章
- [Chapter 3 Process]Practice 3.2 Including the initial parent process, how many processes are created by the program shown in Figure?
3.2 Including the initial parent process, how many processes are created by the program shown in Fig ...
- [Chapter 3 Process]Practice 3.12 Including the initial parent process, how many processes are created by the program shown in Figure 3.32?
3.12 Including the initial parent process, how many processes are created by the program shown in Fi ...
- [Chapter 3 Process]Practice 3.5 When a process creates a new process using the fork() operation
3.5 When a process creates a new process using the fork() operation, which of the following state is ...
- [Chapter 3 Process]Practice 3.3 Discuss three major complications that concurrent processing adds to an operating system.
3.3 Original version of Apple's mobile iOS operating system provied no means of concurrent processi ...
- [Chapter 3 Process]Practice 3.9 Describe the actions token by a kernel to content-switch between processes.
3.9 Describe the actions token by a kernel to content-switch between processes. 答案: 内核在进行进程上下文切换时, 首 ...
- [Chapter 3 Process]Practice 3.8: Describe the differences among short-term, medium-term, long-term scheduling
3.8 Describe the differences among short-term, medium-term, and longterm scheduling. 答案: 长期调度决定哪些进程进 ...
- [Chapter 3 Process]Practice 3.4 Describe what happens when a context switch occurs if the new context is already loaded into one of the register sets.
3.4 The Sun UltraSPARC processor has multiple register sets. Describe what happens when a context sw ...
- python的面向对象-实例(对象)的相关知识、实例化
1.对象就是实例,什么是实例 类运行的过程就是实例化的过程,实例化产生的结果就是产生了一个实例 class的牛逼之处就是不用手动的return,他会加载完函数之后,自动return __init__ ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
随机推荐
- 论4.1loli模拟赛
论如何合理的挂.... T1: 后缀数组+找规律...没了,别的就没什么了.... T2: 树链剖分+lca....没了, 别的没什么了..... T3: 平衡树可过..然后数据有两组错的... 实际 ...
- UOJ67 新年的毒瘤
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 本地的html服务
本地的调试的时候, 我们服务器返回的cookie就会变的失效,因为你的本地服务器的域名不太对.
- SSIS之数据流任务
数据流任务主要用于运行数据流以提取.转换.加载源数据.一个包中可以有多个数据流任务,也可以包含零个数据流任务.下面关系图显示含有一个数据流任务的包: 了解数据流任务后,我们就简要的学习一下如何创建数据 ...
- 2016-02-20WebForm登陆验证,判断用户是否登陆 PageBase类
http://blog.csdn.net/fanbin168/article/details/49404233 很多时候,WebFrom页面,我们需要判断用户是否已经登陆了.假如有很多页面,难道我们要 ...
- ASP.NET Core 开源项目整理
前言: 对 .NET Core 的热情一直没有下降过,新起的项目几乎都是采用 Core 来做开发. 跨平台是一个方面,另外就是 Core 很轻,性能远超很多开发语言(不坑). 一.ASP.NET Co ...
- iOS 检查指定日期是否在当前日期之前
iOS检查指定日期是否在当前日期之前, 直接上代码: - (BOOL)checkProductDate: (NSString *)tempDate { NSDateFormatter *dateFor ...
- jquery获取上传进度和取消上传操作
var xhrOnProgress=function(fun) { xhrOnProgress.onprogress = fun; //绑定监听 //使用闭包实现监听绑 return function ...
- LeetCode OJ:Binary Tree Inorder Traversal(中序遍历二叉树)
Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...
- AngularJS-webapp
一.搭建开发环境 cnpm i -g bower 创建git仓库 cd webapp dir git init 创建.bowerrc类文件技巧 null>.bowerrc css预编译处理:le ...