[SOS] mmap

anthoine.bourgeois anthoine.bourgeois at orange.fr
Jeu 20 Nov 20:28:21 CET 2008


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



Plus d'informations sur la liste de diffusion Sos