2015-08-20 2 views
2

J'essaie d'utiliser la mémoire partagée POSIX sur un système Linux. Mais quand j'essaye de copier des données, j'obtiens une erreur de bus. Voici le code:Erreur de bus lors de l'écriture dans la mémoire partagée

#include <fcntl.h> 
#include <sys/stat.h> 
#include <pthread.h> 
#include <sys/mman.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 

void main() 
{ 
    char *s = "a"; 
    //<!--make file descripter--> 
    int fd = shm_open (s, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR); 
    if (fd == -1) 
    { 
     perror ("shm open:"); 
     printf ("error\n"); 
     shm_unlink (s); 
     exit (1); 
    } 

    //<!--memory allocation--> 
    char *str = (char *)mmap (NULL, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
    if (str == MAP_FAILED) 
    { 
     perror ("mmap"); 
     exit (1); 
    } 

    *(str + 1) = 'a'; 
    //<!--memory deallocation--> 
    munmap (str, 10); 
    //<!--unlink shared memory--> 
    shm_unlink (s); 
} 

Qu'est-ce qui provoque le blocage?

+0

On ne sait pas où l'erreur est. Pouvez-vous coller l'erreur? –

+1

'main()' doit renvoyer 'int' - Je suppose que vous ne compilez pas avec' gcc -Wall'? Définissez définitivement vos rapports de diagnostic - plutôt tôt que tard! (il vous faudra probablement aussi assigner une chaîne littérale à 's') –

+1

Aussi, ne lancez pas le résultat de' mmap() '- pour la même raison que nous ne produisons pas le résultat de' malloc() ': [Dois-je diffuser le résultat de malloc?] (Https://stackoverflow.com/q/605845/4850040). –

Répondre

3

Vous accédez à la mémoire au-delà de la fin du fichier mappé. Vous devez étendre la taille du fichier pour acquérir l'espace. Après shm_open(), ajouter:

int size = 10; // bytes 
int rc = ftruncate(fd, size); 
if(rc==-1){ ...; exit(1); }