操作系统实验4-4实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告
实验4-4: Linux共享存储通信
1.实验目的
(1) 掌握Linux提供的共享存储区通信方式的使用方法。
(2) 了解共享存储区通信方法的特点。
(3) 了解实现进程间通信的不同方法之间的区别、特点和适用情况。
2.实验内容
(1)编写发送信息程序shmsnd.c和接受信息程序shmrcv.c,其功能分别为:
//shmsnd.c//
①创建一个共享存储区间;
②将它附接到自己的地址空间;
③循环写入若干信息,以“end”结束(提示:信息以追加方式存放到共享区中,可
以用strcat()函数实现追加);
④断开共享区;
⑤结束。
//shmrcv.c//
①创建/获取同一个共享存储区;
②将它附接到自己的地址空间;
③输入其中已经由发送地方输入的内容;
④断开共享区
⑤删除共享区
⑥结束。
采用先执行发送进程、后执行接受进程来实现同步。
(2) 父进程创建一个共享存储区,然后创建子进程;采用终端实现父进程发送信息和
子进程接受信息的同步;信息以“end”作为结束标志。
3.实验思考
(1)共享存储区间通信有哪些优点?使用上有哪些限制?适用于哪种场合?
答:优点:这种通讯方式允许多个进程共享同一块物理内存空间来实现进程之间的信息交换,取消了中间环节是同一个计算机系统中多个进程间实现通讯的最快捷的
方法。
限制:共享内存必须共处同一个计算机系统,有物理内存可以共享才行。
适用:同一台电脑。
(2)总结共享存储区通信与消息缓冲通信、管理通信方式各有哪些特点?
答:共享存储区通信:快捷、信息量大,但是不带同步工具,同步和互斥问题需要各进程利用其他同步工具解决,而且要求这些进程都在同一存储介质上运行,不方便网络通信。
消息缓冲通信:可以在任意进程之间通信,并且自带同步工具,使用方便,但是信息复制消耗CPU的时间,不适宜信息量大或操作频繁的场合。
管理通信:方便简单,但工作在单项通信方式,且只能在创建它的进程及其子孙进程之间共享。
4.实验代码
4-4-1:
①
#include
#include
#include
#include
#include
#include
#include
main()
{
int shmid,running=1;
char *viraddr;
char buffer[BUFSIZ];
shmid=shmget(1234,BUFSIZ,0666|IPC_CREAT);
viraddr=shmat(shmid,0,0);
while(running)
{
puts("Enter some text:");
fgets(buffer,BUFSIZ,stdin);
strcat(viraddr,buffer);
if(strncmp(buffer,"end",3)==0)
running=0;
}
shmdt(viraddr);
exit(0);
}
②
#include
#include
#include
#include
#include
#include
#include
main()
{
int shmid;
char *viraddr;
shmid=shmget(1234,BUFSIZ,0666|IPC_CREAT);
viraddr=shmat(shmid,0,0);
printf("Your message is:\n%s",viraddr);
shmdt(viraddr);
shmctl(shmid,IPC_RMID,0);
exit(0);
}
4-4-2:
#include
#include
#include
#include
#include
#include
#include
#include
void int_func(int sig);
int k;
void int_func(int sig) /*定义中断后要执行的函数*/ {
k=0; /*修改循环变量的值*/
}
main()
{
int chld,shmid,running=1;
char *viraddr1,*viraddr2;
char buffer[BUFSIZ];
signal(SIGUSR1,int_func); /*预置信号对应的函数*/
k=1;
shmid=shmget(1234,BUFSIZ,0666|IPC_CREA T); /*创建共享存储区*/
while((chld=fork())==-1);
if(chld>0)
{
viraddr1=shmat(shmid,0,0); /*将共享存储区附接到父进程的虚地址空间*/
while(running) /*循环输入消息内容*/
{
puts("Enter some text:");
fgets(buffer,BUFSIZ,stdin);
strcat(viraddr1,buffer); /*采用追加方式输入信息*/
if(strncmp(buffer,"end",3)==0) /*输入为"end"结束*/
running=0;
}
shmdt(viraddr1); /*断开附接*/
kill(chld,SIGUSR1); /*父进程向子进程发软中断信号*/
wait(0);
shmctl(shmid,IPC_RMID,0); /*删除共享内存*/
exit(0);
}
else
{
while(k==1); /*循环等待父进程发软中断信号*/
/*收到信号后接受消息*/
viraddr2=shmat(shmid,0,0); /*将共享存储区附接到子进程的虚地址空间*/ printf("Your message is :\n%s",viraddr2); /*输出信息内容*/
shmdt(viraddr2); /*断开附接*/
exit(0);
}
}
5.程序运行结果
4-4-1:①