[C] arreter un programme proprement

arreter un programme proprement [C] - C++ - Programmation

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 :)

Reply

Marsh Posté le 29-12-2002 à 11:46:32   

Reply

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


Message édité par chrisbk le 29-12-2002 à 11:55:26
Reply

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 ?

Reply

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).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

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é.

Reply

Marsh Posté le 29-12-2002 à 16:25:14    

:bounce:

Reply

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


Message édité par HelloWorld le 29-12-2002 à 20:24:08

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 30-12-2002 à 00:13:25    

merci, je recherche

Reply

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.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

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)

Reply

Marsh Posté le 30-12-2002 à 10:48:40   

Reply

Marsh Posté le 30-12-2002 à 11:20:31    

Library a écrit :

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)


 
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
 
 

Reply

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.

Reply

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


---------------
voxel terrain render engine | animation mentor
Reply

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 :
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. int main(void)
  6. {
  7. int p[2];
  8. int res;
  9. int *var;
  10. var=malloc(sizeof(int));
  11. var[0]=1;
  12. res = pipe(p);
  13. if (res != -1) {
  14.   res = fork();
  15.   switch(res){
  16.     case -1 :
  17.       perror("fork" );
  18.       break;
  19.     case 0 :
  20.       /* processus fils */
  21.       close(p[1]);
  22.       while (var[0]==1)
  23. {
  24.   printf("%d ",getpid());
  25.   res = read(p[0],var, sizeof(int*));
  26.   printf("\nLe texte reçu est : %d.\n", var[0]);
  27. }
  28.       break;
  29.     default :
  30.       /* processus pere */
  31.       close(p[0]);
  32.       sleep(5);
  33.       res = write(p[1],0, 1);
  34.     }
  35.   }
  36.   return 0;
  37. }


 
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)

Reply

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.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

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 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.


 
je t'ai passé le code en MP, il est trop long pour etre mis sur ce topic

Reply

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

Reply

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 :(

Reply

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é
 

Reply

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));


Message édité par chrisbk le 31-12-2002 à 17:40:58
Reply

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 :
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. int main(void)
  6. {
  7. int p[2];
  8. int res;
  9. int var=1;
  10. res = pipe(p);
  11. if (res != -1) {
  12.   res = fork();
  13.   switch(res){
  14.     case -1 :
  15.       perror("fork" );
  16.       break;
  17.     case 0 :
  18.       /* processus fils */
  19.      
  20.       close(p[1]);
  21.      
  22.       while (var==1)
  23. {
  24.   printf("%d ",getpid());
  25.   res = read(p[0],&var, sizeof(int));
  26.   printf("\nLe texte reçu est : %d.\n", var);
  27. }
  28.       break;
  29.     default :
  30.       /* processus pere */
  31.       close(p[0]);
  32.       sleep(5);
  33.       var=0;
  34.       res = write(p[1],&var, sizeof(int));
  35.      
  36.      
  37.   }
  38. }
  39.   return 0;
  40. }

 
 
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.

Reply

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 :
  1. printf("%d\n",getpid());
  2. fflush(stdout);
  3. res = read(p[0],&var, sizeof(int));

Reply

Marsh Posté le 01-01-2003 à 16:25:47    

comme ca ?
 

Code :
  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. int main(void)
  6. {
  7. int p[2];
  8. int res,i;
  9. int var=1;
  10. res = pipe(p);
  11. if (res != -1) {
  12.   res = fork();
  13.   switch(res){
  14.     case -1 :
  15.       perror("fork" );
  16.       break;
  17.     case 0 :
  18.       /* processus fils */
  19.      
  20.       close(p[1]);
  21.       i=0;
  22.       while (var==1)
  23. {
  24.   printf("%d\n",getpid()); 
  25.   fflush(stdout);
  26.   printf("i : %d ",i);
  27.   res = read(p[0],&var, sizeof(int));
  28.   printf("\nLe texte reçu est : %d.\n", var);
  29.   i++;
  30. }
  31.       break;
  32.     default :
  33.       /* processus pere */
  34.       close(p[0]);
  35.       sleep(5);
  36.       var=0;
  37.       res = write(p[1],&var, sizeof(int));
  38.      
  39.      
  40.   }
  41. }
  42.   return 0;
  43. }


 
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 :(

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed