为什么 `bc` 实用程序不以 `^C` 退出

为什么 `bc` 实用程序不以 `^C` 退出

bc我最近 正在使用该实用程序,并且Ctrl+C不能用于退出该程序。Ctrl+Cinterrupt信号返回消息use quit to exit.我可以使用EOFCtrl+ D)或quit退出。

^Z我读了和之间的区别^C。从技术上讲,^C应该结束程序(大多数程序在收到信号时都会中止interrupt)。但bc返回一条消息,要求我们使用quit

我想知道这有什么特别的优势吗?

答案1

Ctrl+C发送 SIGINT (信号整数爆发(erupt)会使进程中断(换句话说,它会杀死进程)。有些程序可以捕获此信号并忽略它,这就是 的情况bc

Ctrl+字符D 发送 EOT(传输结束)字符。接收此信号的效果与程序读取文件并到达文件末尾的效果类似。实际上,它bc正在等待您告诉它您没有更多输入了。

至于为什么...程序如何退出以及如何与用户交互,则由开发人员来指定

答案2

我想知道这有什么特别的优势吗?

是的。如果您在 bc 中调用一个长时间运行的函数,则可以使用 control+c 来中断它,它不会退出 bc 本身,而是退出 bc 内部运行的函数。

下面是我这样做的一个例子:

$ 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

如果你想看看双胞胎的功能,下载 bc 源代码,并查看示例目录。

答案3

脚本或应用程序可以捕获和阻止事件,因此本质上提供了终止方法。开发人员为什么要这样做,你需要问问自己。


您可以在以下 shell 脚本中看到一个简单的示例:

# Call trapint function when recive SIGINT
trap trapint SIGINT

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

相关内容