Натискання Cпри Ctrlнатисканні надсилає натискання клавіші, а потім подія звільнення клавіші X11 на емулятор терміналу.
Після цієї події (як правило, натискання клавіші) емулятор термінала записує 0x3 байт ( ^C
) у свій дескриптор файлів на головній частині псевдо-tty пристрою.
Якщо isig
налаштування терміналу пристрою ввімкнено і якщо для цього 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) (програмне забезпечення, майстер, підлеглий)?