多个进程共享同一片内存空间,不需要进行数据的拷贝,效率最高;但存在资源竞争问题。
函数:shmget(搭配ftok)、shmat、shmdt、shmctl
实现流程:
1、创建共享内存IPC对象 shmget(ftok)
2、内存映射 shmat
3、通信 scanf、printf
4、撤销映射 shmdt
5、删除共享内存IPC对象 shmctl
read.c
/*===============================================
* 文件名称:read.c
* 创 建 者:cxy
* 创建日期:2024年02月07日
* 描 述:
================================================*/
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#define SIZE 200
int main(int argc, char *argv[])
{
//1、创建共享内存IPC对象shmget(ftok)
//1.1、获取key值
key_t key = ftok("/home",3); //不被卸载的路径与一个非0数
//1.2、创建共享内存IPC对象
//获取共享内存id号
int shmid = shmget(key,SIZE,IPC_CREAT|0664); //共享内存大小,创建与权限
//2、内存映射shmat
//获取映射出的共享内存段地址
char *buf = shmat(shmid,NULL,0); //NULL为操作系统分配空间,0为共享内存访问权限可读可写
//3、通信printf
while(1)
{
printf("%s\n",buf);
sleep(1);
if(strcmp(buf,"exit") == 0)
break;
}
//4、撤销映射shmdt
shmdt(buf);
//5、删除共享内存IPC对象shmctl
shmctl(shmid,IPC_RMID,NULL);
return 0;
}
write.c
/*===============================================
* 文件名称:write.c
* 创 建 者:cxy
* 创建日期:2024年02月07日
* 描 述:
================================================*/
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
#define SIZE 200
int main(int argc, char *argv[])
{
//1、创建共享内存IPC对象shmget(ftok)
//1.1、获取key值
key_t key = ftok("/home",3); //不被卸载的路径与一个非0数
//1.2、创建共享内存IPC对象
//获取共享内存id号
int shmid = shmget(key,SIZE,IPC_CREAT|0664); //共享内存大小,创建与权限
//2、内存映射shmat
//获取映射出的共享内存段地址
char *buf = shmat(shmid,NULL,0); //NULL为操作系统分配空间,0为共享内存访问权限可读可写
//3、通信scanf
while(1)
{
scanf("%s",buf);
if(strcmp(buf,"exit") == 0)
break;
}
//4、撤销映射shmdt
shmdt(buf);
//5、删除共享内存IPC对象shmctl
shmctl(shmid,IPC_RMID,NULL);
return 0;
}
结果