收藏 分享(赏)

实验三、进程通信(一) ——管道及共享内存.doc

上传人:cjc2202537 文档编号:4572980 上传时间:2019-01-02 格式:DOC 页数:13 大小:342.50KB
下载 相关 举报
实验三、进程通信(一)          ——管道及共享内存.doc_第1页
第1页 / 共13页
实验三、进程通信(一)          ——管道及共享内存.doc_第2页
第2页 / 共13页
实验三、进程通信(一)          ——管道及共享内存.doc_第3页
第3页 / 共13页
实验三、进程通信(一)          ——管道及共享内存.doc_第4页
第4页 / 共13页
实验三、进程通信(一)          ——管道及共享内存.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、操作系统实验报告实验三、进程通信(一)管道及共享内存一、 实验目的1) 加深对管道通信的了解2) 掌握利用管道进行通信的程序设计3) 了解共享内存通信的程序设计方法4) 了解和熟悉 Linux 支持的共享存储区机制二、 实验内容任务一、(1)阅读以上父子进程利用管道进行通信的例子(例 1) ,写出程序的运行结果并分析。(2)编写程序:父进程利用管道将一字符串交给子进程处理。子进程读字符串,将里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串。任务二、(1)阅读例 2 的程序,运行一次该程序,然后用 ipcs 命令查看系统中共享存储区的情况,再次执行该程序,再用 ipcs 命令查看系

2、统中共享内存的情况,对两次的结果进行比较,并分析原因。最后用 ipcrm 命令删除自己建立的共享存储区。 (有关 ipcs 和 ipcrm 介绍见后面一页)(2)每个同学登陆两个窗口,先在一个窗口中运行例 3 程序 1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序 1) ,然后在另一个窗口中运行例 3程序 2,观察程序的运行结果并分析。运行结束后可以用 ctrl+c 结束程序 1 的运行。(3)编写程序:使用系统调用 shmget(),shmat(),shmdt() ,shmctl(),编制程序。要求在父进程中生成一个 30 字节长的私有共享内存段。接下来,设置一个指向共享内存段的字符指

3、针,将一串大写字母写入到该指针指向的存贮区。调用 fork()生成子进程,让子进程显示共享内存段中的内容。接着,将大写字母改成小写,子进程修改共享内存中的内容。之后,子进程将脱接共享内存段并退出。父进程在睡眠 5 秒后,在此显示共享内存段中的内容(此时已经是小写字母) 。三、 代码及运行结果分析(1) 阅读以上父子进程利用管道进行通信的例子(例 1) ,写出程序的运行结果并分析实验代码:#includemain() int x,fd2;char buf30,s30;pipe(fd);while (x=fork()=-1);if (x=0)close(fd0);printf(“Child Pro

4、cess!n“);strcpy(buf,“This is an examplen“);write(fd1,buf,30);exit(0);elseclose(fd1);printf(“Parent Process!n“);read(fd0,s,30);printf(“%sn“,s);运行结果:分析:调用 pipe(fd);创建一个管道后,接着调用 fork()函数产生两个进程,首先开始执行子进程,关闭管道出口,通过管道入口向管道中写入内容。执行 if 语句后,进入 else 语句块内开始父进程,管道入口关闭,通过管道出口端从管道中读取之前写入内容,最后输出出来(2) 编写程序:父进程利用管道将

5、一字符串交给子进程处理。子进程读字符串,将里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串。实验代码:#includemain() int x,count,left,right,temp,fd2,fe2;char c,buf30,s30;pipe(fd);pipe(fe);printf(“please input a line of char“);scanf(“%s“,buf);while(x=fork()=-1);if(x=0)close(fd0);close(fe1);printf(“Child Process!n“);write(fd1,buf,30);read(fe0,b

6、uf,30);printf(“%sn“,buf);exit(0);elseclose(fd1);close(fe0);count=0;doread(fd0,scount+=c;while(c!=0);printf(“Parent Process!n“);printf(“%sn“,s);count-=2;for(left=0,right=count;left#include #include main()key_t key=208; /*在实际实验过程中,为了避免每个同学建立的共享存储区关键字一样而相互干扰,关键字请用学号末 3 位*/int shmid_1,shmid_2;if (shmid_

7、1=shmget(key,1000,0644|IPC_CREAT)=-1)perror(“shmget shmid_1“);exit(1);printf(“First shared memory identifier is %dn“,shmid_1);if (shmid_2=shmget(IPC_PRIVATE,20,0644)=-1)perror(“shmget shmid_2“);exit(2);printf(“Second shared memory identifier is %dn“,shmid_2);exit(0);运行结果:Ipcs 查看:再次运行:再次用 ipcs 查看:Ipc

8、rm 删除分析:成功,返回共享内存段的标识符,内核中用于唯一的标识一个对象。对存在于内核存贮空间中的每个共享内存段,内核均为其维护着一个数据结构shmid_ds。失败,返回1,设置 errno。第一个参数 key(键值)用来创建 IPC 标识符,shmget()返回的标识符与key 值一一对应,不同的 key 值返回不同的标识符。第二个参数 size,决定了共享内存段的大小(若访问已存在的内存段,该参数可设为 0) 。有最大字节数的限制第三个参数 shmflag,用于设置访问权限及标识创建条件。对两次的结果进行比较:两次运行结束后的 第二个共享标识符是不一样的。在用 ipcs 查看时,共享内存

9、段中的关键字,共享内存标识符,访问权限,字节等都是不一样的。(4)每个同学登陆两个窗口,先在一个窗口中运行例 3 程序 1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序 1) ,然后在另一个窗口中运行例 3 程序 2,观察程序的运行结果并分析。运行结束后可以用 ctrl+c 结束程序 1 的运行。实验代码:#include #include #include #define SHMKEY 208 /*在实际实验过程中,为了避免每个同学建立的共享存储区关键字一样而相互干扰,关键字请用学号末 3 位*/#define K 1024int shmid;main ()int i,*pint;ch

10、ar *addr;extern char * shmat ();extern cleanup ();for(i=0;i#include #include #define SHMKEY 208 /*在实际实验过程中,为了避免每个同学建立的共享存储区关键字一样而相互干扰,关键字请用学号末 3 位*/#define K 1024int shmid;main ()int i,*pint;char *addr;extern char * shmat ();shmid=shmget(SHMKEY,8*K,0777);/*取共享区 SHMKEY 的 id */addr=shmat(shmid,0,0);/*

11、连接共享区 */pint=(int *)addr;for (i=0;i#include #include #define SHMKEY 208 /*在实际实验过程中,为了避免每个同学建立的共享存储区关键字一样而相互干扰,关键字请用学号末 3 位*/#define K 1024int shmid;main()int i;char *pint;char *addr;extern char * shmat ();extern cleanup ();for(i=0;i#include #include #define SHMKEY 208 /*在实际实验过程中,为了避免每个同学建立的共享存储区关键字一

12、样而相互干扰,关键字请用学号末 3 位*/#define K 1024int shmid;main ()int i;char *pint;char *addr;extern char * shmat ();shmid=shmget(SHMKEY,8*K,0777);/*取共享区 SHMKEY 的 id */addr=shmat(shmid,0,0);/*连接共享区 */pint=(char *)addr;for (i=0;i5;i+)printf(“%cn“,-32+*pint+);/*打印共享区中的内容 */结果无法正确运行四、 实验心得通过本次实验了解了管道进程间通信形式, ,管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统 。数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。基本达到了本次实验的要求。另外,对于共享内存也有一定的了解,学会通过创建多个管道实现父子进程间的通信,对于共享内存通信的工作机制也有了一定的了解,总之,本次实验自己收获了很多。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 中学实验

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报