Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1311 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C] arreter un programme proprement

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] arreter un programme proprement

n°277069
Library
Posté le 29-12-2002 à 11:46:32  profilanswer
 

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

mood
Publicité
Posté le 29-12-2002 à 11:46:32  profilanswer
 

n°277072
chrisbk
-
Posté le 29-12-2002 à 11:52:59  profilanswer
 

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
n°277073
Library
Posté le 29-12-2002 à 11:56:23  profilanswer
 

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 ?

n°277082
HelloWorld
Salut tout le monde!
Posté le 29-12-2002 à 12:30:37  profilanswer
 

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
n°277085
Library
Posté le 29-12-2002 à 12:42:04  profilanswer
 

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

n°277151
Library
Posté le 29-12-2002 à 16:25:14  profilanswer
 

:bounce:

n°277211
HelloWorld
Salut tout le monde!
Posté le 29-12-2002 à 20:23:56  profilanswer
 

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
n°277288
Library
Posté le 30-12-2002 à 00:13:25  profilanswer
 

merci, je recherche

n°277330
Musaran
Cerveaulté
Posté le 30-12-2002 à 05:03:35  profilanswer
 

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
n°277363
Library
Posté le 30-12-2002 à 10:48:40  profilanswer
 

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)

mood
Publicité
Posté le 30-12-2002 à 10:48:40  profilanswer
 

n°277371
chrisbk
-
Posté le 30-12-2002 à 11:20:31  profilanswer
 

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
 
 

n°277373
Library
Posté le 30-12-2002 à 11:24:58  profilanswer
 

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.

n°277656
LeGreg
Posté le 30-12-2002 à 20:22:53  profilanswer
 

"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
n°277712
Library
Posté le 30-12-2002 à 23:05:53  profilanswer
 

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)

n°277752
Musaran
Cerveaulté
Posté le 31-12-2002 à 05:36:26  profilanswer
 

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
n°277757
Library
Posté le 31-12-2002 à 09:55:08  profilanswer
 

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

n°277765
juju-le-ba​rbare
Posté le 31-12-2002 à 10:56:07  profilanswer
 

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

n°277854
Library
Posté le 31-12-2002 à 16:31:16  profilanswer
 

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

n°277896
chrisbk
-
Posté le 31-12-2002 à 17:39:05  profilanswer
 

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é
 

n°277898
chrisbk
-
Posté le 31-12-2002 à 17:40:35  profilanswer
 

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
n°277923
Library
Posté le 31-12-2002 à 18:41:52  profilanswer
 

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.

n°278013
chrisbk
-
Posté le 01-01-2003 à 15:44:36  profilanswer
 

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

n°278043
Library
Posté le 01-01-2003 à 16:25:47  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C] arreter un programme proprement

 

Sujets relatifs
[Delphi] Comment savoir si mon programme est actif ?[Linux] Utiliser une commande dans un programme
(lire dans un fichier ascii) pourquoi mon programme ne marche pas ?Programme en mode console avec C++ Builder !
[VB] Argument a un programmebesoin d'un tout petit programme :-/
programme java lié à un site internetTraduire un programme VB
Traduire un programme VB[JAVA] Ouvrir internet explorer depuis un programme Java
Plus de sujets relatifs à : [C] arreter un programme proprement


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR