视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
山大操作系统实验2
2025-09-25 17:57:28 责编:小OO
文档
操作系统实验报告

——线程和进/线程管道通信实验

张咪 软件四班

一、实验要求

设有二元函数f(x,y) = f(x) + f(y) 

其中:  f(x) = f(x-1) * x       (x >1) 

        f(x)=1               (x=1)  

        f(y) = f(y-1) + f(y-2)   (y> 2) 

        f(y)=1                 (y=1,2) 

请编程建立3个并发协作进程,它们分别完成f(x,y)、f(x)、f(y) 。

 

二、实验目的 

通过  Linux 系统中线程和管道通信机制的实验,加深对于线程控制和管道通信概念的理解,观察和体验并发进/线程间的通信和协作的效果  ,练习利用无名管道进行进/线程间通信的编程和调试技术。 

 

三、实验环境  

实验环境均为Linux操作系统,开发工具为gcc和g++。

四、实验思路 

要实现三个函数,要创建三个进程,两个子进程和一个父进程。一个子进程实现f(x),另一个实现f(y)。因为f(x,y)=f(x)+f(y),所以在父进程和子进程间建立通信,子进程将当前值传给父进程,父进程进行计算。而且由于父进程的f(x,y)中的x和f(x)中的x一一对应,所以这些进程应该同步的并发向前走,否则f(x,y)的值就是错的。

五、算法设计

1.创建进程,每个子进程的执行代码段实现对应函数功能。 

2.建立父进程和子进程间的通信。由于管道的读写默认的通信方式为同步读写方式,即如果管道读端无数据则读命令阻塞直到数据到达,反之如果管道写端有数据则写命令阻塞直到数据被读走。 所以同步并发的问题可以通过管道实现。建立两个管道,pipe1和pipe2,f(x)通过pipe1向父进程写入f(x)的值。同理f(y)通过pipe2向父进程写入f(y)的值。父进程根据这两个值实现函数f(x,y)功能。

六、实验过程:

新建一个文件夹,在该文件夹中建立以下名为ppipe.c的C语言程序。

编写代码 ,保存。

输入gcc ppipe.c命令, 生成默认的可执行文件a.out。

执行a.out:。

执行并调试ppipe程序。

七、调试及实验结果

第一次编译时有很多拼写错误,错把perror打成prerror,不确定do{}while()语句的后面需不需要加分号,还漏掉了大括号,太粗心。

一开始错把pipe[0]和pipe[1]理解为管道1和管道2,后来经过仔细阅读实验指导,知道pipe[0]和pipe[1]指的是管道两端。

pipe系统调用的语法为: #include int pipe(int pipe_id[2]); pipe建立一个无名管道,pipe_id[0]中和pipe_id[1]将放入管道两端的描述符 如果pipe执行成功返回0。. 出错返回-1.

 

八、源代码

#include

#include

#include

int main(int argc,char *argv[]){

 两个子进程的进程号

 int pipe1[2];//两个无名管道标号

 int pipe2[2];

 //如果创建管道失败,程序执行失败,退出

 if(pipe(pipe1)<0){

 创建不成功");

 创建不成功");

 //创建子进程1

 //如果子进程1创建失败,程序执行失败,退出

 创建不成功");

 //子进程1创建成功

 要在管道1 的1端进行写操作

 将管道1的0端和管道2关闭

 //fx的初始值

 

  //f(x)函数

 

  //将fx的值取出写入管道1的1端

 //一直计算到x=9

 //退出子进程1

 //父进程

 //创建子进程2

 //如果子进程2创建失败,退出

 

 //成功创建子进程2

 要在管道2 的1端进行写操作

 将管道1 和管道2 的0端关闭

 

 

 

  //初始值

 

 

 

  

  

  

  //f(y)函数

 

  //将fy的值取出放入管道2的1端

  //一直计算到y=9

 

  //退出子进程2

 //父进程

 父进程要完成对管道1的0端和管道2的0端的读操作

 关闭管道1和管道2的1端

 

 

 

 

   read(pipe2[0],&y,sizeof(int));

  printf("parent %d f(x,y):f(%d,%d)=%d\\n",getpid(),m++,n++,x+y);

 }while(m<=9&&n<=9);//一直计算到x=9,y=9

 //执行成功退出

}下载本文

显示全文
专题