Вы путаете прерывания, сигналы и планирование задач. Все это очень разные концепции.
Я нажимаю Ctrl + C, как обрабатывается это прерывание?
CTRL + C не имеет ничего , связанного с прерываниями. Это комбинация клавиш, которая перехватывается эмулятором терминала, который затем отправляет сигнал (SIGINT
) текущему запущенному процессу. Доставка сигнала осуществляется с помощью системного вызова kill
(который, вопреки своему названию, не обязательно убивает процесс).
Выполняется ли сначала sh, а тогда прерывание обрабатывается?
Что происходит, когда ваша программа получает сигнал SIGINT
, зависит от конкретного случая c. Программа может зарегистрировать обработчик сигнала и решить, что делать, если он получит определенный сигнал c. Другими словами, это «прерывание», как вы его называете, происходит во время работы процесса : когда сигнал доставляется, ядро временно «приостанавливает» нормальный код процесса, позволяя процессу запустить свой сигнал обработчик, а затем возобновить процесс с того места, где он остановился.
Процесс может регистрировать обработчики только для сигналов, которые можно перехватить (SIGINT
есть). Единственные два сигнала, которые невозможно уловить в Linux, - это SIGKILL
и SIGSTOP
. Если процесс не зарегистрировал обработчик сигнала, обработчик по умолчанию, определенный ядром, выполнит свою работу: для SIGINT
обработчик по умолчанию просто завершает процесс.
См. man 7 signal
для получения дополнительной информации.
Помещается ли A в очередь готовности?
Не существует такой вещи, как «очередь готовности» , Я полагаю, вы имеете в виду очередь выполнения . Если процесс будет остановлен сигналом, он перестанет существовать и будет удален из своей очереди выполнения, поэтому ни одна очередь выполнения больше не будет иметь A.
Если процесс не завершен, он по-прежнему будет существовать в системе, и ядро продолжит выполнять его вместе с другими процессами, выполняемыми на том же процессоре. Для каждого ЦП существует одна очередь выполнения, и планировщик использует ее, чтобы определить, какие процессы и когда запускать. Процессы также можно перемещать из одной очереди выполнения в другую (например, в целях балансировки нагрузки), но это другой topi c.