Рис. 1 Нажатие два раза CTRL + C в Терминале не работает, но помещает два разрыва строки в командную строку Matlab
Я думаю, что что-то не так с привязками клавиш. Я безуспешно пробовал и Windows, и Emacs. Привязка клавиш работает в системе Mathematica. Debian 8.x поддерживается MathWorks для Matlab, поэтому его следует поддерживать.
exit
. Matlab: 2016a, предварительная версия 2016b
Аппаратное обеспечение: Asus Zenbook UX303UA
ОС: Debian 8.5
Ядро Linux: 4.6 (обратные порты)
По теме: [наконец ничего не нашел; большинство условий связано с условием, когда вы вводите что-то непосредственно в приглашении Matlab]
Сервисный билет MathWorks: 02154064
Значение по умолчанию для Ctrl + C должен послать сигнал SIGINT. Традиционное значение SIGINT - остановить задачу, которая в настоящее время выполняется на переднем плане, и позволить пользователю ввести новый ввод. Я использую задачу в неформальном смысле того, что делает компьютер. Это не обязательно отдельный процесс. В такой программе, как Matlab, которая считывает последовательные команды и обрабатывает их - REPL - SIGINT должен возвращать пользователя к приглашению этой программы, а не убивать программу. Когда задача переднего плана - это программа, которая выполняет одно задание, а затем завершает работу, SIGINT должен убить программу, поскольку это способ вернуть пользователя к приглашению оболочки.
Попробуйте Ctrl + \ . Это посылает сигнал SIGQUIT, и обычное значение SIGQUIT - немедленно выйти и (если система настроена для этого) оставить дамп ядра . Не все программы сохраняют это значение, я не знаю, поддерживает ли это Matlab.
Если ключи сигнала уничтожения не работают, попробуйте Ctrl + Z , чтобы отправить сигнал SIGSTOP, который приостанавливает программу и возвращает вас к приглашению оболочки, где вы можете отправить другое сигнал. Когда вы приостанавливаете задание, оболочка показывает сообщение типа
[1]+ Stopped matlab
. Число в скобках - это номер задания. Вы можете использовать % 1
вместо идентификатора процесса, чтобы отправить сигнал процессу из этой оболочки, например kill% 1
здесь, чтобы отправить SIGTERM (нормальный сигнал уничтожения), и если это не сработает, тогда kill -KILL% 1
(SIGKILL, сигнал уничтожения, который не дает приложение шанс).
Если вы не можете прервать приложение, чтобы получить доступ к оболочке, работающей на этом терминале, уничтожьте его из другой оболочки, работающей в другом терминале.
Ваша оболочка также не умирает, когда вы набираете Ctrl-C. Текущая командная строка отменяется, и вы получаете новое приглашение, вместо того, чтобы оболочка завершала работу и выходила из системы, или возвращалась к предыдущей программе.
Оболочка системных команд, такая как Bash, - это просто программное обеспечение; все, что она может делать, можно запрограммировать на выполнение любой другой оболочки на языке программирования, используя те же методы.
В то время как типичная оболочка языка программирования находится в интерактивном режиме редактирования, TTY находится в необработанном режиме, и Ctrl-C является обычным символом. Действие отмены текущей командной строки может быть реализовано так, как если бы это был специальный тип команды редактирования, привязанный к клавише Ctrl-C.
Кроме того, оболочки некоторых языков программирования позволяют прерывать оценку кода. Обычно это достигается тем, что во время выполнения кода режим TTY восстанавливается до обычных настроек, которые привязывают Ctrl-C к генерации сигнала SIGINT
, который обрабатывается. Каким-то образом обработка переводится в отмену выполняющегося кода. Интерпретатор, написанный на языке C, может выполнить longjmp
в место, заданное с помощью setjmp
интерактивной подсказки. Сам обработчик сигнала SIGINT
может просто установить глобальную переменную, которая говорит "прерывание поднято". Интерпретатор может время от времени проверять эту переменную и превращать ее в исключение. Это позволяет избежать дополнительных сложностей, связанных с выходом из обработчика сигнала.
MATLAB - это не математика; похоже, что программисты MATLAB решили либо заблокировать SIGINT ( ^ C
во время запуска), либо установить специальный обработчик, который испускает новую строку (в режиме командной строки). Это типичное поведение для среды оболочки.