2016-06-12 22 views
0

Ich verwende Shared Memory für die Kommunikation zwischen zwei verschiedenen Prozessen. Ich erstelle Shared Memory von 16 MB Größe. Ich versuche, zwei verschiedene Teile des gemeinsamen Speichers anzubringen. Eine zum Schreiben und andere zum Lesen. Auch wenn es sich um eine andere Speicheradresse handelt, wird eine andere geändert, wenn eine geändert wird. Ich muss etwas falsch machen. Unten ist das Code-Snippet, an dem ich mehrere freigegebene Speicherorte anschließe.Anhängen an verschiedene Teile des gemeinsamen Speichers funktioniert nicht richtig

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; 
    } 

Antwort

0

Für Daten in den gemeinsamen Speicher mit pack den Einfluss von Bytes Ausrichtung vermeiden: auf der Abbildung des gemeinsam genutzten Speichers

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

Ich habe die Struktur richtig ausgerichtet, so dass es keinen Einfluss von Bytes gibt. Was ist falsch mit meinem Code, dass es an den gleichen Teil des gemeinsamen Speichers nicht an verschiedene Teile anfügt. – Kunal

+0

@Kunal es scheint, dass lseek nicht den mmap-Aufruf mit fd als Argument beeinflussen wird. Muss bestätigt werden. – lulyon

+0

Ich habe versucht, sizeof (struct operation_st) als mmap-Offset-Parameter anzugeben, aber es gab MAP_FAILED Fehler. – Kunal

0

lseek keine Wirkung hat. Der Offset-Parameter sollte verwendet werden, um dem anderen Teil des gemeinsamen Speichers zuzuordnen. Der Offset sollte ein Vielfaches der Seitengröße sein.