web-dev-qa-db-fra.com

Empêcher la commande de s'arrêter lorsque vous appuyez sur CTRL + C

Donc, je jouais du Zork 1 et je suis allé copier du texte pour montrer à un de mes amis, mais j’ai oublié de tenir la touche Maj enfoncée en appuyant sur CTRL+C. Cela a arrêté la commande et j'ai perdu mes données Zork ...

Existe-t-il une sorte de "conseil" utile que je peux utiliser pour empêcher l’arrêt de la commande lorsque vous appuyez sur les touches CTRL+C?

Notez que Zork est exécuté à l'intérieur du terminal. C'est un jeu basé sur un terminal dans lequel vous donnez des commandes pour effectuer différentes actions.

27
user288187

La combinaison de touches Ctrl+C envoie le caractère ^C (valeur d'octet 3). Le terminal envoie alors le signal SIGINT au programme exécuté au premier plan¹. L'action classique pour ce signal est d'interrompre la commande en cours: les programmes conçus pour traiter des commandes successives reviennent à leur invite de niveau supérieur, tandis que les programmes conçus sous la forme d'une commande par lot ou d'une interaction en continu se terminent. Évidemment, le programme que vous utilisez a été conçu selon le deuxième modèle.

Cette clé d’envoi de signal est une caractéristique de l’interface générale du terminal dans le noyau, partagée par tous les émulateurs de terminal et les terminaux physiques réels. Vous pouvez configurer la touche qui envoie ce signal, ainsi que d’autres touches (notamment CtrlZ envoyer SIGSTOP pour suspendre le programme de premier plan) avec la commande stty . Pour passer la clé de SIGINT à Ctrl+_ (dans le terminal actuel):

stty intr '^_'

Pour le désactiver complètement:

stty intr ''

Pour rétablir tous les paramètres par défaut:

stty sane

La clé ne peut pas être une combinaison de clés arbitraire, il doit s'agir d'une valeur à un octet. Le paramètre stty peut être remplacé par des programmes - certains programmes (notamment les programmes en mode texte plein écran) effectuent leur propre traitement des raccourcis clavier.

¹ Plus précisément , à tous les processus du premier plangroupe de processus pour lequel le terminal est le terminal de contrôle .

29
Gilles

CTRL + C envoie un signal d'interruption (SIGINTname__, qui est le signal numéro 2) au travail au premier plan. Vous pouvez le désactiver en "capturant" le signal à l'aide de la commande trap '' 2 avant de démarrer Zork.

Réactiver CTRL + C (désarchivez SIGINTname__) avec trap 2.

Astuce: vous pouvez ajouter quelque chose comme ceci à votre ~/.bashrc:

alias zork="(trap '' 2 && cd ~/path/to/zork/ && frotz ZORK1.DAT)"

De cette façon, vous n'oublierez jamais d'activer ou de réactiver le signal et il est plus facile de démarrer le jeu en tapant simplement zorkdans le terminal.

Note: vous pouvez utiliser le nom du signal au lieu du numéro si cela vous convient mieux, à savoir trap '' sigint ou trap '' int. Je suis juste habitué à utiliser les chiffres, par exemple dans kill -9 et autres.

33
kraxor