В моем рабочем столе с графическим интерфейсом GNOME в Ubuntu 12.04 Ctrl++ приводит к выходу из Altсистемы Deleteвместо перезагрузки.
Но мне сказали, что
Переключение на текстовую виртуальную консоль и нажатие Ctrl+Alt+Delete перезагрузит машину. Она выключится чисто и перезагрузится, что намного лучше, чем Alt+SysRq+REISUB.
Поэтому мне интересно , верны ли два приведенных выше разных значения Ctrl+ Alt+ ?Delete
К каким командам Ctrl+ Alt+ Deleteпривязано в этих двух случаях?
решение1
Ctrl+ Alt+ Deleteна самом деле является «волшебной» комбинацией клавиш для аппаратной архитектуры, совместимой с IBM PC, которая вызывает сброс BIOS.
Поскольку подобные вещи опасны для такой системы, как Linux, было принято решение перехватить эти нажатия клавиш и сделать что-то другое. Это контролируется init
и вы можете увидеть, что это делает, заглянув в /etc/inittab
.
На моей системе Debian Squeeze:
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
Позднее Windows NT последовала этому примеру и превратила Ctrl+ Alt+ Deleteв режим безопасного ввода ключа*.
В случае X он аналогичным образом перехватывает нажатия клавиш, но это просто kill
сервер отображения (который автоматически возродится, если вы используете менеджер отображения).
На некоторых системах (возможно, на всех, я давно не пробовал) можно нажать Ctrl+ Alt+ Deleteдо загрузки ОС, чтобы выполнить сброс BIOS.
*Я не уверен, как это на самом деле называется.
решение2
Ядро Linux может либо жестко перезагрузиться, либо отправить сигнал SIGINT процессу инициализации при нажатии Ctrl + Alt + Del
Само ядро Linux допускает два возможных варианта поведения сочетания клавиш Ctrl-Alt-Del:
- перезагрузите немедленно
- отправить SIGINT в процесс init
Выбор используемого поведения можно осуществить одним из следующих способов:
reboot
системный вызов, см.man 2 reboot
/proc/sys/kernel/ctrl-alt-del
Таким образом, если поведение SIGINT включено, то результат нажатия Ctrl + Alt + Del полностью зависит от обработчика SIGINT, имеющегося в вашем init.
Например, BusyBox 1.28.3 init выполняет произвольную команду, заданную /etc/inittab
как:
::ctrlaltdel:/sbin/reboot
А вот минимальный интересный пример на языке C для uclibc:
#define _XOPEN_SOURCE 700
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/reboot.h>
#include <unistd.h>
void signal_handler(int sig) {
write(STDOUT_FILENO, "cad\n", 4);
signal(sig, signal_handler);
}
int main(void) {
int i = 0;
/* Disable the forced reboot, enable sending SIGINT to init. */
reboot(RB_DISABLE_CAD);
signal(SIGINT, signal_handler);
while (1) {
sleep(1);
printf("%d\n", i);
i++;
}
return EXIT_SUCCESS;
}
решение3
Современные дистрибутивы Linux используют systemd
вместо SysV init. Поведение комбинации ctrl-alt-delete обрабатывается ctrl-alt-del.target, которая по умолчанию связана с reboot.target, но может быть установлена на любую другую.
Список доступных целей:
systemctl list-unit-files -t target
Нажатие комбинации 7 и более раз в течение 2 секунд (например, нажатие и удержание) по умолчанию приведет к немедленной перезагрузке (или действию, указанному в CtrlAltDelBurstAction
).
Также есть полезная функция kbrequest.target
, но она не включена по умолчанию.