2016-06-12 8 views
0

두 가지 다른 프로세스 간의 통신에 공유 메모리를 사용하고 있습니다. 16MB 크기의 공유 메모리를 생성 중입니다. 공유 메모리의 두 부분을 연결하려고합니다. 쓰기 용과 독서 용. 다른 메모리 주소로 매핑되지만 하나가 수정되면 다른 주소도 변경됩니다. 나는 틀린 일을해야만합니다. 아래는 다중 공유 메모리 위치에 연결하는 코드 스 니펫입니다. 공유 메모리에 데이터의 경우공유 메모리의 다른 부분에 제대로 연결되지 않음

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

mmap 오프셋 매개 변수로 sizeof (struct operation_st)를 지정하려고했지만 MAP_FAILED 오류가 발생했습니다. – Kunal

0

lseek의 공유 메모리의 매핑에 영향을주지 않습니다. 오프셋 매개 변수는 공유 메모리의 다른 부분에 매핑하기 위해 사용해야합니다. 오프셋은 페이지 크기의 배수 여야합니다.