내 Ubuntu 12.04 gnome GUI 데스크탑에서 Ctrl++는 재부팅하는 대신 로그오프됩니다.AltDelete
그런데 누군가가 나한테 말했어
텍스트 기반 가상 콘솔로 전환하고 Ctrl+Alt+Delete를 누르면 컴퓨터가 다시 시작됩니다. 완전히 종료되었다가 다시 시작됩니다. 이는 Alt+SysRq+REISUB보다 훨씬 좋습니다.
Ctrl그렇다면 위의 ++ Alt의 두 가지 다른 의미가 Delete올바른지 알고 싶습니다 .
Ctrl두 경우 모두 ++ Alt는 어떤 명령 에 바인딩됩니까?Delete
답변1
Ctrl+ Alt+ Delete실제로 BIOS 재설정을 호출하는 IBM PC 호환 하드웨어 아키텍처의 "마법" 키 입력입니다.
이런 종류의 일은 Linux와 같은 시스템에서는 위험하기 때문에 이러한 키 입력을 연결하고 다른 작업을 수행하기로 결정했습니다. 이것은 에 의해 제어됩니다 init
. 이를 보면 그것이 무엇을 하는지 알 수 있습니다 /etc/inittab
.
내 Debian Squeeze 시스템에서:
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
나중에 Windows NT도 이에 따라 ++를 보안 키 입력 모드* Ctrl로 변환했습니다 .AltDelete
X의 경우 키 입력을 비슷하게 연결하지만 이는 단지 kill
디스플레이 서버일 뿐입니다(디스플레이 관리자를 사용하면 자동으로 다시 생성됩니다).
일부 시스템(어쩌면 모두, 한동안 시도하지 않았을 수도 있음)에서는 OS가 로드되기 전에 Ctrl+를 눌러 AltBIOS 재설정을 실행할 수 있습니다.Delete
* 실제로 뭐라고 부르는지는 잘 모르겠습니다.
답변2
Linux 커널을 하드 재부팅하거나 Ctrl + Alt + Del을 통해 SIGINT를 init 프로세스로 보낼 수 있습니다.
Linux 커널 자체에서는 Ctrl-Alt-Del이 두 가지 가능한 작업을 수행할 수 있도록 허용합니다.
- 지금 다시 시작
- init 프로세스에 SIGINT 보내기
다음 방법 중 하나로 사용할 동작을 선택할 수 있습니다.
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
다음은 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에 의해 처리됩니다. ctrl-alt-del.target은 기본적으로 Reboot.target에 연결되어 있지만 다른 대상으로 설정할 수 있습니다.
사용 가능한 대상 목록:
systemctl list-unit-files -t target
기본적으로 키 조합을 2초 내에 7번 이상 누르면(예: 길게 누르기) 즉시 다시 시작(또는 지정된 동작 CtrlAltDelBurstAction
)됩니다.
또한 유용 kbrequest.target
하지만 기본적으로 활성화되어 있지 않습니다.