城院操作系统-实验报告-实验八.doc
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)

浙江大学城市学院实验报告 课程名称 操作系统原理实验 实验项目名称 实验八 进程通信——管道 学生姓名 专业班级 学号 实验成绩 指导老师(签名 ) 日期 注意: 务请保存好各自的源代码,已备后用。 请上传到BB平台。 一. 实验目的和要求 1. 了解Linux系统的进程间通信机构(IPC); 2. 理解Linux关于管道的概念; 3. 掌握Linux支持管道的系统调用和管道的使用; 4. 巩固进程同步概念。 二、实验内容 用系统调用pipe( )创建管道,实现父子进程间的通信。 三、实验步骤 1、并发进程的无管道通信 1) 编译运行给出的pipe1.c,观察运行结果。 执行前: 执行: 执行后: 2) 思考:观察程序运行结果,比较新旧文件的内容是否有差异,并分析原因。 有。程序将f1中的内容按字符逐个读出,并逐个写入到了f2中。 2、多进程的管道通信,编译并运行给出的代码pipe3.c,观察并理解多进程通过管道通 信。 3、编写程序:(来自第三章习题)假定系统有三个并发进程read,move和print共享缓 冲器B1和B2。进程read负责从输入设备上读信息,每读出一个记录后把它存放到缓冲器 B1中。进程move从缓冲器B1中取出一个记录,加工后存入缓冲器B2。进程print将B2中的 记录取出打印输出。缓冲器B1和B2每次只能存放一个记录。要求三个进程协调完成任务 ,使打印出来的与读入的记录的个数,次序完全一样。试创建三个进程,用pipe( )打开两个管道,如图 22所示,实现三个进程之间的同步。 程序源码: #include <unistd.h> #include <signal.h> #include <stdio.h> #include <semaphore.h> #include <fcntl.h> int pid1,pid2; /*sem_t *S1; sem_t *S2; sem_t *S3; sem_t *S4;*/ //sem_t S1; //sem_t S2; //sem_t S3; //sem_t S4; int valp; main( ) { /* S1=sem_open("A",O_CREAT,0644,1); S2=sem_open("B",O_CREAT,0644,0); S3=sem_open("C",O_CREAT,0644,0); S4=sem_open("D",O_CREAT,0644,1);*/ // sem_init(&S1,0,1); // sem_init(&S2,0,0); // sem_init(&S3,0,0); // sem_init(&S4,0,1); int fd1[2]; int fd2[2]; char pipe1[100],pipe2[100],pipe3[100]; pipe(fd1); /*创建一个管道*/ pipe(fd2); while ((pid1=fork( )) == -1); if(pid1 == 0) { while ((pid2=fork( )) == -1); if(pid2==0) { while(1) { // S1=sem_open("A",O_EXCL); // sem_wait(S1); lockf(fd1[1],1,0); /*把输出串放入数组outpipe中*/ printf("process1 is sending message to pipe1\n"); sprintf(pipe1,"%d",rand()); write(fd1[1],pipe1,50); /*向管道写长为50字节的串*/ lockf(fd1[1],0,0); // printf("1111111111\n"); // S2=sem_open("B",O_EXCL); // sem_post(S2); // printf("22222222222\n"); } } else { while(1) { //sem_open(const char *name,int oflag,mode_t mode,unsigned int value); // printf("33333333333\n"); // S2=sem_open("B",O_EXCL); // sem_wait(S2); // printf("44444444444\n"); // S4=sem_open("D",O_EXCL); // sem_wait(S4); printf("process2 is reading message from pipe1\n"); read(fd1[0],pipe2,50); printf("process2 had received the messag 【操作系统原理实验——进程通信——管道】 实验报告的标题揭示了本次实验的核心——在操作系统环境中,特别是Linux系统中,理解并应用进程间的通信机制,尤其是管道(Pipe)的使用。实验旨在让学生掌握进程间通信(IPC)的基础知识,具体包括以下几个方面: 1. **Linux进程间通信(IPC)**:在操作系统中,进程间通信是实现多个进程协同工作的重要手段,Linux提供了多种IPC方式,如管道、信号量、消息队列、共享内存等。本实验主要关注管道通信。 2. **管道概念**:管道是一种半双工的数据通信方式,数据只能单向流动,且具有先进先出(FIFO)的特点。管道通常用于父子进程或兄弟进程之间,允许数据的实时传递。 3. **管道系统调用**:在Linux中,`pipe()`函数用于创建一个管道,它返回两个文件描述符,一个用于写入数据,另一个用于读取数据。通过这两个描述符,进程可以将数据写入管道,另一进程可以从管道读取数据。 4. **进程同步**:实验中的管道通信涉及到进程同步的概念,确保数据在正确的时间被正确的进程访问。在多进程环境下,如果没有适当的同步机制,可能会出现数据竞争等问题。 实验内容分为三个部分: 1. **无管道并发进程通信**:展示没有使用管道时,进程间通信的情况,强调管道的重要性。 2. **管道通信**:通过`pipe3.c`的代码,演示了如何使用`pipe()`创建管道,并实现父子进程间的通信。学生需要观察并理解这个过程。 3. **多进程管道通信与同步**:基于一个实际问题设计了一个涉及三个并发进程(read, move, print)的场景,这三个进程需要通过管道和同步机制协作完成任务。这里用到了两个管道,以及信号量或`lockf()`函数来控制进程间的访问顺序,确保数据的正确传递和处理。 实验代码中,可以看到进程的创建使用`fork()`,并通过`pipe()`创建了两个管道`fd1`和`fd2`。进程1(parent of process2)将随机数写入`fd1`,进程2(child of process1)从`fd1`读取并打印,而进程3(兄弟进程)原本应该是从`fd2`读取数据,但由于代码未完全显示,这部分无法详细分析。 总结来说,这个实验旨在通过实践让学生深入理解Linux系统中的进程通信机制,特别是管道的创建和使用,以及如何在多进程环境中使用同步技术保证数据的一致性和正确性。通过这样的实验,学生不仅可以掌握理论知识,还能提高编程和问题解决的能力。


























- 再见....2024-01-05资源内容详细,总结地很全面,与描述的内容一致,对我启发很大,学习了。

- 粉丝: 205
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 软件工程项目售后维护方案.docx
- P2P电子商务背景下的动态安全信任管理机制.doc
- 单片机甲醛检测仪设计方案.doc
- 破坏计算机信息系统罪中严重后果如何把握.docx
- 计算机网络安全技术在企业网的应用与研究.docx
- 计算机网络安全的实际状况及其应对策略探讨.docx
- 光电传感器转速测量系统设计方案单片机光电转速传感器转速测量数据处理.doc
- 互联网金融对大学生支付方式和理财行为的影响.docx
- 互联网+时代下的中职学校主题班会.docx
- itat-全国信息技术应用大赛第二届java历年真题.doc
- 互联网金融相关法律法规存在问题及完善方案.docx
- 大型Android项目基础架构,AndroidX、Jetpack、Koin、模块化、模块代码权限控制、单Activity多fragment
- 中国-最好的人工智能生长土壤.docx
- 如何加强石油工程项目管理质量.docx
- 2011年全国计算机等级历年考试四级网络工程师历年考试复习题全省纸打印版免费.doc
- 刍议网络环境下图书采编工作的转变.docx


