2016-06-12 44 views
0

我正在使用共享內存進行兩個不同進程之間的通信。我正在創建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; 
    } 

回答

0

對於在共享存儲器中的數據,避免字節對準的影響與pack

#pragma pack(1) 
your shared memory code 
#pragma unpack 
+0

我已經正確對齊了結構,因此沒有字節的影響。我的代碼有什麼問題,它連接到共享內存的同一部分,而不是連接到不同的部分。 – Kunal

+0

@Kunal似乎lseek不會以fd作爲參數影響mmap調用。待驗證。 – lulyon

+0

我試圖將sizeof(struct operation_st)指定爲mmap offset參數,但它給出了MAP_FAILED錯誤。 – Kunal

0

lseek的不會對所述共享存儲器的映射沒有任何影響。應該使用offset參數來映射到共享內存的不同部分。偏移量應該是頁面大小的倍數。