在我的 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 后来也效仿,将 ++ 转变Ctrl为Alt安全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
,但默认情况下不启用。