What is the meaning and command executed on Ctrl+Alt+Del in Linux?

Ctrl+Alt+Delete is actually a "magic" keystroke for the IBM PC-compatible hardware architecture that would call a BIOS reset.

Since this kind of thing is dangerous for a system like Linux the decision was made to hook those keystrokes and do something else instead. This is controlled by init and you can see what it does by looking in /etc/inittab.

On my Debian Squeeze system:

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

Windows NT later followed suit and turned Ctrl+Alt+Delete into the secure key entry mode*.

In the case of X, it is similarly hooking the keystrokes but it simply kills the display server (which will automatically respawn if you're using a display manager).

Some systems (perhaps all, I haven't tried in a while) you can still press Ctrl+Alt+Delete before the OS loads to trigger a BIOS reset.


*I'm not sure what they actually call it.


The Linux kernel can either hard reboot or send SIGINT the init process upon Ctrl + Alt + Del

The Linux kernel itself allows two possible behaviors from Ctrl-Alt-Del:

Which behavior is used can be selected with either:

  • reboot system call, see man 2 reboot
  • /proc/sys/kernel/ctrl-alt-del

Therefore, if the SIGINT behaviour is enabled, then the outcome of Ctrl + Alt + Del depends entirely on the SIGINT handler that your init has.

For example, BusyBox' 1.28.3 init execs an arbitrary command given in /etc/inittab as:

::ctrlaltdel:/sbin/reboot

And here is a minimal interesting C example for 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;
}

Here is an easy setup to try this out.