进程通信
- 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. 源程序:
#include
#include
#include
#include
#define MSGKEY 75
struct msgform
{
long mtype;
char mtext[1024];
}msg;
int msgqid,i;
void client( )
{
int i;
msgqid=msgget(MSGKEY,0777|IPC_CREAT);
for(i=10;i>=1;i--)
{
msg.mtype=i;
msg.mtext[i]='k'-i;
printf("(client)sent %c\n",msg.mtext[i]);
msgsnd(msgqid,&msg,1024,0);
}
}
main()
{
client( );
}
#include
#include
#include
#include
#define MSGKEY 75
struct msgform
{
long mtype;
char mtext[1024];
}msg;
int msgqid,i;
void server( )
{
msgqid=msgget(MSGKEY,0777|IPC_CREAT); do
{
msgrcv(msgqid,&msg,1024,0,0);
printf("%c ",msg.mtext[msg.mtype]);
printf("(server)receive\n");
}while(msg.mtype!=1);
msgctl(msgqid, IPC_RMID,0);
}
main()
{
server();
}
1.运行结果:
2.源程序:
#include
#include
#include
#include
#include
#define SHMKEY 75
int shmid,i;
int *addr;
void client( )
{ int i,n=1;
shmid=shmget(SHMKEY,1024,0777); /*打开共享存储区*/ addr=shmat(shmid,0,0); /*获得共享存储区首地址*/ for(i=0;i<10;i++)
{while (*addr!=-1);
printf("(client) sent");
*addr=n++;
printf(" %d\n",*addr);
sleep(1);
}
exit(0);
}
int main( )
{ client( );
}
#include
#include
#include
#include
#include
#define SHMKEY 75
int shmid,i;
int *addr;
void server( )
{ shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*创建共享存储区*/ for(i=0;i<10;i++)
{
addr=shmat(shmid,0,0); /*获取首地址*/
*addr=-1;
while (*addr==-1);
printf("%d",*addr);
printf(" (server) received\n");
sleep(1);
}
shmctl(shmid,IPC_RMID,0); /*撤消共享存储区,归还资源*/
exit(0);
}
int main( )
{ server( );
}
运行结果:(截图)
四、实验分析与总结