合肥师范学院操作系统实验项目四
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验项目四进程通信
一、实验目的
1.了解什么是消息,熟悉消息传送原理。
2.了解和熟悉共享存储机制。
3.掌握消息的发送与接收的实现方法。
二、实验内容
1.根据消息传送机理,使用系统调用msgget( ), msgsnd( ),
msgrev( ), 及msgctl( )编制一长度为1k的消息发送和接收的
程序,要求在程序中完成10次消息的发送和接收,每次发送
消息结束和接收消息结束都需给出相应的屏幕提示,且每次
发送的的内容不少于一个字符,并能在接收端输出。
2.根据共享存储区原理,使用系统调用shmget( ), shmat( ),
shmdt( ), 及shctl( )编制程序,要求创建一个长度为1k的共
享存储区,并完成10次数据的发送和接收,每次发送数据结
束和接收数据结束都需给出相应的屏幕提示,且每次发送的
的数据应能在接收端输出。
三、源程序及运行结果
1、源程序:
//server_ex.c 接收端
#include
#include
#include
#include
#include
#define MSGKEY 75
struct msgform
{
long mtype;
char mtext[1024];
}msg;
int msgqid;
void server( )
{
msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*创建75#消息队列*/ do
{
msgrcv(msgqid,&msg,1024,0,0); /*接收消息*/
printf("%d ",msg.mtext[0]);
printf("(server)received\n");
//sleep(1);
}
while(msg.mtype!=10);
//sleep(1);
msgctl(msgqid,IPC_RMID,0); /*删除消息队列,归还资源*/ exit(0);
}
int main( )
{ server( );
}
//client_ex.c 发送端
#include
#include
#include
#include
#include
#define MSGKEY 75
struct msgform
{
long mtype;
char mtext[1024];
}msg;
int msgqid;
int i;
void client()
{ msgqid=msgget(MSGKEY,0777); /*打开75#消息队列*/ for(i=0;i<=9;i++)
{
msg.mtype=i+1;
msg.mtext[0]=i;
printf("(client)sent\n");
msgsnd(msgqid,&msg,1024,0); /*发送消息*/
sleep(1);
}
exit(0);
}
int main( )
{ client( );
}
运行结果:截图
2.源程序:
//server_ex.c 接收端
#include
#include
#define SHMKEY 75
int shmid,i;
int *addr;
void server( )
{ shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*创建共享存储区*/
addr=shmat(shmid,0,0); /*获取首地址*/
do{ *addr=-1;
while (*addr==-1);
printf("%d",*addr);
printf(" (server) received\n");
}while (*addr!=0);
shmctl(shmid,IPC_RMID,0); /*撤消共享存储区,归还资源*/
exit(0);
}
int main( )
{ server( );
}
//client_ex.c 发送端
#include
#include
#include
#include
#include
#define SHMKEY 75
#define NUM 10
int shmid,i;
int *addr;
void client( )
{ int i;
for(i=1;i<=NUM+1;i++){
shmid=shmget(SHMKEY,1024,0777); /*打开共享存储区*/ addr=shmat(shmid,0,0); /*获得共享存储区首地址*/ while (*addr!=-1);
printf("(client) sent\n");
*addr=i;
}
*addr=0;
exit(0);
}
int main( )
{ client( );
}
运行结果:(截图)