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

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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统实验报告 实验三、进程通信(一) 管道及共享内存 一、 实验目的 加深对管道通信的了解 掌握利用管道进行通信的程序设计 了解共享内存通信的程序设计方法 了解和熟悉 Linux 支持的共享存储区机制 二、 实验内容 任务一、 ( 1)阅读以上父子进程利用管道进行通信的例子(例 1),写出程序的运行结果 并分析。 (2)编写程序: 父进程利用管道将一字符串交给子进程处理。 子进程读字符串, 将里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串。 任务二、 (1)阅读例 2 的程序,运行一次该程序,然后用 ipcs 命令查看系统中共享存储 区的情况,再次执行该程序,再用 ipcs 命令查看系统中共享内存的情况,对两 次的结果进行比较, 并分析原因。最后用 ipcrm 命令删除自己建立的共享存储区。 (有关 ipcs 和 ipcrm 介绍见后面一页) ( 2)每个同学登陆两个窗口,先在一个窗口中运行例 3 程序 1(或者只登陆一 个窗口,先在该窗口中以后台方式运行程序 1),然后在另一个窗口中运行例 3 程序 2,观察程序的运行结果并分析。运行结束后可以用 ctrl+c 结束程序 1 的运 行。 (3)编写程序:使用系统调用shmget(), shmat(), shmdt(), shmctl(),编制程序。 要求在父进程中生成一个 30 字节长的私有共享内存段。接下来,设置一个指向 共享内存段的字符指针, 将一串大写字母写入到该指针指向的存贮区。 调用 fork() 生成子进程,让子进程显示共享内存段中的内容。接着,将大写字母改成小写, 子进程修改共享内存中的内容。 之后, 子进程将脱接共享内存段并退出。 父进程 在睡眠 5 秒后,在此显示共享内存段中的内容(此时已经是小写字母) 。 三、 代码及运行结果分析 ( 1) 阅读以上父子进程利用管道进行通信的例子 (例 1),写出程序的运行结果并分 析 实验代码: #includestdio.h main() { int x,fd[2]; char buf[30],s[30]; pipe(fd); while ((x=fork())==_1); if (x==0) { close(fd[0]); prin tf(Child Process!\n); strcpy(buf,This is an example n); write(fd[1],buf,30); exit(0); } else{ close(fd[1]); printf(Parent Process!n); read(fd[0],s,30); prin tf(%s\n,s); } } 运行结果: 分析: 调用pipe(fd);创建一个管道后,接着调用fork()函数产生两个进程,首先开始执 行子进程,关闭管道出口,通过管道入口向管道中写入内容。执行 if语句后, 进入else语句块内开始父进程,管道入口关闭,通过管道出口端从管道中读取之 前写入内容,最后输出出来 (2) 编写程序:父进程利用管道将一字符串交给子进程处理。子进程读字符串,将 里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串。 实验代码: #in cludestdio.h main () { int x,cou nt,left,right,temp,fd[2],fe[2]; char c,buf[30],s[30]; pipe(fd); pipe(fe); prin tf(please in put a line of char); scan f(%s,buf); while((x=fork())==_1); if(x==O) { close(fd[0]); close(fe[1]); prin tf(Child Process!\n); write(fd[1],buf,30); read(fe[0],buf,30); prin tf(%s\n,buf); exit(0); } else{ close(fd[1]); close(fe[0]); coun t=0; do {read(fd[0], c,1); s[co un t++]=c; }while(c!=\0); printf(Parent Process!\n); prin tf(%s\n,s); coun t-=2; for(left=0,right=co un t;left=co un t/2;left++,right--){ temp=s[left]; s[left]=s[right]; s[right]=temp; } write(fe[1],s,30); wait(0); } 运行结果: r丄(Net/J 40L, 70GC urltton loca 1 host

文档评论(0)

yilinshanzhuang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档