[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官方文档认真学习下.官方给 ...
随机推荐
- linux 基本命令___0001
参考公众号:生信媛 参考链接:每天一个linux命令(61):wget命令 参考链接:<sort帮你排序>-linux命令五分钟系列之二十六 参考链接:每天一个linux命令(34):du ...
- 使用 grep 查找所有包含指定文本的文件
目标:本文提供一些关于如何搜索出指定目录或整个文件系统中那些包含指定单词或字符串的文件. 难度:容易 约定: # - 需要使用 root 权限来执行指定命令,可以直接使用 root 用户来执行也可以使 ...
- Kafka+SparkStreaming+Zookeeper(ZK存储Offset,解决checkpoint问题)
创建一个topic ./kafka-topics.sh --create --zookeeper 192.168.1.244:2181,192.168.1.245:2181,192.168.1.246 ...
- VK Cup 2017 - Qualification 1 C 贪心
是一道很有趣的题目 给出地图和起始点 与要求的步数k 要求走k步 正好回到起始点 输出字典序最小的移动路径 DLRU这样 可以想到DU LR都是相同数量的 于是k必须是一个偶数 然后走了弯路QAQ 从 ...
- 由于ptrace.h文件导致的内核编译出错的解决方法
arch/x86/kernel/ptrace.c:1472:17: error: conflicting types for 'syscall_trace_enter' In file includ ...
- PowerDesigner生成数据库表和逆向生成表结构(MySQL数据库)
一.Download Connector/ODBC下载ODBC驱动,地址:https://dev.mysql.com/downloads/connector/odbc/, 需要注意:PowerDesi ...
- JQuery小知识点
//get() : 就是把JQ转成原生JS,可以让通过jquery获得元素使用JS的innerHTML方法. $(function(){ //document.getElementById('div1 ...
- [thinkphp使用phpspreadsheet时出现]Cannot redeclare xxxxxx() (previously declared in C:\WWW\xxx.xxx:xxx)
[thinkphp使用phpspreadsheet时出现]Cannot redeclare xxxxxx() (previously declared in C:\WWW\xxx.xxx:xxx) 一 ...
- 设计高效sql一般经验谈
1不用在sql语句使用系统默认的保留关键字 2尽量用exists 和 not exists 代替 in 和 not in 这条在sql2005之后,在索引一样,统计信息一样的情况下,exists ...
- 小谈CSS定位
定义和用法 position 属性规定元素的定位类型. 说明 这个属性定义建立元素布局所用的定位机制.任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不论该元素本身是什么类型.相对定位元素会 ...