Por que o utilitário 'bc' não sai com '^ C'?

2

Eu estava usando o utilitário bc recentemente e Ctrl + C não pode ser usado para sair do programa. Ctrl O sinal interrupt do C é retornado com a mensagem use quit to exit. eu posso usar EOF ( Ctrl + D ) ou quit para sair.

Eu li a diferença entre ^Z e ^C . Tecnicamente, ^C deve terminar o programa (e a maioria dos programas é interrompida ao receber o sinal interrupt ). Mas bc retorna uma mensagem solicitando que usemos quit .

Eu queria saber se há uma vantagem específica nisso?

    
por Darshan Chaudhary 26.09.2015 / 16:44

3 respostas

3
Ctrl + C envia SIGINT (sinal int erupção), o que faz com que um processo seja interrompido (em outras palavras, ele mata o processo ). Alguns programas podem capturar este sinal e ignorá-lo, como é o caso de bc .

O caractere Ctrl + D envia o caractere EOT (fim da transmissão). Receber este sinal tem um efeito semelhante ao de um programa que estava lendo um arquivo e chegou ao final desse arquivo. Efetivamente, bc está esperando que você diga que você não tem mais informações para dar.

Quanto ao porquê. . . Cabe aos desenvolvedores especificar como o programa sai e como ele interage com os usuários

    
por Sergiy Kolodyazhnyy 26.09.2015 / 17:17
3
  

Eu queria saber se há uma vantagem específica nisso?

Sim. Se você chamar uma função de execução longa em bc, poderá interrompê-la usando control + c e ela não sairá da bc, mas a função será executada dentro de bc.

Aqui está um exemplo de mim fazendo isso:

$ 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

Se você quiser ver a função de gêmeos, faça o download do código-fonte bc e procure no diretório Exemplos.

    
por user455034 27.09.2015 / 00:16
1

Um script ou aplicativo pode capturar e impedir eventos e, assim, oferecer intrinsecamente métodos de terminação. Por que os desenvolvedores fizeram isso, você precisa se perguntar.

Você pode ver um exemplo simples no seguinte script de shell:

# Call trapint function when recive SIGINT
trap trapint SIGINT

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

    
por A.B. 26.09.2015 / 16:49