Нажатие в Cто время Ctrlкак нажато посылает нажатие клавиши, сопровождаемое событием отпускания клавиши X11, к эмулятору терминала.
После этого события (обычно нажатия клавиши) эмулятор терминала записывает 0x3 byte ( ^C
) в свой файловый дескриптор на главной стороне псевдо-tty устройства.
Если isig
настройка termios устройства intr
включена и если настройка установлена на этот байт 0x3, то ядро отправляет сигнал SIGINT всем членам группы процессов переднего плана терминального устройства (еще один атрибут, хранящийся в pty устройстве). В этом случае байт 0x3 не будет доступен для чтения на ведомой стороне pty.
Обычно это интерактивные оболочки, которые создают группы процессов (с setpgid()
) для заданий оболочки и решают, какую из них поместить на передний план (с помощью, tcsetpgrp()
чтобы установить этот атрибут устройства pty) или нет.
Например, когда вы запускаете по приглашению интерактивной оболочки:
foo | bar
Оболочка запускает новые группы процессов с двумя процессами (в которых она выполняется foo
и bar
после подключения их stdin / out к каналу) и помещает эту группу на передний план. Оба процесса получили бы SIGINT, если вы нажали Ctrl-C.
В:
foo | bar &
То же самое, но группа процессов не помещается на передний план (и оболочка также не ждет этого, чтобы вы могли вводить другие команды). Эти процессы не получат SIGINT при Ctrl-C, но могут быть приостановлены, если они попытаются прочитать с устройства tty.
Дополнительная информация: Каковы обязанности каждого компонента псевдотерминала (PTY) (программное обеспечение, ведущая сторона, ведомая сторона)?