Bonjour,
Je débute la programmation sous linux et je voudrai savoir quel est l'équivalent sous linux de la fonction VirtualAlloc de Windows.
Merci d'avance pour votre aide.
Bonjour,
Je débute la programmation sous linux et je voudrai savoir quel est l'équivalent sous linux de la fonction VirtualAlloc de Windows.
Merci d'avance pour votre aide.
Envoyé par brutor
A ma connaissance, c'est la fonction mmap()
http://pwet.fr/man/linux/appels_systemes/mmap
En faite je dois porter un programme windows sous linux et le programmeur utilise la fonction VirtualAlloc pour allouer de la mémoire virtuel.
J'ai regarder le lien que tu m'as donné, d'après ce que je comprend mmap permet de faire la projection de fichiers en mémoire et je ne sais pas vraiment ce que cela signifie, mais je pense que ce n'est pas ce que je veux faire.
Pouvez vous éclairer ma lanterne?
Envoyé par brutor
Plus précisement, il est écrit « un fichier (ou un autre objet) »
http://actes.sstic.org/SSTIC05/Vulne...es_memoire.pdf
Extrait de la page 4 du fichier PDF :
.../....
L’application pourra également faire elle-même appel à mmap() – ou à VirtualAlloc() sur les systèmes Windows – pour allouer de la mémoire ou mapper le contenu d’un fichier en mémoire.
.../...
Merci donc pour allouer de la mémoire virtuelle avec mmap je n'ai pas compris tous les argument.
Par exemple sous windows:
sous linux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char* mot; mot = VirtualAlloc(NULL, 15 , MEM_COMMIT, PAGE_READWRITE);
void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
Je ne vois pas quoi mettre comme argument pour le descripteur fd , et pour l'argument offset.
Merci de m'aider.
Envoyé par brutor
Exemple de code (mmap-share.tgz) que tu pourras consulter sur le site : http://david.decotigny.free.fr/snippets/
README
- simple.c : partage de memoire entre 1 parent et ses fils (ie mmap
de /dev/zero avant fork)
- multi.c : mmap de la meme partie du meme /dev/zero = 2 zones de
donnees differentes
- reader.c/writer.c : partage de memoire entre 2 processus
independants (ie mmap d'un meme fichier)
simple.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <sys/mman.h> #include <sys/types.h> #include <unistd.h> #include <unistd.h> int main () { void* zone_partagee; int fd; fd = open ("/dev/zero", O_RDWR); if (fd < 0) { perror("open"); return -1; } zone_partagee = mmap((void*)0, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (zone_partagee == NULL) { perror("mmap"); return -1; } close(fd);
Mais pourquoi dois - je ouvrir un fichier? je veux juste allouer de la mémoire virtuelle.
Envoyé par brutor
Extrait de la page web : http://man.developpez.com/man2/mmap.2.php
(...)
MAP_ANONYMOUS
La projection n'est supportée par aucun fichier. Les arguments fd et offset sont ignorés. Cet attributs, utilisé en conjonction de MAP_SHARE est implémenté depuis Linux 2.4.
(...)
Sinon tu peux voir ci-après :
http://man.developpez.com/man2/shmget.2.php
http://rperrot.developpez.com/articles/c/allocationC/
n'affiche pas 15 mais le dernier caractère de :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdlib.h> #include <sys/mman.h> typedef struct { char name[20]; int age; } personne; int main (void) { personne* pers = NULL; pers = (personne*) mmap(NULL, sizeof(personne), PROT_WRITE | PROT_READ , MAP_ANONYMOUS | MAP_SHARED , 0, 0); pers->age = 15; printf("%d",pers->age); return 0; }
23:56:50 [bruno@PCBruno:~/Programmation/ts2mpg/test_mmap]$
mais lorsque je fais ./main > toto && gtkedit toto sa m'affiche 15.
Pourquoi?
Problème de codage de caractère?
Envoyé par brutor
Petite précision. Si la mémoire que tu alloues est uniquement destinée à ton programme, tu n'as pas besoin de mmap() mais de malloc().
A ma connaissance, mmap() n'est intéressant que pour des accès par d'autres process.
Résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> typedef struct { char name[20]; int age; } personne; int main (void) { personne *pers; pers=malloc(sizeof(personne)); if ( pers == NULL ) { fprintf(stderr,"Allocation Impossible"); exit(EXIT_FAILURE); } pers->age = 15; strcpy(pers->name,"toto"); printf("%s : %d",pers->name,pers->age); return 0; }
$ malloc_struc.exe
toto : 15
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager