操作系统课程实验报告
if(p1==0)
{ for(i=0;i<10;i++)//2
shmid=shmget(SHMKEY,512,0777|IPC_CREAT);//3
addr=shmat(shmid,0,0);//4
printf("\naddr 0x%x\n",addr);
pint=(int*)addr;
for(i=0;i<10;i++=i;pint=(int*)addr; *pint=10;
while(*pint==10);
for(i=0;i<=10;i++)
printf("%c\n",*pint++);//6
shmctl(shmid,IPC_RMID,0);
exit(0); }
else
{ while((p2=fork())==-1);
(2)基于共享存储区通信中的进程间的同步是如何实现的?
答:进程协同工作时,需要互相交换信息,有些情况下进程间交换的少量信息,有些情况下进程间交换大批数据。进程通信即为两个并行进程可以通过互相发送消息进行合作,消息是通过消息缓冲而在进程之间相互传递的。
指导教师评语、评分
评分:
指导教师:
年月日
6.打印共享区的内容
7.取共享区SHMEKY的id
连接共享区
8.共享区的第一个字节为0时,等待
9.打印共享区的内容
结果分析(含实现中出错原因分析)
实验结果:
刚开始实验结果总是出现乱码,经过改正后结果只出现数字不出现字母,通过
同学们的帮助最后除了结果。
(1)共享存储区与消息通信有何区别?
答:队列通信中的消息有明显的生命周期,消息有传递的过程,有通知的过程,消息有失效性,有先后关系。而共享内存没有上面这些特点。共享内存在使用时要解决互斥的问题。
if(p2==0)
{ shmid=shmget(SHMKEY,512,0777);//7
addr=shmat(shmid,0,0);
pint=(int*)addr;
while(*pint==0);//8
for(i=0;i<10;i++)
printf("%d\n",*pint++);//9
pint=(int *)addr;
内蒙古师大计算机与信息工程学院
《操作系统》课程实验报告
实习题目
实验五
进程间基于共享存储区的通信
指导教师
职称
讲师
学生姓名
学号
日期
2014.5.2
实现工具
C语言
实现环境
LINUX
实习内容(功能、目标)
[实验目的]
系统了解linux系统的通信机构IPC,掌握IPC中共享存储区通信机制,理解共享存储区通信的方法及特征。
该进程建立共享存储区,并将存储区附接到虚拟地址addr上,然后从该存储区的起始单元开始顺序写入数字。如果该进程捕捉到一个软中断信号,则由系统调用shmctl删除该共享区。
进程通信系统通过调用函数shmget()、shmat()、shmdt()、shmctl()的使用方法及其功能,使用共享存储区通信原理。
for(i=75;i>=65;i--)
*pint++=i;
pint=(int *)addr;
*pint=0;
shmctl(shmid,IPC_RMID,0);
exit(0);
}
}
1.头文件
2.软中断处理
3.建立512k共享存储区SHMKEY
4.共享区首地址
5.共享区第一个字中写入长度10等待接收进成读
[实验内容]
编写一段程序,同时父进程创建两个子进程p1和p2;并使子进程p1与子进程p2通过共享存储区相互发送数据(512字节)。
实现的思想、方法和技术(含数据结构、算法)
本次实验通过系统调用用C语言实现了父进程创建两个子进程p1和p2;并使两个子进程p1和p2通过共享存储区相互发送数据。使得p1进程发送数字,p2进程回复字母。
主要代码
注释
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
#define SHMKEY 50
int shmid;
main()
{int i,*pint,p1,p2;
char *addr;
while((p1=fork())==-1);