大家好,我是春哥。今天分享一下共享内存的实现,就是通过共享内存来实现进程之间的通信。
共享内存就是在内核空间的一段地址。由用户空间申请,然后将共享内存映射到用户进程空间,用户读写映射的这个空间,实际上就是在读写共享内存。
共享内存示意图
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_read
TARGET2 := mem_write
CROSS_COMPILE :=
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
OBJS1 = mem_read.o
OBJS2 = mem_write.o
CFLAGS += -Wall -I./inc
LDFLAGS +=
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。