Linux中Ctrl+Alt+Del的含义和执行的命令是什么?

Linux中Ctrl+Alt+Del的含义和执行的命令是什么?

在我的 Ubuntu 12.04 的 gnome GUI 桌面中,Ctrl++将注销而不是重新启动。AltDelete

但有人告诉我

切换到基于文本的虚拟控制台并按下 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 后来也效仿,将 ++ 转变CtrlAlt安全Delete密钥输入模式*。

对于 X,它类似地挂钩击键,但它只是kill显示服务器(如果您使用显示管理器,它将自动重生)。

某些系统(也许是所有系统,我有一段时间没有尝试过)您仍然可以在操作系统加载之前按Ctrl+ Alt+来触发 BIOS 重置。Delete


*我不确定他们实际上叫它什么。

答案2

Linux 内核可以硬重启或通过 Ctrl + Alt + Del 向 init 进程发送 SIGINT

Linux 内核本身允许 Ctrl-Alt-Del 执行两种可能的行为:

  • 立即重新启动
  • 向 init 进程发送 SIGINT

可以通过以下任一方式选择使用哪种行为:

  • reboot系统调用,参见man 2 reboot
  • /proc/sys/kernel/ctrl-alt-del

因此,如果启用了 SIGINT 行为,则 Ctrl + Alt + Del 的结果完全取决于 init 具有的 SIGINT 处理程序。

例如,BusyBox' 1.28.3 init 执行任意命令,/etc/inittab如下所示:

::ctrlaltdel:/sbin/reboot

这是 uclibc 的一个最小的有趣的 C 示例:

#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

切换目标

默认情况下,在 2 秒内按组合键 7 次以上(如按住)将强制立即重新启动(或指定的操作CtrlAltDelBurstAction)。

也很有用kbrequest.target,但默认情况下不启用。

相关内容