2 votes

Erreur de bus lors de la tentative d'écriture dans la mémoire partagée

J'essaie d'utiliser la mémoire partagée avec shm_open y mmap . Cependant, chaque fois que j'essaie d'écrire dans cette mémoire, j'obtiens une erreur de bus. Le code d'exemple minimaliste est donné ci-dessous. Quel est le problème ici et comment peut-il être résolu ?

#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// compile with -lrt

char fname[64];
int fd;

int main()
{
    int * sm;
    sprintf( fname, "%d_%u", 4, 4 ); 

    if ((fd = shm_open(fname, O_CREAT | O_RDWR, 0777)) == -1)
    {        
        perror(NULL);
        return 0;
    }
    sm = (int*)mmap(0, (size_t)4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, 
      fd, 0);
    printf( "Now trying to see if it works!\n" );
    sm[0] = 42;
    printf( "%d, %d!\n", sm[0], sm[1] );

    return 0;
}

Le résultat que j'obtiens est le suivant

Now trying to see if it works!
Bus error

6voto

David Schwartz Points 70129

Un objet nouvellement créé a une taille de zéro. Vous ne pouvez pas modifier la taille d'un objet en le mappant ou en écrivant dans son mappage. Vous devez probablement appeler ftruncate avant mmap . (Si votre code comportait un contrôle d'erreurs, ce serait beaucoup plus facile à comprendre).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X