暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

春哥的毕业设计之共享内存实现

      大家好,我是春哥。今天分享一下共享内存的实现,就是通过共享内存来实现进程之间的通信。

      共享内存就是在内核空间的一段地址。由用户空间申请,然后将共享内存映射到用户进程空间,用户读写映射的这个空间,实际上就是在读写共享内存。

共享内存示意图

共享内存的设计步骤如下:

1、寻找通信双方可以识别的key    ftok()

2、通过key值找到对应的IPC对象     shmget()

3、在进程的用户空间中映射内核IPC对象的地址   shmat/shmdt

4、在用户进程空间进行操作

然后上代码,关于这段代码的解读,还是在我B站上面,视频地址:https://www.bilibili.com/video/BV1A3411g7me/,如果有不清楚,学习过程有问题,欢迎私我。
mem_read.c文件
    #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;
    }
    复制
    mem_write.c文件
      #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;
      }
      复制
      Makefile
        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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论