web-dev-qa-db-fra.com

Pourquoi l'utilitaire `bc` ne se termine-t-il pas avec` ^ C`

J'utilisais l'utilitaire bc récemment et Ctrl+C ne peut pas être utilisé pour quitter le programme. Ctrl+CLe signal interrupt est renvoyé avec le message use quit to exit. Je peux utiliser EOF (Ctrl+D) ou quit pour quitter.

J'ai lu la différence entre ^Z et ^C. Techniquement, ^C devrait mettre fin au programme (et la plupart des programmes abandonnent à la réception du signal interrupt). Mais bc renvoie un message nous demandant d’utiliser quit à la place.

Je me demandais s'il y avait un avantage spécifique à cela?

4
Darshan Chaudhary

CtrlC envoie SIGINT (signal int éruption), ce qui rend un processus interrompu (autrement dit, il tue le processus). Certains programmes peuvent attraper ce signal et l'ignorer, comme c'est le cas avec bc.

Le CtrlD caractère envoie EOT (fin de transmission) caractère. La réception de ce signal a le même effet que si un programme lisait un fichier et atteignait la fin de ce fichier. Effectivement, bc attend que vous lui disiez que vous n’avez plus d’entrée à donner.

Quant à pourquoi. . . il appartient aux développeurs de spécifier la manière dont le programme se termine ainsi que la manière dont il interagit avec les utilisateurs

4
Sergiy Kolodyazhnyy

Je me demandais s'il y avait un avantage spécifique à cela?

Oui. Si vous appelez une fonction longue en cours d'exécution dans bc, vous pouvez l'interrompre à l'aide de control + c et elle ne quittera pas bc elle-même mais la fonction s'exécutant à l'intérieur de bc.

Voici un exemple de moi faisant cela:

$ bc twins.b 
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 

typing 'twins (10)' will print all twin primes less than 10.
twins(10000000)
^C
Runtime error (func=primes, adr=113): interrupted execution
Interruption completed.
print "As you can see, bc is still running\n"
As you can see, bc is still running
5+7
12

Si vous voulez voir la fonction twins, téléchargez le code source bc , et regardez dans le répertoire Examples.

5
user455034

Un script ou une application peut intercepter et prévenir des événements et propose donc intrinsèquement des méthodes de terminaison. Pourquoi les développeurs l'ont fait, vous devez vous demander.


Vous pouvez voir un exemple simple dans le script Shell suivant:

# Call trapint function when recive SIGINT
trap trapint SIGINT

# trapint function:
function trapint {
 echo "*** SIGINT received ***"  # Print a message
 exit 0                          # Exit gracefully
}
1
A.B.