为什么在 Debian 8.5 中 Matlab 2016a 无法被终端的 CTRL-C 杀死?

为什么在 Debian 8.5 中 Matlab 2016a 无法被终端的 CTRL-C 杀死?

图1 在Terminal中按两次CTRL+C没有反应,但在Matlab的命令行中出现两个换行符

在此输入图像描述

我认为按键绑定有问题。我尝试过 Windows 和 Emacs,但均未成功。键绑定在 Mathematica 中有效。 MathWorks for Matlab 支持 Debian 8.x,因此应该支持它。

相关条件

  1. 在Matlab的提示符下输入CTRL+C不回车但换行
  2. ...

差分解决方案

  1. 打开 Matlab 的提示符并输入exit.
  2. 打开系统监控器并向 M​​atlab 发出终止和/或强制终止信号

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处理程序本身可能只是设置一个全局变量,表示“引发中断”。解释器可能会不时检查该变量并将其转换为异常。这避免了跳出信号处理程序所增加的复杂性。

相关内容