.
操作系统实验报告
实验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
int shmid,running=1; char *viraddr; char buffer[BUFSIZ];
--
.
shmid=shmget(1234,BUFSIZ,0666|IPC_CREAT); viraddr=shmat(shmid,0,0); while(running) { puts(\ fgets(buffer,BUFSIZ,stdin); strcat(viraddr,buffer);
if(strncmp(buffer,\
running=0;
}
shmdt(viraddr); exit(0); }
②
#include
--
.
{
int shmid; char *viraddr;
shmid=shmget(1234,BUFSIZ,0666|IPC_CREAT); viraddr=shmat(shmid,0,0);
printf(\ shmdt(viraddr);
shmctl(shmid,IPC_RMID,0); exit(0); }
4-4-2:
#include
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_CREAT); /*创建共享存储区*/ while((chld=fork())==-1); if(chld>0) {
viraddr1=shmat(shmid,0,0); /*将共享存储区附接到父进程的虚地址空间*/ while(running) /*循环输入消息内容*/ {
puts(\
fgets(buffer,BUFSIZ,stdin);
strcat(viraddr1,buffer); /*采用追加方式输入信息*/ if(strncmp(buffer,\ /*输入为\结束*/ running=0;
}
shmdt(viraddr1); /*断开附接*/
kill(chld,SIGUSR1); /*父进程向子进程发软中断信号*/ wait(0);
--
.
shmctl(shmid,IPC_RMID,0); /*删除共享内存*/ } else {
while(k==1); /*循环等待父进程发软中断信号*/ /*收到信号后接受消息*/
viraddr2=shmat(shmid,0,0); /*将共享存储区附接到子进程的虚地址空间*/ exit(0);
printf(\ /*输出信息内容*/ shmdt(viraddr2); /*断开附接*/ } }
exit(0);
5. 程序运行结果 4-4-1:①
②
--
.
4-4-2:
6. 实验心得
经过这次试验我学会了如何在LINUX的环境下实现共享存储通信,这种通信方式快
捷,而且容量信息量大,并且学会了进程之间同步的方法,但是在实验过程中还是发现了很多不足,在今后的学习中慢慢体会程序中的思想和方式,提高自己的水平。
--