![为什么在 Debian 8.5 中 Matlab 2016a 无法被终端的 CTRL-C 杀死?](https://linux22.com/image/93869/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%20Debian%208.5%20%E4%B8%AD%20Matlab%202016a%20%E6%97%A0%E6%B3%95%E8%A2%AB%E7%BB%88%E7%AB%AF%E7%9A%84%20CTRL-C%20%E6%9D%80%E6%AD%BB%EF%BC%9F.png)
图1 在Terminal中按两次CTRL+C没有反应,但在Matlab的命令行中出现两个换行符
我认为按键绑定有问题。我尝试过 Windows 和 Emacs,但均未成功。键绑定在 Mathematica 中有效。 MathWorks for Matlab 支持 Debian 8.x,因此应该支持它。
相关条件
- 在Matlab的提示符下输入CTRL+C不回车杀但换行
- ...
差分解决方案
- 打开 Matlab 的提示符并输入
exit
. - 打开系统监控器并向 Matlab 发出终止和/或强制终止信号
Matlab:2016a、2016b 预发布
硬件:Asus Zenbook UX303UA
操作系统:Debian 8.5
Linux 内核:4.6(向后移植)
相关:[最终找不到任何东西;大多数情况与您在Matlab提示符中直接键入内容的情况有关]
MathWorks的服务票:02154064
答案1
Ctrl+的默认含义C是发送信号SIGINT。 SIGINT 的常规含义是停止当前在前台运行的任务并让用户提供新的输入。我在用着任务计算机正在执行的任何操作的非正式含义。这不一定是一个单独的过程。在像 Matlab 这样的程序中,读取连续的命令并处理它们 -REPL— SIGINT 应该让用户回到该程序的提示符,而不是终止该程序。当前台任务是一个执行一项工作然后退出的程序时,SIGINT 应该终止该程序,因为这是将用户带回 shell 提示符的方法。
尝试Ctrl+ \。这会发送信号 SIGQUIT,SIGQUIT 的常规含义是立即退出并(如果系统配置了它)留下一个核心转储。不是所有的程序都保留这个意思,我不知道Matlab是否保留这个意思。
如果终止信号键不起作用,请尝试Ctrl+Z发送 SIGSTOP,这会挂起程序并将您带回 shell 提示符,您可以在其中发送一些其他信号。当您暂停作业时,shell 会显示一条消息,例如
[1]+ Stopped matlab
括号内的数字是职位编号。您可以使用%1
而不是进程 ID 从该 shell 向进程发送信号,例如kill %1
在这里发送 SIGTERM (正常终止信号),如果这不起作用,那么kill -KILL %1
(SIGKILL,不给出终止信号的终止信号)申请一次机会)。
如果您无法中断应用程序以到达该终端上运行的 shell,请从另一个终端中运行的另一个 shell 终止它。
答案2
MATLAB 不是数学;而是看来 MATLAB 程序员决定要么阻止 SIGINT(^C
启动期间的 s),要么安装一个发出换行符的自定义处理程序(在命令提示符模式下)。这是 shell 环境的典型行为。
答案3
当您键入 Ctrl-C 时,您的 shell 也不会消失。当前命令行被取消,您会得到一个新的提示符,而不是 shell 终止并注销您,或返回到上一个程序。
像 Bash 这样的系统命令 shell 只是软件;无论它能做什么,任何其他编程语言 shell 都可以使用相同的技术进行编程。
典型的编程语言 shell 处于交互式编辑模式,而 TTY 处于原始模式,并且 Ctrl-C 只是一个普通字符。取消当前命令行的操作可以像绑定到 Ctrl-C 键的特殊类型的编辑命令一样来实现。
此外,一些编程语言 shell 还允许中断代码的计算。这通常是通过在代码运行时将 TTY 模式恢复到通常的设置来实现的,这些设置将 Ctrl-C 映射到信号的生成并SIGINT
进行处理。不知何故,处理被转换为正在运行的代码的取消。用 C 编写的解释器可能会执行到由交互式提示longjmp
设置的位置。setjmp
信号SIGINT
处理程序本身可能只是设置一个全局变量,表示“引发中断”。解释器可能会不时检查该变量并将其转换为异常。这避免了跳出信号处理程序所增加的复杂性。