大家好,我是春哥。今天分享一下共享内存的实现,就是通过共享内存来实现进程之间的通信。
共享内存就是在内核空间的一段地址。由用户空间申请,然后将共享内存映射到用户进程空间,用户读写映射的这个空间,实际上就是在读写共享内存。

共享内存示意图
1、寻找通信双方可以识别的key值 ftok()
2、通过key值找到对应的IPC对象 shmget()
3、在进程的用户空间中映射内核IPC对象的地址 shmat/shmdt
4、在用户进程空间进行操作
#include<stdio.h>#include<stdlib.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>struct task{/* data */char label[10];double temp;double humi;};void shm_init(){key_t key;int shm_id;struct task* t1;key=ftok("/home",1);if(key==-1)return;shm_id=shmget(key,sizeof(struct task),IPC_CREAT | 0644);t1=(struct task*)shmat(shm_id,NULL,0);printf("%.2f\n",t1->temp);}int main(){shm_init();return 0;}
#include<stdio.h>#include<stdlib.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>struct task{/* data */char label[10];//仓库标签double temp;double humi;};void shm_init(){key_t key;int shm_id;struct task* t1;key=ftok("/home",1);if(key==-1)return;shm_id=shmget(key,sizeof(struct task),IPC_CREAT | 0644);t1=(struct task*)shmat(shm_id,NULL,0);t1->temp=0.12;}int main(){shm_init();return 0;}
TARGET1 := mem_readTARGET2 := mem_writeCROSS_COMPILE :=CC = $(CROSS_COMPILE)gccLD = $(CROSS_COMPILE)ldOBJS1 = mem_read.oOBJS2 = mem_write.oCFLAGS += -Wall -I./incLDFLAGS +=OUTPUT_DIR =all:$(TARGET1) $(TARGET2)$(TARGET1):$(OBJS1)$(CC) $(LDFLAGS) $^ -o $@$(TARGET2):$(OBJS2)$(CC) $(LDFLAGS) $^ -o $@clean:rm -f $(TARGET1) $(OBJS1) $(TARGET2) $(OBJS2)
文章转载自春哥的嵌入式小世界,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




