[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