[SOS] mmap

lementec fabien fabien.lementec at gmail.com
Jeu 20 Nov 20:57:16 CET 2008


salut,

 dd if=/dev/zero of=/tmp/mmap.txt bs=4096 count=1

retires le creat et mapp a partir de l offset 0, sur
une taille de 4096. ca devrait passer. ton bus error
provient du fait que tu accede a une zone memoire
non backee sur le fichier (ton mapping: 4096 -> 8092, et le fichier
lors de son creat() ne fait que 0).

Le 20 novembre 2008 13:28, anthoine.bourgeois
<anthoine.bourgeois at orange.fr> a écrit :
> Bonjour à tous,
>
> J'essaye de faire un test sous linux.
> C'est un test que j'ai pris des sources de SOS
> sur le filesystem dans fstest.c .
> J'aimerai savoir quel est l'état
> du fichier mmap.txt après le test.
>
> Sous linux j'ai un Bus Error lors le père fait la première
> lecture de la zone mappé.
>
> Quelqu'un pourrait-il tester ou me dire pourquoi
> le programme ne fonctionne pas ?
>
> le code :
>
> #include <stdlib.h>
> #include <string.h>
> #include <stdio.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <sys/mman.h>
>
> int main(int argc, void *argv[])
> {
>  int ret;
>
>  printf("mmap test\n");
>  /* Basic use */
>  ret = creat("mmap.txt", S_IRUSR | S_IWUSR);
>  if (ret == 0)
>    printf("creat OK\n");
>  if (fork() == 0)
>    {
>      char *shrd;
>      int fd;
>      fd = open("mmap.txt", O_RDWR | O_CREAT,
>                                      S_IRUSR | S_IWUSR);
>
>      shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
>                                        MAP_SHARED, fd, 4096);
>      printf("shrd %p children\n", shrd);
>      if (shrd == (void *)-1)
>        printf("shrd children error\n");
>      sleep(2);
>      strncpy(shrd, "Hello3 from the child (shared mapping) !", 4096);
>      sleep(20);
>    }
>  else
>    {
>      char *shrd;
>      int fd;
>      sleep(1);
>      fd = open("mmap.txt", O_RDWR | O_CREAT,
>                                      S_IRUSR | S_IWUSR);
>
>      shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
>                                        MAP_SHARED, fd, 4096);
>      printf("shrd %p father\n", shrd);
>      if (shrd == (void *)-1)
>        printf("shrd father error\n");
>
>      //strncpy(shrd, "Garbage garbage garbage", 256);
>      sleep(2);
>      printf("Father woken up\n");
>      //printf("Read string from child: '%s'\n", shrd);
>      //if (strcmp(shrd, "Hello3 from the child (shared mapping) !") == 0)
>      if (shrd[0] == 'H')
>        printf("TEST3 OK\n");
>
>      munmap(shrd, 8192);
>      ret = close(fd);
>      if (ret == 0)
>        printf("close OK\n");
>    }
>
>  return 0;
> }
>
> Ici le test if (shrd[0] == 'H') lève un Bus Error. Pourquoi ?
>
> Cordialement,
> Anthoine
>
> _______________________________________________
> Sos mailing list
> Sos at the-doors.enix.org
> http://the-doors.enix.org/cgi-bin/mailman/listinfo/sos
>



-- 
"What I cannot create I dont understand"


Plus d'informations sur la liste de diffusion Sos