【回眸】技术干货——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上。