С сигнал SIGINT в Linux

Вам необходимо удалить файл .Xauthority: Для этого: Введите терминал

sudo rm /home/{USER}/.Xauthority

После этого вы должны перезагрузить вашу систему (с вашей обычной учетной записью).

Если это не сработает, попробуйте войти в систему с учетной записью root

2
02.06.2019, 05:51
2 ответа

Поведение по умолчанию 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, который подсчитывает, сколько раз он был вызван, и завершает программу в третий раз. Вы можете сбросить счетчик, если между ними есть нормальный ввод.

¹ Не эмулятор терминала, а общая часть операционной системы, которая обрабатывает все терминалы.
² Я объясняю только простой случай. Это не трактат о том, как работает драйвер терминала.

9
27.01.2020, 21:49

Вы не можете изменить привязку клавиш в своем коде, поскольку сигнал представляет собой прерывание, сгенерированное программным обеспечением, которое отправляется процессу операционной системой. когда пользователь нажимает 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;
}
4
27.01.2020, 21:49

Теги

Похожие вопросы