arreter un programme proprement [C] - C++ - Programmation
Marsh Posté le 29-12-2002 à 11:52:59
les ptr a desaouller, c question propreté, surtout. Dans ce genre de prog (qui tourne 5min et qui s'en va) je ne pense pas que ca ait grande importance
Ensuite, j'imagine que ca depend de ton OS, sous nux tu peux recuper les signaux emis par l'utilisateur (ctrl c & cie) mais je ne me rapelle plus de la fonction (sig qqchose). Quoiqu'il en soit, dans ces coups de temps la methode qui me parait la mieux c'est de lancer une thread annexe, thread qui se chargera d'effectuer le boulot a proprement dit. Comme ca, la thread principale pourra encore servir (genre a voir que le type a cliquer sur cancel) ou a recup les signaux comme ecris plus haut, et si necessaire a degager la thread annexe, faire les desalloc et terminer le prog
vala
Marsh Posté le 29-12-2002 à 11:56:23
je suis sous linux
le probleme avec ce que tu dis, c'est que je vais etre obligé de chambouller tout mon programme, je préfererais éviter.
y a pas une autre solution ?
Marsh Posté le 29-12-2002 à 12:30:37
pas avec les signaux.
Quelques lignes de + au debut du prog.
Pour les free, ca risque pas grand chose, sauf de satturer la memoire (5 min de calcul) et donc de ralentir ton prog, voire le faire planter (si pas de mem).
Marsh Posté le 29-12-2002 à 12:42:04
c'est quel genre de lignes au début du programme ? (je demande pas ces lignes, mais j'aimerais avoir un peu plus de précisions )
les pointeurs sont utilisés tout au long du programme dans les calculs. Si je les vide, je perd les valeurs qui sont dedans non ?
Ca vaut le coup de stocker les valeurs dans un autre tableau, de vider le pointeur utilisé tout le temps puis de remettre les valeurs dedans ? Je dis ca car j'ai remarqué que le programme allait de plus en plus lentement en fonction du temps de calcul deja effectué.
Marsh Posté le 29-12-2002 à 20:23:56
Ben créé une fonction Exit() qui se charge de desallouer les pointeur.
Cette fonction tu l'appelles a 2 endroits :
- a la fin (normale) de ton programme
- dans le handler de signal
Pour les signaux, fait une petite recherche sur google
Marsh Posté le 30-12-2002 à 05:03:35
Library a écrit : les pointeurs sont utilisés tout au long du programme dans les calculs. Si je les vide, je perd les valeurs qui sont dedans non ? |
Si tu accumules les allocations sans jamais libérer, le mécanisme d'allocation risque de devenir lent (expérience vécue avec 10000+ allocations).
Citation : les pointeurs sont utilisés tout au long du programme dans les calculs. Si je les vide, je perd les valeurs qui sont dedans non ? |
Qu'apelles-tu 'vider' et 'perdre' ?
Si tu réaffecte le pointeur, tu écrases l'ancienne valeur et perds l'accès à la donnée allouée qu'il désignait.
Marsh Posté le 30-12-2002 à 10:48:40
j'appelle vider faire un free
et perdre les valeurs ca veut simplement dire que les valeurs stockées ont disparu (plus moyen de les utiliser quoi).
tu l'as résolu comment ton probleme de lenteur au bout de 10000 allocations ?
parce que moi des allocations, j'en ai plusieurs millions pour un meme tableau (déclaré comme pointeur)
Marsh Posté le 30-12-2002 à 11:20:31
Library a écrit : j'appelle vider faire un free |
huh
peut etre alors tu peux essayer de faire un memory manager. Celui ci alloue au debut un gros pool de donnée, et ensuite quand tu veux de la mémoire tu demande a ton MM de te repasser un pointeur vers une partie de ce pool de donnée.
Fo voir ensuite si il y a gain reel
Marsh Posté le 30-12-2002 à 11:24:58
désolé mais je comprends pas tout (ca fait que deux semaines que je programme en C)
j'essaierai d'optimiser ca plus tard, je vais le laisser se ralentir.
par contre tu connaitrais pas l'adresse d'un bon site où est clairement expliquée la fonction fork ? Pour l'instant je suis tombé que sur des sites pas complets.
Marsh Posté le 30-12-2002 à 20:22:53
"man fork"..
en tout cas c'est comme ca qu'on m'a explique
fork duplique ton processus reproduisant la memoire, la pile, le point d'execution etc. sauf qu'il y a un processus parent et un processus enfant. Le processus parent recupere le proc id de son fils, le fils recupere une valeur nulle en retour et c'est comme ca que tu sais si tu es dans le processus pere ou dans le processus fils parce que sinon tout est identique.
LeGreg
Marsh Posté le 30-12-2002 à 23:05:53
oui, j'ai réussi a comprendre fork tout a l'heure. J'en suis au point d'essayer de comprendre pipe.
quelqu'un voit une erreur la dedans ?
Code :
|
je veux qu'au bout de 5 secondes le processus pere donne l'ordre au processus fils de s'arreter. Pour cela, je veux passer l'entier 0 au processus fils par le pipe. Mais ca marche pas et le processus fils boucle (le pire c'est que Ctrl+C ne l'arrete pas, heureusement que j'affiche son PID pour pouvoir le killer)
Marsh Posté le 31-12-2002 à 05:36:26
Library a écrit : tu l'as résolu comment ton probleme de lenteur au bout de 10000 allocations ? |
En faisant moins d'allocations, ou en n'en faisant pas du tout.
Je ne plaisante pas, l'allocation de mémoire est un mécanisme lourd, et il est rare que ce soit indispensable.
Si tu montres ton code, je suis sûr à 99% de faire pareil sans.
Marsh Posté le 31-12-2002 à 09:55:08
Musaran a écrit : En faisant moins d'allocations, ou en n'en faisant pas du tout. |
je t'ai passé le code en MP, il est trop long pour etre mis sur ce topic
Marsh Posté le 31-12-2002 à 10:56:07
Salut,
Il existe une fonction en C qui fait comme malloc mais qui libère automatiquement là mémoire à la fin de la fonction ... man alloca
++
juju
Marsh Posté le 31-12-2002 à 16:31:16
ca tant pis c'est que de la lenteur, j'essaierai d'optimiser quand tout marchera. Mais j'ai tjs le probleme que je comprend pas avec mon code 3 posts au dessus
Marsh Posté le 31-12-2002 à 17:39:05
Citation : res = read(p[0],var, sizeof(int*)); |
A priori ton pb ne vient pas de la, mais ce n'est pas sizeof(int*) qu'il te faut mettre, mais sizeof(int).
Sinon, la derniere fois que j'ai utiliséles pipe remonte a loin, mais quoi diable tu les close lors de l'entrée dans un processus ?
A coté de ca, doit surement avoir 200 examples de pipe sur le net, sur qu'une fine recherche google devrait t'eclairé
Marsh Posté le 31-12-2002 à 17:40:35
Citation : res = write(p[1],0, 1); |
et ca c'est pas bon du tout !
Tu lui demande d'ecrire dans p[1] un octet (alors qu'un int en fait génralement 4), et tu lui demandes d'ecrire ce qui se trouve a l'adresse 0 !
Pas bon, du tout :
int truc = 0;
res = write(p[1],&truc, sizeof(int));
Marsh Posté le 31-12-2002 à 18:41:52
d'ac merci, ca ne bug plus. (en fait le 1 j'avais deja essayé le sizeof(int) mais comme ca marchait pas j'ai réassyé avec un caractere '0' et pas un entier)
maintenant le probleme c'est que ca fait pas ce que je veux
Code :
|
je voudrais que pendant le sleep(5) du processus pere le processus fils m'affiche plein de fois son PID. La il l'affiche qu'une fois à la fin.
Marsh Posté le 01-01-2003 à 15:44:36
possible que ton read du fils soit bloquant, et vu que tu ne flush pas le stdout avec un \n ou un fflush(stdout), ben le printf avant le read ne s'effectue pas completement.
remplace ca par un :
Code :
|
Marsh Posté le 01-01-2003 à 16:25:47
comme ca ?
Code :
|
parce que ca fait pareil (j'ai rajouté les i pour voir si en fait il ne faisait que calculer et pas afficer, mais non il calcule pas non plus
Marsh Posté le 29-12-2002 à 11:46:32
bonjour
j'ai un programme en C qui peut facilement calculer 5 minutes, mais parfois j'aimerais bien l'arreter avant qu'il ait fini. Je rencontre des problemes lorsque je fais simplement Ctrl+C et aimerais bien pouvoir stopper l'execution du programme simplement en appuyant sur la touche Echap. Comment faire ? (je connais exit(EXIT_SUCCESS); mais je ne sais pas comment on se sert des touches du clavier).
j'ai une autre question aussi : quels sont les risques d'une non désallocation mémoire ?
j'utilise pas mal de pointeurs, et ca me saoule un peu de devoir faire free pour tous. C'est dangereux sachant que je suis le seul à executer ce programme ?
merci