【回眸】技术干货——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
点赞 评论 收藏
分享
兄弟们,秋招卷疯了吧?一窝蜂冲那些听着光鲜亮丽的总部管培生,简历关都能挤成肉饼。今天教点“邪修”打法——放弃幻想,准备斗争,走差异化路线,找个好上岸的坑位先蹲进去再说!记住邪修第一心法:你的目标是“上岸”,不是去黄埔军校当尖兵。&nbsp;先进门,比什么都重要!【邪招一】死磕“名字土掉渣”的二级/三级公司别只盯着“中石油”、“国家电网”这种金光闪闪的母公司招牌。往下看!去扒拉它的二级子公司、三级孙公司,特别是那些:-&nbsp;名字长得像绕口令的:比如“中国石油××油田分公司××采油厂”、“国家电网××省电力公司××市供电公司”。-&nbsp;业务听起来很专业的:比如“××研究院”、“××设计院”、“××设备制造公司”。【邪招二】拥抱“山沟沟”里的潜力股一听工作地点在“某某新区”、“某某基地”,甚至某个三四线小城,很多人就撇嘴了。错!大错特错!-&nbsp;新项目、新基地才是宝:这种地方正处于扩张期,缺人!严重缺人!&nbsp;要求可能放得更宽,晋升机会反而更多。你以为是发配边疆,其实是开荒元老。-&nbsp;“地理位置差”是天然的过滤器:帮你自动过滤掉了90%的竞争者,剩下的都是真心想踏实干点事或者本地求稳的,竞争环境友好得不像话。【邪招三】专攻“冷门但核心”的岗位别所有人都去挤行政、人力、财务这种通用岗。看看这些:-&nbsp;“天书”专业岗:比如学地质的去看“井下作业”、“地质勘探”;学机械的去看“设备管理”、“技术安全”。这些岗位专业壁垒高,外行根本进不来,只要专业对口,简直就是为你量身定做的VIP通道。-&nbsp;“一线操作”岗:有些岗位名义上要下基层、跑现场,很多人不愿意去。但你得搞清楚,很多央企的干部都是从基层提拔的,这是一种传统。先以操作岗进去,表现突出后转管理岗的路径非常通畅。邪招终极奥义:会看公告,你就能“开天眼”招聘公告里藏着玄机,邪修高手都是这么看的:1.&nbsp;看“备注栏”:如果写着“常驻现场”、“适合男性”、“需要倒班”……恭喜你,发现宝藏了!这些劝退条款就是你的入场券。2.&nbsp;看招聘人数:一个岗位招“1人”的,慎重点。招“若干”或“5人以上”的,可以重点标记,机会更大。3.&nbsp;看专业要求:要求越具体、越冷门的专业越好。比如要“腐蚀与防护专业”的,肯定比要“材料类专业”的竞争小一百倍。最新招聘公告查看https://m.finsight.work/pages/activePage/general/index?pageCode=0F52EBAB
国企秋招,你投了吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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