一、实验目的
了解和熟悉共享存储机制
二、实验内容:
编制一长度为1k的共享存储区发送和接收的程序。
程序设计
(1) 为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。
(2) SERVER端建立一个key为75的共享区,并将第一个字节设置为-1,。作为数据空的标志。等待其他进程发来的消息。当字节的值发生变化时,表示收到了信息,进行处理。然后再次把它的值设为-1。如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER。SERVER每接收到一个数据后显示“(server)receive”。
(3) CLIENT端建立一个key 为75的共享区,当共享取得第一个字节为-1时,Server端空闲,可发送请求。CLIENT随即填入9到0。期间等待server端的再次空闲。进行完这些操作后,CLIENT退出。CLIENT每发出一次数据后显示“(client)sent”。
(4) 父进程在SERVER和CLIENT均退出后结束。
三、实验环境
Linux操作系统
四、实验过程与运行结果
源代码:
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<wait.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#include <sys/shm.h>
#define SHMKEY 75 /定义共享区关键词/
int shmid,i;
int *addr;
void CLIENT()
{
int i;
shmid=shmget(SHMKEY,1024,0777); /获取共享区,长度1024,关键词SHMKEY/
addr=shmat(shmid,0,0); /共享区起始地址为addr/
for(i=9;i>=0;i–)
{
while(*addr!= -1);
printf("(client)sent\n"); /打印(client)sent/
*addr=i; /把i赋给addr/
}
exit(0);
}
void SERVER()
{
shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /创建共享区/
addr=shmat(shmid,0,0); /共享区起始地址为addr/
do
{
*addr=-1;
while(*addr==-1);
printf("(server)received\n"); /服务进程使用共享区/
}
while(*addr);
shmctl(shmid,IPC_RMID,0);
exit(0);
}
int main()
{
if(fork())
SERVER();
if(fork())
CLIENT();
wait(0);
wait(0);
}
结果图: