которые отправляют SIGINT в процесс переднего плана, когда нажимают ctrl+c, драйвер tty или оболочку

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

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


person yuanjianpeng    schedule 12.02.2020    source источник
comment
Ядро не заботится о оболочках. Оболочка — это просто еще один процесс, если речь идет о ядре.   -  person Ian Abbott    schedule 12.02.2020


Ответы (1)


Драйвер 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;
        }
    }
person that other guy    schedule 12.02.2020
comment
но как драйвер tty может знать идентификатор группы процессов переднего плана. Shell является родителем этого процесса переднего плана, только родитель знает эту информацию. - person yuanjianpeng; 13.02.2020
comment
Оболочка информирует ядро ​​о том, что представляет собой группа процессов переднего плана с помощью tcsetpgrp(3). В дополнение к направлению сигналов это то, что позволяет драйверу tty останавливать фоновые задания, которые пытаются потреблять ввод tty. См. часть Реализация оболочки Документация ГНУ. - person that other guy; 13.02.2020
comment
Получил, большое спасибо, теперь очень понятно. - person yuanjianpeng; 13.02.2020