(Это попытка прояснить и ответить на вопрос, но улучшения и исправления приветствуются).
Во-первых, давайте удалим sudo
и &
+ fg
из сценария - поскольку они не влияют на работу станции (я предположил, что вы использовали их в основном для получения PID). Тогда возникает вопрос: 1) как процесс, запущенный на переднем плане терминала, получает SIGINT; 2) что меняется, когда терминал является псевдотерминалом, использующим X11 (например, Xterm).
Доставка SIGINT (и SIGQUIT, SIGTSTP) генерируется управляющим драйвером терминала ядра, когда он перехватывает символ CTRL-C, вот почему вы видите SI_KERNEL
в качестве источника.
Это происходит независимо от X11 или псевдотерминалов.
Это хорошо показано в книге "Advanced Programming in the Unix Environment 2nd Edition (APUE2)", рисунок 9.7, страница 272 (я не буду вставлять его сюда из соображений авторского права, но уверен, что его можно найти).
Более подробное объяснение дано на странице 275, раздел "9.8 Управление заданиями".
Соответствующий код ядра Linux, вероятно, следующий:
http://lingrok.org/xref/linux-linus/drivers/tty/n_tty.c#1254
Теперь добавим псевдотерминалы: код ядра psudeo-терминала по-прежнему использует стандартный код терминала (упомянутый выше) - таким образом, когда "ведущая" сторона PTY (X-терминал) получает X11 key-event "CTRL-C" и посылает его ведомому PTY, символ обнаруживается приводом терминала ядра, и он посылает SIGINT группе процессов переднего плана (sudo в вашем случае). Это показано в APUE2, рисунок 19.1 страница 676.
В APUE2 на странице 706 есть небольшой параграф "Генерация сигналов", в котором упоминается, что сигналы могут посылаться непосредственно ведущим PTY с помощью ioctl(2)
(например, http://lingrok.org/xref/linux-linus/drivers/tty/pty.c#482), однако я считаю, что это не тот случай.
Комментарии приветствуются.
Посмотрев ваши комментарии, вы можете попробовать:
rpm -qi --root=/opt atop
Когда вы используете флаг --installroot
для yum
, он использует или создает новую базу данных rpm
в этом расположении. Когда вы запускаете rpm
без флага --root
, он будет смотреть на базу данных по умолчанию rpm
в /var/lib/rpm
, которая ничего не знает о вашей пользовательской установке пакета.
Этот вопрос похож на ваш. Если у вас есть файл rpm, проверьте
rpm -qp /path/to/your/package.rpm
, чтобы узнать, имеет ли пакет имя, отличное от файла rpm.