Вам необходимо удалить файл .Xauthority: Для этого: Введите терминал
sudo rm /home/{USER}/.Xauthority
После этого вы должны перезагрузить вашу систему (с вашей обычной учетной записью).
Если это не сработает, попробуйте войти в систему с учетной записью root
Поведение по умолчанию Ctrl + C представляет собой комбинацию двух вещей. Драйвер терминала¹ не передает это нажатие клавиши, а вместо этого отправляет сигнал SIGINT процессу переднего плана². По умолчанию процесс завершается, когда он получает SIGINT, но процесс может установить обработчик сигнала, а затем он запустит обработчик сигнала, когда получит SIGINT.
Невозможно настроить драйвер терминала для преобразования только третьего Ctrl + C в ряду, чтобы завершить процесс переднего плана. Для этого в программе нужно сосчитать до трех. Есть два способа сделать это, которые будут вести себя по-разному, если пользователь нажмет что-то еще между Ctrl + C .
Один из способов — отключить Ctrl + C поведение посылки сигнала и указание драйверу терминала вместо этого передать его. Вы можете сделать это, вызвавstty intr \^-
из сценария оболочки илиtcsetattr(fd, &termios)
с termios.c_cc[VINTR]
, установленным на _POSIX_VDISABLE
из C. Затем в цикле обработки ввода вашей программы выйдите, когда увидите три Ctrl + C подряд.
Другой способ — установить обработчик сигнала для SIGINT, который подсчитывает, сколько раз он был вызван, и завершает программу в третий раз. Вы можете сбросить счетчик, если между ними есть нормальный ввод.
¹ Не эмулятор терминала, а общая часть операционной системы, которая обрабатывает все терминалы.
² Я объясняю только простой случай. Это не трактат о том, как работает драйвер терминала.
Вы не можете изменить привязку клавиш в своем коде, поскольку сигнал представляет собой прерывание, сгенерированное программным обеспечением, которое отправляется процессу операционной системой. когда пользователь нажимает ctrl -c другим процессом, что-то говорит вашему процессу.
Существует фиксированный набор сигналов, которые можно отправлять процессу. сигналы аналогичны прерываниям, разница в том, что прерывания опосредованы процессором и обрабатываются ядром, в то время как сигналы опосредованы ядром (, возможно, через системные вызовы )и обрабатываются процессами. Ядро может передать прерывание как сигнал процессу, который его вызвал (. Типичными примерами являются SIGSEGV, SIGBUS, SIGILL и SIGFPE ).
вы можете переназначить привязку сигнального ключа на вашем компьютере с помощью stty
Включить Ctrl+C для копирования и Ctrl+Shift+C для прерывания
https://docstore.mik.ua/orelly/unix3/upt/ch05_08.htm
если вы хотите ровно 3 раза Ctrl -c. вы можете считать SIGINT и прерывать программу, когда 3 раза нажимаете ctrl -c. (троекратное нажатие C :CTRL+CCC ).
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void sig_handler(int signo)
{
static int counter=0;
if (signo == SIGINT)
counter++;
printf("received SIGINT %d times\n", counter);
if (counter == 3)
exit(0);
}
int main()
{
if (signal(SIGINT, sig_handler) == SIG_ERR)
printf("\ncan't catch SIGINT\n");
while(1)
sleep(1);
return 0;
}