salut a tous,
j'ai besoin de parametrer mon prog en fonction des capacites memoire de l'engin sur lequel il va tourner...
comment acceder a ce score?
en C de pref, en C++ sinon...
merci a tous.
salut a tous,
j'ai besoin de parametrer mon prog en fonction des capacites memoire de l'engin sur lequel il va tourner...
comment acceder a ce score?
en C de pref, en C++ sinon...
merci a tous.
Ce n'est pas une question de langage, mais de système. Chaque système a les fonctions qui vont bien. Il n'y a rien de standard. Il faut reposter sur le forum dédié à ton système.Envoyé par yop solo
Sur le plan de la conception, la "capacité mémoire" est quelquechose de vague. En effet, il peut s'agir de mémoire physique installée (mais pas forcément disponible). Il paut aussi s'agir de la mémoire adressable, étendue (sur disque) etc. Bref, l'information reçue n'est pas forcément très exploitable...
Le mieux est travailler en dynamique, et de tester le retour de malloc(). Si il vaut NULL, c'est que la mémoire n'était pas disponible au moment de la demande. Elle pourrait très bien l'être un peu plus tard, ou en arrêtant d'autres programmes en cours d'exécution...
Ou au moins le préciser dans le post !Envoyé par Emmanuel Delahaye
Oui, mais sur certains systèmes comme Linux suivant une stratégie d'allocation optimiste, se baser sur l'assertion "malloc réussit = suffisamment de mémoire" peut amener à beaucoup de mauvaises surprises (swapping intense, puis processus tué par EDOM, l'éliminateur de processus gourmands en mémoire).Envoyé par Emmanuel Delahaye
nan je peut apas jouer du malloc...
l'exec du prog dure 2heure et je voudrais savoir au debut combien je peut allouer a ma memoire et faire donc ces deux heure de calcul en fonction.
a moins de lancer une boucle bidon pour tester la qt dispo...
bref, comment je doit faire pour savoir la ram totale embarquee ou mieux c vrai celle qui reste...
a la maniere du vue-mettre c vrais que ca serait pas mal...
en java je sais qu'il y a une classe sy stem...
en c j'ai trouve <stdlib.h> : system qui pourrait me renvoyer par l'intermediaire d'une commande en shell la RAM dispo...
qlql connaitrait il une autre methode?
comment fonctionne le vue-mettre?
oui pardon complet...
je suis sous linux
Merci pour cette info capitaleEnvoyé par yop solo
Il faut lire le pseudo-fichier /proc/meminfo, il contient les informations essentielles pour la mémoire. Bien entendu, il faudra l'analyser et le parser.
bah j'ai pas le niveau!
je ne trouve pas ce fichier /proc/meminfo
et kesako et kestentanpar analyser et parser
?
Mauvais noyau, changer de noyau !Envoyé par Anomaly
Si tu y tiens, ce défaut de conception a été corrigé dans Linux 2.6 il me semble. C'est à vérifier.Envoyé par Emmanuel Delahaye
yop solo> Essaye un cat /proc/meminfo sous la console ! Sinon tu as quel Linux (version du noyau, distrib) ? (uname -a pour savoir la version du noyau)
C'est ce que j'avais cru comprendre. Mais je ne suis pas du tout spécialiste de Linux.Envoyé par Anomaly
resultat de uname -a:
2.4.18-3 #1 Thu Apr 18 07:37:53 EDT 2002 i686 unknown
en ksh...
que dire de plus...
cat /proc/meminfo me donne toutes les infos utiles.
comment recuperer une de ces variables?
p ex est ce que memfree necessite juste un system("memfree") de la classe stdlib ?
merci deja de m'avoir permi d'avancer jusque la...
resu de cat /proc/meminfo:
MemTotal: 1031400 kB
MemFree: 604016 kB
MemShared: 0 kB
Buffers: 23592 kB
Cached: 200008 kB
SwapCached: 33308 kB
Active: 289188 kB
Inact_dirty: 103304 kB
Inact_clean: 3108 kB
Inact_target: 79120 kB
HighTotal: 130944 kB
HighFree: 1024 kB
LowTotal: 900456 kB
LowFree: 602992 kB
SwapTotal: 514068 kB
SwapFree: 364624 kB
Committed_AS: 351508 kB
mem lib0
je voudrais recuperer la valeur memFree directement...
je doit diriger le flux, ecrire et lire en comptant les espaces et convertir en int ou bien....?
Il suffit d'ouvrir le fichier "/proc/meminfo" en mode texte (fopen() avec "r"), de lire les lignes (fgets()) et de parser celle qui contient "MemFree" de façon à déterminer la valeur (strtoul()). Je ne vois pas de difficulté majeure.Envoyé par yop solo
Poste le code si il ne fonctionne pas.
je poste la reponse pour les generations futures...
j'espere que personne ne l'avait...
merci pour tout
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream.h> int main(void) { cout<<"mem lib :"<<system("grep MemFree /proc/meminfo")<<endl; return 0; }
[Balises [CODE] ajoutées par gl, merci d'y penser à l'avenir]
Pas du C. (et du mauvais C++ : #include <iostream>)Envoyé par yop solo
oups j'avais pas vu ta repopnse emmanuel...
toute mes confuses...
heu, C++, c'est juste pour les cout??
desole pour le jargon mais que veut dire parser?
mais qd on sait c'est jamais dur au fait...
en gros tu preconise un truc genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <stdio.h> #include <stdlib.h> void main(void) { FILE *file = fopen("/proc/meminfo","R"); fgets(int ligne); // c'est la qu'il faut parser... char* ligne -----> char * memlib int mem = strtoul(memlib) fclose(file); }
Oui, et iostream. Rien de tel en C. Je rappelle que C et C++ sont des langages différents qu'il convient de ne pas mélanger.Envoyé par yop solo
Désolé pour le franglais. 'to parse' : analyser. Pour une chaine de caractère, chercher les mots cles, séparateurs, valeurs etc. de façon à en extraire des données.desole pour le jargon mais que veut dire parser?
Oui...en gros tu preconises un truc genre:
<...>
j'ai absoluement pas tout resolu!
en fait ne reussisant pas a chopper ma variable avec getc (aurais tu un site clair recenssant toute les fonctions de base a proposer), j'ai chercher a continuer dans ma voie de depart et je suis tombe sur d'autre pb....
raz le c..
j'en suis a :
le pb de system() c'est qu'il affiche directement le resulttat... pas de variable... pas de resultat...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 int mem_new; char* mymem = (char *)malloc(10); printf("test1: %s\n",mymem); system("export MYMEM=`grep MemFree /proc/meminfo | awk '{print $2}'`"); printf("La RAM libre est de: %s.", getenv("MYMEM")); cout<<"mem_new="<<mem_new<<endl; system("echo test2 $MYMEM");
je met du cout juste pour me simplifier la vie dans mes test, je lle traduirait en C...
en fait j'arrive pas a parser.... bouhouhou....
[Balises [CODE] ajoutées par gl, merci d'y penser à l'avenir]
Qui a parlé de getc() ?Envoyé par yop solo
Essaye ça. (Ca fonctionne chez moi sous DOS. Comme je n'ai pas Linux, j'ai simulé en créant un fichier texte 'meminfo' comme le tien dans un repertoire /proc.)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 #include <stdio.h> #include <string.h> #include <stdlib.h> #define FNAME "/proc/meminfo" int main (void) { FILE *fp = fopen (FNAME, "r"); if (fp != NULL) { char sline[64]; /* lire le fichier lignes a lignes */ while (fgets (sline, sizeof sline, fp) != NULL) { /* chercher le mot cle */ char *p = strstr (sline, "MemFree"); if (p != NULL) { /* chercher un separateur apres le mot cle */ while (!isspace (*p) && *p) { p++; } /* on en a trouv un, on peut convertir la suite */ if (*p) { unsigned long memfree = strtoul (p, NULL, 10); printf ("memfree = %lu kB\n", memfree); } /* recherche terminee, on quitte (proprement) */ break; } } fclose (fp); fp = NULL; } else { perror (FNAME); } return 0; }
exellent...
merci emmanuel...
il manque juste l'include de ctype.h et ca marche au poil.
cette solution me va hachement mieux pasqu'elle ne force pas a s'adapter au type de shell pour les commande que j'utilisait... il me fallait prevoir un case incluant les different ksh, sh , csh, kkztr5bsh, duttnnnnsiisdbsh...
en gros merci !
j'ai reve ou t'a pris une etoile au fait?
bonne continuation et encore merci.
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