修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……',父进程显示 'parent ……',观察结果,分析原因

时间: 2024-02-05 16:03:39 浏览: 31
代码如下: ```python import os def child(): for i in range(5): print("daughter", os.getpid()) for i in range(5): print("son", os.getpid()) def parent(): for i in range(5): print("parent", os.getpid()) pid = os.fork() if pid == 0: child() else: parent() ``` 运行结果如下: ``` parent 2542 parent 2542 parent 2542 parent 2542 parent 2542 daughter 2543 daughter 2543 daughter 2543 daughter 2543 daughter 2543 son 2543 son 2543 son 2543 son 2543 son 2543 ``` 可以看到,每个进程都循环显示了自己的语句。原因是,当调用 `os.fork()` 时,操作系统会复制当前进程的所有信息,包括代码、数据、堆栈等,生成一个新的进程。然后分别在父进程和子进程中运行不同的代码。因此,在子进程中调用 `child()` 函数,在父进程中调用 `parent()` 函数,它们分别独立运行,不会互相干扰。
相关问题

修改上述程序,每一个进程循环显示一句话。子进程显示'daughter  …'及'son  ……',父进程显示 'parent  ……

```python import os def child_process(): for i in range(5): print("daughter ...") os.system("sleep 1") def parent_process(): for i in range(5): print("parent ...") os.system("sleep 1") if __name__ == '__main__': pid = os.fork() if pid == 0: child_process() else: pid = os.fork() if pid == 0: child_process() else: parent_process() ``` 修改后的代码中,每个进程都会循环5次,每次循环都会输出一句话,分别是父进程的'parent ...'和子进程的'daughter ...'或'son ...'。为了让输出不会混乱,每个进程的循环间隔了1秒钟,使用了`os.system("sleep 1")`命令来实现。同时,为了让父进程能够创建两个子进程,我们在第一个子进程的代码块中再次调用`os.fork()`来创建第二个子进程。

编写一段程序,使用系统调用 fork( )创建两个子进程。 ⚫ 当此程序运行时,在系统中有一个父进程和两个子进程活动。 ⚫ 让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b' 和字符'c'。 ⚫ 试观察记录屏幕上的显示结果,并分析原因。 (2) 修改上述程序,每一个进程循环显示一句话。 ⚫ 子进程显示'daughter ...'及'son ......',父进程显示 'parent ......'。 ⚫ 观察结果,分析原因。

以下是第一问的程序: ```c #include <stdio.h> #include <unistd.h> int main() { pid_t pid1, pid2; pid1 = fork(); if (pid1 < 0) { printf("Error: fork failed.\n"); return 1; } else if (pid1 == 0) { printf("Child process 1 (PID %d) is running, and it will display 'b'.\n", getpid()); printf("b\n"); } else { pid2 = fork(); if (pid2 < 0) { printf("Error: fork failed.\n"); return 1; } else if (pid2 == 0) { printf("Child process 2 (PID %d) is running, and it will display 'c'.\n", getpid()); printf("c\n"); } else { printf("Parent process (PID %d) is running, and it will display 'a'.\n", getpid()); printf("a\n"); } } return 0; } ``` 输出结果可能是: ``` Parent process (PID 12345) is running, and it will display 'a'. a Child process 2 (PID 12347) is running, and it will display 'c'. c Child process 1 (PID 12346) is running, and it will display 'b'. b ``` 这是因为当调用 `fork()` 时,操作系统会复制一份父进程的代码、数据和堆栈等信息,生成一个全新的子进程。子进程与父进程几乎完全相同,但有一些区别。在子进程中,`fork()` 的返回值是0,而在父进程中,`fork()` 的返回值是新创建子进程的进程ID。因此,我们可以通过检查 `fork()` 的返回值来分辨当前进程是父进程还是子进程。 以下是第二问的程序: ```c #include <stdio.h> #include <unistd.h> int main() { pid_t pid1, pid2; pid1 = fork(); if (pid1 < 0) { printf("Error: fork failed.\n"); return 1; } else if (pid1 == 0) { while (1) { printf("Daughter process (PID %d) is running.\n", getpid()); printf("daughter ...\n"); sleep(1); printf("daughter ...\n"); sleep(1); printf("daughter ...\n"); sleep(1); } } else { pid2 = fork(); if (pid2 < 0) { printf("Error: fork failed.\n"); return 1; } else if (pid2 == 0) { while (1) { printf("Son process (PID %d) is running.\n", getpid()); printf("son ...\n"); sleep(1); printf("son ...\n"); sleep(1); printf("son ...\n"); sleep(1); } } else { while (1) { printf("Parent process (PID %d) is running.\n", getpid()); printf("parent ...\n"); sleep(1); } } } return 0; } ``` 输出结果可能是: ``` Parent process (PID 12345) is running. parent ... Daughter process (PID 12346) is running. daughter ... daughter ... daughter ... Son process (PID 12347) is running. son ... son ... son ... parent ... son ... daughter ... daughter ... daughter ... parent ... son ... daughter ... daughter ... daughter ... parent ... son ... daughter ... daughter ... daughter ... parent ... son ... ... ``` 这是因为在操作系统中,每个进程都有自己的输出缓冲区。当我们调用 `printf()` 函数时,输出的内容首先被写入到缓冲区中,而不是立即显示在屏幕上。当缓冲区被填满或者我们显式地调用 `fflush(stdout)` 函数时,缓冲区中的内容才会被刷新并显示在屏幕上。 在本例中,由于父进程和两个子进程都在不停地输出内容,它们的输出结果可能会交错在一起,产生混乱的效果。为了避免这种情况,我们可以使用 `fflush(stdout)` 函数强制刷新输出缓冲区,或者使用系统调用 `write()` 直接向标准输出文件描述符写入内容,这样可以避免输出缓冲区的影响。

相关推荐

最新推荐

recommend-type

操作系统实验 进程的创建

在第二步中,我们修改了程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……',父进程显示 'parent ……'。通过观察结果,我们可以看到进程的并发执行的结果,并分析原因。 在第三步中,我们使用...
recommend-type

C++实现的俄罗斯方块游戏

一个简单的俄罗斯方块游戏的C++实现,涉及基本的游戏逻辑和控制。这个示例包括了初始化、显示、移动、旋转和消除方块等基本功能。 主要文件 main.cpp:包含主函数和游戏循环。 tetris.h:包含游戏逻辑的头文件。 tetris.cpp:包含游戏逻辑的实现文件。 运行说明 确保安装SFML库,以便进行窗口绘制和用户输入处理。
recommend-type

06二十四节气之谷雨模板.pptx

06二十四节气之谷雨模板.pptx
recommend-type

基于Web开发的聊天系统(模拟QQ的基本功能)源码+项目说明.zip

基于Web开发的聊天系统(模拟QQ的基本功能)源码+项目说明.zip 本项目是一个仿QQ基本功能的前后端分离项目。前端采用了vue.js技术栈,后端采用springboot+netty混合开发。实现了好友申请、好友分组、好友聊天、群管理、群公告、用户群聊等功能。 后端技术栈 1. Spring Boot 2. netty nio 3. WebSocket 4. MyBatis 5. Spring Data JPA 6. Redis 7. MySQL 8. Spring Session 9. Alibaba Druid 10. Gradle #### 前端技术栈 1. Vue 3. axios 4. vue-router 5. Vuex 6. WebSocket 7. vue-cli4 8. JavaScript ES6 9. npm 【说明】 【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领
recommend-type

wx302旅游社交小程序-ssm+vue+uniapp.zip(可运行源码+sql文件+文档)

旅游社交小程序功能有管理员和用户。管理员有个人中心,用户管理,每日签到管理,景点推荐管理,景点分类管理,防疫查询管理,美食推荐管理,酒店推荐管理,周边推荐管理,分享圈管理,我的收藏管理,系统管理。用户可以在微信小程序上注册登录,进行每日签到,防疫查询,可以在分享圈里面进行分享自己想要分享的内容,查看和收藏景点以及美食的推荐等操作。因而具有一定的实用性。 本站后台采用Java的SSM框架进行后台管理开发,可以在浏览器上登录进行后台数据方面的管理,MySQL作为本地数据库,微信小程序用到了微信开发者工具,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得旅游社交小程序管理工作系统化、规范化。 管理员可以管理用户信息,可以对用户信息添加修改删除。管理员可以对景点推荐信息进行添加修改删除操作。管理员可以对分享圈信息进行添加,修改,删除操作。管理员可以对美食推荐信息进行添加,修改,删除操作。管理员可以对酒店推荐信息进行添加,修改,删除操作。管理员可以对周边推荐信息进行添加,修改,删除操作。 小程序用户是需要注册才可以进行登录的,登录后在首页可以查看相关信息,并且下面导航可以点击到其他功能模块。在小程序里点击我的,会出现关于我的界面,在这里可以修改个人信息,以及可以点击其他功能模块。用户想要把一些信息分享到分享圈的时候,可以点击新增,然后输入自己想要分享的信息就可以进行分享圈的操作。用户可以在景点推荐里面进行收藏和评论等操作。用户可以在美食推荐模块搜索和查看美食推荐的相关信息。
recommend-type

数据结构课程设计:模块化比较多种排序算法

本篇文档是关于数据结构课程设计中的一个项目,名为“排序算法比较”。学生针对专业班级的课程作业,选择对不同排序算法进行比较和实现。以下是主要内容的详细解析: 1. **设计题目**:该课程设计的核心任务是研究和实现几种常见的排序算法,如直接插入排序和冒泡排序,并通过模块化编程的方法来组织代码,提高代码的可读性和复用性。 2. **运行环境**:学生在Windows操作系统下,利用Microsoft Visual C++ 6.0开发环境进行编程。这表明他们将利用C语言进行算法设计,并且这个环境支持高效的性能测试和调试。 3. **算法设计思想**:采用模块化编程策略,将排序算法拆分为独立的子程序,比如`direct`和`bubble_sort`,分别处理直接插入排序和冒泡排序。每个子程序根据特定的数据结构和算法逻辑进行实现。整体上,算法设计强调的是功能的分块和预想功能的顺序组合。 4. **流程图**:文档包含流程图,可能展示了程序设计的步骤、数据流以及各部分之间的交互,有助于理解算法执行的逻辑路径。 5. **算法设计分析**:模块化设计使得程序结构清晰,每个子程序仅在被调用时运行,节省了系统资源,提高了效率。此外,这种设计方法增强了程序的扩展性,方便后续的修改和维护。 6. **源代码示例**:提供了两个排序函数的代码片段,一个是`direct`函数实现直接插入排序,另一个是`bubble_sort`函数实现冒泡排序。这些函数的实现展示了如何根据算法原理操作数组元素,如交换元素位置或寻找合适的位置插入。 总结来说,这个课程设计要求学生实际应用数据结构知识,掌握并实现两种基础排序算法,同时通过模块化编程的方式展示算法的实现过程,提升他们的编程技巧和算法理解能力。通过这种方式,学生可以深入理解排序算法的工作原理,同时学会如何优化程序结构,提高程序的性能和可维护性。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

STM32单片机小车智能巡逻车设计与实现:打造智能巡逻车,开启小车新时代

![stm32单片机小车](https://img-blog.csdnimg.cn/direct/c16e9788716a4704af8ec37f1276c4dc.png) # 1. STM32单片机简介及基础** STM32单片机是意法半导体公司推出的基于ARM Cortex-M内核的高性能微控制器系列。它具有低功耗、高性能、丰富的外设资源等特点,广泛应用于工业控制、物联网、汽车电子等领域。 STM32单片机的基础架构包括CPU内核、存储器、外设接口和时钟系统。其中,CPU内核负责执行指令,存储器用于存储程序和数据,外设接口提供与外部设备的连接,时钟系统为单片机提供稳定的时钟信号。 S
recommend-type

devc++如何监视

Dev-C++ 是一个基于 Mingw-w64 的免费 C++ 编程环境,主要用于 Windows 平台。如果你想监视程序的运行情况,比如查看内存使用、CPU 使用率、日志输出等,Dev-C++ 本身并不直接提供监视工具,但它可以在编写代码时结合第三方工具来实现。 1. **Task Manager**:Windows 自带的任务管理器可以用来实时监控进程资源使用,包括 CPU 占用、内存使用等。只需打开任务管理器(Ctrl+Shift+Esc 或右键点击任务栏),然后找到你的程序即可。 2. **Visual Studio** 或 **Code::Blocks**:如果你习惯使用更专业的
recommend-type

哈夫曼树实现文件压缩解压程序分析

"该文档是关于数据结构课程设计的一个项目分析,主要关注使用哈夫曼树实现文件的压缩和解压缩。项目旨在开发一个实用的压缩程序系统,包含两个可执行文件,分别适用于DOS和Windows操作系统。设计目标中强调了软件的性能特点,如高效压缩、二级缓冲技术、大文件支持以及友好的用户界面。此外,文档还概述了程序的主要函数及其功能,包括哈夫曼编码、索引编码和解码等关键操作。" 在数据结构课程设计中,哈夫曼树是一种重要的数据结构,常用于数据压缩。哈夫曼树,也称为最优二叉树,是一种带权重的二叉树,它的构造原则是:树中任一非叶节点的权值等于其左子树和右子树的权值之和,且所有叶节点都在同一层上。在这个文件压缩程序中,哈夫曼树被用来生成针对文件中字符的最优编码,以达到高效的压缩效果。 1. 压缩过程: - 首先,程序统计文件中每个字符出现的频率,构建哈夫曼树。频率高的字符对应较短的编码,反之则对应较长的编码。这样可以使得频繁出现的字符用较少的位来表示,从而降低存储空间。 - 接着,使用哈夫曼编码将原始文件中的字符转换为对应的编码序列,完成压缩。 2. 解压缩过程: - 在解压缩时,程序需要重建哈夫曼树,并根据编码序列还原出原来的字符序列。这涉及到索引编码和解码,通过递归函数如`indexSearch`和`makeIndex`实现。 - 为了提高效率,程序采用了二级缓冲技术,它能减少磁盘I/O次数,提高读写速度。 3. 软件架构: - 项目包含了两个可执行文件,`DosHfm.exe`适用于DOS系统,体积小巧,运行速度快;而`WinHfm.exe`则为Windows环境设计,提供了更友好的图形界面。 - 程序支持最大4GB的文件压缩,这是Fat32文件系统的限制。 4. 性能特点: - 除了基本的压缩和解压缩功能外,软件还提供了一些额外的特性,如显示压缩进度、文件一致性检查等。 - 哈夫曼编码的使用提高了压缩率,而二级缓冲技术使压缩速度提升了75%以上。 这个项目不仅展示了数据结构在实际问题中的应用,还体现了软件工程的实践,包括需求分析、概要设计以及关键算法的实现。通过这样的课程设计,学生可以深入理解数据结构和算法的重要性,并掌握实际编程技能。