实验目的
- 了解进程间通信原理
- 了解进程间通信的方式
- 掌握进程间通信(共享内存)
实验内容
- 进程调用shmget函数创建新的或获取已有的共享内存
- 调用shmat函数将物理内存映射到自己的进程空间
- 调用shmdt函数取消映射
- 调用shmtl函数释放开辟的物理空间
实验原理
- 共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
程序设计
#include"sys/ipc.h"
#include"stdio.h"
#include"sys/shm.h"
#include"sys/types.h"
#include"stdlib.h"
#include"unistd.h"
#include"sys/wait.h"
struct data
{
char dat[100];
};
int main()
{
struct data *ptr;
int status;
int shmid = shmget(1 ,sizeof(struct data),0666|IPC_CREAT);
if(-1 == shmid)
{
perror("shmget error");
exit(0);
}
ptr = (struct data*)shmat(shmid,NULL,0);
if( ptr == (void *) -1)
{
perror("shmat error");
exit(1);
}
scanf("%s\n",ptr->dat);
int pid =fork();
if(-1 == pid)
{
perror("error");
exit(0);
}
if(0 == pid)
{ printf("child:%s\n",ptr->dat);
scanf("%s",ptr->dat);
exit(6);
}
else
{
pid =wait(&status);
printf("father:%s\n",ptr->dat);
}
int shm = shmctl(shmid, IPC_RMID,NULL);
if(-1 == shm)
{
perror("shmctl error");
exit(2);
}
return 0;
}
运行结果
实验总结
- 共享内存实际上就是进程通过调用shmget来分配一个共享内存块,然后每个进程通过shmat,将进程的逻辑虚拟地址空间指向共享内存块中。随后需要访问这个共享内存块的进程都必须将这个共享内存绑定到自己的地址空间中去。当一个进程往一个共享内存块中写入了数据,共享这个内存区域的所有进程就都能看到其中的内容了。