Linux操作系统实验系列之实验七进程间通信——共享存储区的创建、附接和断接

一、实验目的
了解和熟悉共享存储机制

二、实验内容:

编制一长度为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);
}

结果图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43372169/article/details/110521908
今日推荐