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

28

Donc, je jouais sur du Zork 1 et je suis allé copier du texte pour le montrer à un de mes amis, mais j'ai accidentellement oublié de maintenir 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.


la source
Vous souhaitez donc que Ctrl + c empêche la fin de toutes les applications? Cela pourrait cependant être désastreux à l'avenir.
jobin

Réponses:

30

La combinaison de touches Ctrl+ Cenvoie le caractère ^C(valeur d'octet 3). Cela oblige le terminal à envoyer le signal SIGINT au programme exécuté au premier plan¹. L'action conventionnelle pour ce signal est d'interrompre la commande en cours: les programmes conçus pour traiter les commandes successives reviennent à leur invite de niveau supérieur, tandis que les programmes conçus comme une commande par lot unique ou une sortie d'interaction continue. De toute évidence, 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 de terminal générale 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 clés (notamment CtrlZenvoyer SIGSTOP pour suspendre le programme de premier plan) avec la sttycommande. Pour basculer la clé de SIGINT sur Ctrl+ _(dans le terminal actuel):

stty intr '^_'

Pour le désactiver complètement:

stty intr ''

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

stty sane

La clé ne peut pas être une combinaison de touches arbitraire, elle doit être une valeur à un octet. Le sttyparamètre peut être remplacé par les programmes - certains programmes (en particulier les programmes en mode texte plein écran) effectuent leur propre traitement de raccourci clavier.

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

Gilles 'SO- arrête d'être méchant'
la source
32

CTRL+ Cenvoie un signal d'interruption ( SIGINT, qui est le signal numéro 2) à la tâche au premier plan. Vous pouvez désactiver cela en "piégeant" le signal à l'aide de la trap '' 2commande avant de démarrer Zork.

Réactiver CTRL+ C(untrap SIGINT) 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 de désactiver et de réactiver le signal et il est plus facile de démarrer le jeu en tapant simplement zorkdans le terminal.

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

kraxor
la source