【回眸】技术干货——Linux 内核 (十四)进程间通讯 之 共享内存

前言

前面介绍了进程间通信的几种方法诸如:管道、消息队列等等,接下来是更加高级的进程间通讯的方法:共享内存。

共享内存

共享内存是一种在多处理器计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。它允许多个进程直接访问同一块物理内存区域,从而实现快速的数据交换和通信。

简单来说共享内存可以实现即时通讯的功能,共享内存的流程如下图所示:

共享内存实现进程间通信是进程间通信最快的。

共享内存实现步骤

1.创建/打开

2.映射

3.数据交互

4.释放共享内存

共享内存函数原型

1.创建获取共享内存 shmget

#include <sys/ipc.h>
#include <sys/shm.h>
//创建或获取一个共享内存,成功返回共享内存ID,失败返回-1

int shmget (key_t key,size_t size,int flag);

2.连接共享内存到地址空间

#include <sys/ipc.h>
#include <sys/shm.h>
//连接共享内存到当前进程的地址空间,成功返回共享内存的指针,失败返回-1
void *shmat (int shm_id,const void *addr,int flag);

3. 断开与共享内存的连接shmdt

#include <sys/ipc.h>
#include <sys/shm.h>
//断开与共享内存的连接,成功返回0,失败返回-1
int shmdt(void *addr);

4.控制共享内存的相关消息shmctl

#include <sys/ipc.h>
#include <sys/shm.h>
//控制共享内存的相关信息,成功返回0,失败返回-1
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);

共享内存函数调用1

comm7.c(写操作)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>


//int shmget(key_t ley, size_t size, int flag)
//void *shmat (int shm_id, const void *addr,int flag);
int main(){
int shmid;
char *shmaddr;
key_t key;
key = ftok(".",1);

shmid = shmget(key,1024*4,IPC_CREAT|0666);
if(shmid == -1){
printf("share memory is not OK");
exit(-1);
}
shmaddr = shmat(shmid,0,0);
printf("shmat OK! \n");
strcpy(shmaddr,"pijiuya \n");
sleep(5);
shmdt(shmaddr);
shmctl(shmid,IPC_RMID, 0);
printf("Quit!\n");

return 0;
}

共享内存函数调用2 

comm8.c(读操作)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>


//int shmget(key_t ley, size_t size, int flag)
//void *shmat (int shm_id, const void *addr,int flag);
int main(){
int shmid;
char *shmaddr;
key_t key;
key = ftok(".",1);

shmid = shmget(key,1024*4,0);
if(shmid == -1){
printf("share memory is not OK\n");
exit(-1);
}
shmaddr = shmat(shmid,0,0);
printf("shmat OK! \n");
// strcpy(shmaddr,"pijiuya \n");
printf("data:%s\n",shmaddr);
shmdt(shmaddr);
//shmctl(shmid,IPC_RMID, 0);
printf("Quit!\n");

return 0;
}

运行结果展示1

运行结果展示2 

注意:这里注意负责写的comm7.c文件和负责读的comm8.c文件需要分开编译,并且comm7.c文件里有等待5秒的操作(sleep(5))所以要在五秒内在另一个终端里运行 ./r

后记碎碎念

Linux内核是一个系列,可以点击专栏查看同系列的其他文章,希望能帮到屏幕前的每一位应届生往届生,该博文最初发表在CSDN上。

全部评论

相关推荐

10-11 15:57
门头沟学院 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务