Stopper un programme lancé en ligne de commande ? - C++ - Programmation
Marsh Posté le 18-04-2003 à 09:34:35
bezot3 a écrit : Bonjour, j'ai ecris un programme c++ qui se lance via ligne de commande (ms dos et unix). Donc pas d'interface graphique. J'ai une boucle while qui tourne pour l'instant sans arret. Mais j'aimerais pouvoir arreter ce programme proprement a n'importe quel moment (si j'avais une interface graphique, j'aurais placer un bouton "stop" et le tour etait joué !). Comment faire ? |
ben ca depend de ce que tu veux faire soit c'est ctrl-c
ou alors tu peux demander a l'user de taper un touche definie a l'avance
EDIT : c'est peut etre possible de lui demander de taper la touche esc => code ascii 27 si je me souviens bien
Marsh Posté le 18-04-2003 à 09:37:45
Si c'est au niveau prog que tu veux pouvoir quitter, il te faut effectivement gérer les actions de l'utilisateur via un getchar par exemple ...
Sous Linux, si tu as lancé ton prog en tâche de fond (je suppose que c'est son but), n'oublie pas de la remettre au premier plan du terminal ...
Marsh Posté le 18-04-2003 à 10:06:29
En gros, si j'ai dans mon code :
bool arret = false;
while ( ! arret) {
//faire le boulot
}
J'aimerais que, suite à une action de l'utilisateur (a determiner), le programme soit capable de passer le bool arret a true (et ensuite, mon programme pourra se terminer proprement). C'est jouable ou pas ?
Marsh Posté le 18-04-2003 à 10:10:22
bezot3 a écrit : En gros, si j'ai dans mon code : |
ben oui. soit tu fait un break dans ta boucle suite a l'action de l'user soit tu mets arret a true
y a aucun probleme
EDIT :
printf("tapez escape pour terminer" )
while (true)
{
if (getchar()==27) //faut voir exactement comment ca fonctionne je me souviens plus tres bien
break();
}
ou alors
printf("tapez escape pour terminer" )
while (!arret)
{
if (getchar()==27) //faut voir exactement comment ca fonctionne je me souviens plus tres bien
arret = true;
}
ca devrait passer sans probleme
Marsh Posté le 18-04-2003 à 10:18:43
polo021 a écrit : |
Sinon, c'est vrai que dans l'idée, c'est ce qu'a dit Polo021 ... (je préfère la 2ème solution perso ...)
Marsh Posté le 18-04-2003 à 10:20:23
ReplyMarsh Posté le 18-04-2003 à 10:20:49
theShOcKwAvE a écrit : |
Marsh Posté le 18-04-2003 à 10:26:35
Ben quoi, t'aurais fait la même chose à ma place non ?
en tout cas tu t'es fait méchament
Marsh Posté le 18-04-2003 à 10:28:40
backdafuckup a écrit : |
maintenant que j'y pense ... OUI
backdafuckup a écrit : |
Marsh Posté le 18-04-2003 à 10:32:07
polo021 a écrit : |
t'as de la chance, j'ai pas eu le temps de te re
Citation : |
Marsh Posté le 18-04-2003 à 10:39:45
moi j'aurais plutot vu un moyen de capter le crtl + c ou un kill et de le gerer proprement pour fermer le programme.
Marsh Posté le 18-04-2003 à 10:41:54
bezot3 a écrit : moi j'aurais plutot vu un moyen de capter le crtl + c ou un kill et de le gerer proprement pour fermer le programme. |
ou : "pourquoi faire simple quand on peut faire complique"
Marsh Posté le 18-04-2003 à 10:42:07
Alors je connais pas la fonction pour transformer un code ascii en caractère (je m'en souviens plus) :
mais
Code :
|
Marsh Posté le 18-04-2003 à 10:42:24
ReplyMarsh Posté le 18-04-2003 à 10:44:25
backdafuckup a écrit : Alors je connais pas la fonction pour transformer un code ascii en caractère (je m'en souviens plus) :
|
Marsh Posté le 18-04-2003 à 10:48:59
ReplyMarsh Posté le 18-04-2003 à 10:53:54
ben parce que je pense que si tu essayes de capter le ctrl-c dans ton programme, ta fenetre dos sera deja fermee que ton programme aura pas encore reagit
Marsh Posté le 18-04-2003 à 10:54:08
tain, pour une fois que j'essaie de répondre a une question...
Dites moi au moins pourquoi ?
edit : ah ok...
quel con...
Marsh Posté le 18-04-2003 à 10:54:20
Car si ce programme tourne comme un service NT (ou demon unix), alors je n'aurais pas la consolesous la main pour aller faire un ctrl+c ...
Marsh Posté le 18-04-2003 à 10:55:22
backdafuckup a écrit :
|
Euuuh ... Tu compares 'caractere' avec l'adresse de ta chaine qui contient 2 caractères : '^' et 'C' ... Si le Ctrl+C est affiché ^C, ca ne veut pas dire que tu peux faire la même chose dans du code ...
Effectivement, le Ctrl-C envoie un signal de fin de programme que le prog n'est pas obligé de respecter (contrairement au kill -9) ...
Marsh Posté le 18-04-2003 à 10:56:53
oh ca va faut arreter maintenant....
me ridiculisez pas tant que ca...
ya des gens qui les lisent ces posts
Marsh Posté le 18-04-2003 à 10:59:00
bezot3 a écrit : |
Sous NT, les services sont prévus pour dialoguer avec une interface graphique en générale (l'interface étant dans un autre exe ...) Donc tu peux creuser de ce côté là ...
Sinon, pour la gestion des messages du système, ca doit se faire assez facilement, mais mes cours de système se font bien vieux ...
Marsh Posté le 18-04-2003 à 10:59:33
theShOcKwAvE a écrit : |
que veux tu dire par la?
Marsh Posté le 18-04-2003 à 11:02:07
backdafuckup a écrit : oh ca va faut arreter maintenant.... |
Marsh Posté le 18-04-2003 à 11:05:48
polo021 a écrit : |
Je ne suis pas trop sur ... Là, on arrive dans un domaine hors de mes compétences !
Mais il me semble que ctrl-c n'agit pas du tout comme un kill -9 de Linux ... Il me semble que lorsqu'on fait un ctrl-c, le système envoie un 'message' au prog pour lui dire de se fermer (je ne connais pas la forme du dit 'message'
Marsh Posté le 18-04-2003 à 11:07:30
theShOcKwAvE a écrit : |
mais kill -9 aussi est un message ! non ?
Et ya pas énormément de messages de kill (pas plus d'une dizaine je crois)...
Marsh Posté le 18-04-2003 à 11:09:16
theShOcKwAvE a écrit : |
ok. Pour ma part ,quand je parlais de la fermeture de la fenetre dos j'aurais plutot dut dire fermeture du pgm mais bon le principe est le meme, essayer de capter la fermeture du pgm dans le pgm
Enfin voila quoi, resultat on sait toujours pas si bezot3 va faire son truc !arret ou alors se casser la tete pour rien
Marsh Posté le 18-04-2003 à 11:10:49
polo021 a écrit : |
+1
Marsh Posté le 18-04-2003 à 11:36:43
Dans un premier temp, je fais la methode du !arret, et ensuite je me penche sur la gestion des signaux pour tenter de les capter et de gerer proprement.
Marsh Posté le 18-04-2003 à 11:38:40
bezot3 a écrit : Dans un premier temp, je fais la methode du !arret, et ensuite je me penche sur la gestion des signaux pour tenter de les capter et de gerer proprement. |
je vois pas en quoi le !arret n'est pas propre mais bon,
bon amusement quand meme
Marsh Posté le 18-04-2003 à 11:40:49
C'est loin pour moi tout ca, mais tu dois pouvoir utiliser la fonction "signal", avec par exemple SIGKILL...par contre je suis plus capable d'être plus précis que ca...:lol:
Mais les solutions données plus haut sont qd même vachement + simples...
Marsh Posté le 18-04-2003 à 11:46:48
De la doc ici:
http://www-igm.univ-mlv.fr/~dr/NCS [...] 0000000000
[edit]
à priori tu auras plus besoin de la fonction kill...Enfin ca dépend du comportement que tu veux avoir (arret lors de la pression d'une touche, arret lorsque mavariable == valeurquituelappli, ...)!
Marsh Posté le 18-04-2003 à 12:02:52
skeye a écrit : De la doc ici: |
Je ne suis pas tout à fait sur, mais il me semble qu'il y avait un système plus ou moins équivalent sous DOS ...
Par contre, pour les services NT ......
Marsh Posté le 18-04-2003 à 09:30:27
Bonjour, j'ai ecris un programme c++ qui se lance via ligne de commande (ms dos et unix). Donc pas d'interface graphique. J'ai une boucle while qui tourne pour l'instant sans arret. Mais j'aimerais pouvoir arreter ce programme proprement a n'importe quel moment (si j'avais une interface graphique, j'aurais placer un bouton "stop" et le tour etait joué !). Comment faire ?
Merci.