кто отправляет SIGINT на передний план, когда нажимаете Ctrl + c, драйвер tty или оболочку - PullRequest
1 голос
/ 12 февраля 2020

Когда я нажимаю Ctrl + c, когда оболочка входа в систему выполняет команды, процесс переднего плана уничтожается.
Кто отправляет сигнал?

Отправляет ли TTY-драйвер SIGINT непосредственно группе процессов переднего плана?
Или драйвер TTY отправляет SIGINT в оболочку, а оболочка перенаправляет сигнал в группу процессов переднего плана?

1 Ответ

5 голосов
/ 12 февраля 2020

Драйвер tty (в частности, дисциплина линии) отправит сигнал непосредственно группе процессов переднего плана. Вот код из Linux, где вы можете видеть, что он просто получает группу переднего плана и сигнализирует об этом:

/**
 *  [...]
 *      Called when a signal is being sent due to terminal input.
 *  [...]
 */

static void __isig(int sig, struct tty_struct *tty)
{
        struct pid *tty_pgrp = tty_get_pgrp(tty);
        if (tty_pgrp) {
                kill_pgrp(tty_pgrp, sig, 1);
                put_pid(tty_pgrp);
        }
}

Это вызывается из функции обработки ввода в том же файле где n_tty_receive_signal_char - это всего лишь несколько коротких прыжков от вызова __isig:

/**
 *  [...]
 *  Process an individual character of input received from the driver.
 *  This is serialized with respect to itself by the rules for the
 *  driver above.
 *  [...]
 */

static int
n_tty_receive_char_special(struct tty_struct *tty, unsigned char c)
{
    struct n_tty_data *ldata = tty->disc_data;

    /* [...] */

    if (L_ISIG(tty)) {
        if (c == INTR_CHAR(tty)) {
            n_tty_receive_signal_char(tty, SIGINT, c);
            return 0;
        } else if (c == QUIT_CHAR(tty)) {
            n_tty_receive_signal_char(tty, SIGQUIT, c);
            return 0;
        } else if (c == SUSP_CHAR(tty)) {
            n_tty_receive_signal_char(tty, SIGTSTP, c);
            return 0;
        }
    }
...