附加到共享内存的不同部分不能正常工作

时间:2016-06-12 15:21:08

标签: c shared-memory mmap

我使用共享内存进行两个不同进程之间的通信。我正在创建16 MB大小的共享内存。我试图附加共享内存的两个不同部分。一个用于写作,另一个用于阅读。即使它映射到不同的内存地址,但是当一个被修改时,其他也会被更改。我一定做错了什么。下面是我附加到多个共享内存位置的代码片段。

void createCommPool ()
    {
      CommSet set1;
      int shmid1;
      int fd1;
      int r;
      void * ptr;
      void * ptr_res;
      umask (0);          
      fd1 = open(SHARED_MEMORY0, O_CREAT | O_TRUNC | O_RDWR, 0777);
      if (fd1 == -1)
      error_and_die("open");
      r = ftruncate(fd1, region_size);
      if (r != 0)
      error_and_die("ftruncate");
      ptr = mmap(0, sizeof(struct operation_st), PROT_READ | PROT_WRITE,  
            ,MAP_SHARED,fd1,sizeof(struct operation_st));
      if (ptr == MAP_FAILED)
      error_and_die("mmap");
      close(fd1);
      set1.shm_addr = ptr;

      fd1 = open(SHARED_MEMORY0, O_RDWR, 0777);
      if (fd1 == -1)
      error_and_die("open");
      fprintf(stderr,"The value of the file descriptor:%d\n",fd1);
      if (lseek(fd1,sizeof(struct operation_st),SEEK_SET)<0)
      {
       fprintf(stderr,"could not perform lseek\n");
       perror("lseek");
      }

     ptr_res = mmap(0,sizeof(struct operation_st), PROT_READ| PROT_WRITE,              
                    MAP_SHARED,fd1,0);
     if (ptr_res == MAP_FAILED)
      error_and_die("mmap2");
      close(fd1);
     set1.shm_addr_res = ptr_res;
     }

2 个答案:

答案 0 :(得分:0)

对于共享内存中的数据,请避免使用pack

对字节进行对齐的影响
#pragma pack(1)
your shared memory code
#pragma unpack

答案 1 :(得分:0)

lseek对共享内存的映射没有任何影响。应使用offset参数以映射到共享内存的不同部分。偏移量应为页面大小的倍数。