- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)