Как ssh всегда удается сбросить атрибуты терминала?

Если я убегу

strace -e trace=ioctl -v ssh some_remote_host 

Я вижу такую ​​строку:

 ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {c_iflags=0x6006, c_oflags=0x4, c_cflags=0x 4bf, c_lflags=0xa00, c_line=0, c_cc[VMIN]=1, c_cc[VTIME]=0, c_cc="\x03\x1c\x7f\x 15\x04\x00\x01\xff\x11\x13\x1a\xff\x12\x0f\x17\x16\xff\x00\x00"}) = 0 

Что имеет смысл: ssh необходимо изменить множество настроек терминала, например:

  • он отключает ISIG потому что ^ C и ^ Z должны прерывать и приостанавливать процесс на удаленном хосте, а не в процессе ssh выполняемом локально;
  • он отключает ICANON потому что он хочет получать ввод с клавиатуры без буферизации, а не с буферизацией строки;
  • он отключает ECHO потому что, если происходит эхо-сигнал, он должен зависеть от атрибутов, установленных на псевдотерминале удаленного хоста, вместо того, чтобы автоматически возникать на локальном терминале

Если вы выходите из сеанса ssh , исходные атрибуты терминала восстанавливаются вторым ioctl :

 ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {c_iflags=0x6d02, c_oflags=0x5, c_cflags=0x 4bf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\xff\x11\x13\x 1a\xff\x12\x0f\x17\x16\xff\x00\x00"}) = 0 

Но то, что я нахожу странным, заключается в том, что даже если ssh убит с SIGKILL прежде чем у него появится возможность сделать второй вызов ioctl , вы получите исходные атрибуты терминала. В противном случае вы заметите, что что-то очень не так (например, команды, введенные в оболочку, не будут эхом). Как ssh удалось убедиться, что исходные атрибуты терминала восстановлены, даже если не нужно снова звонить ioctl ?

One Solution collect form web for “Как ssh всегда удается сбросить атрибуты терминала?”

Оболочка знает, что ssh умер и может сбросить терминал.

Отслеживание оболочки bash, когда я убиваю дочернего ssh показывает, что он вызывает несколько вызовов ioctl ().

 --- SIGCHLD (Child exited) @ 0 (0) --- ioctl(255, TIOCSPGRP, [52631]) = 0 ioctl(0, TIOCGWINSZ, {ws_row=25, ws_col=147, ws_xpixel=902, ws_ypixel=329}) = 0 ioctl(0, TIOCSWINSZ, {ws_row=25, ws_col=147, ws_xpixel=902, ws_ypixel=329}) = 0 ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {c_iflags=0x500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0 ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {c_iflags=0x400, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a31, c_line=0, c_cc[VMIN]=1, c_cc[VTIME]=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x00\x00\x00\x00"}) = 0 
  • Как (если возможно) я могу закончить конкретный блокиратор, зависающий программой?
  • Как понять вывод трассировки, выполняющей внешнюю команду в фоновом режиме через strace
  • Интерпретация времени, показанного на strace для открытых системных вызовов
  • Как strace знает, как использовать / bin / echo вместо сбоев на встроенном
  • Как можно контролировать монитор?
  • Самый изящный способ прекратить навязчивую программу
  • Как отладить сбой семпла?
  • Как понять вывод трассировки, выполняющий внешнюю команду в bash?
  • strace не находит функцию оболочки с ошибкой «Can not stat»
  • mc медленно запускается
  • где идут данные, записанные в дескриптор файла, который никогда не был открыт
  • Interesting Posts

    Изменение размера изображения заставки экрана KDE

    Создание неформатированного раздела с нераспределенного дискового пространства

    Запуск Apache Httpd во время загрузки с нулевым вмешательством, CentOS и authbind

    Связать ограничение скорости и значения DNS для ответов в секунду и окно

    Сортировка на основе последнего появления символа

    Ошибки Optirun / Primusrun и Steam

    Невозможно получить vim для распознавания unicode

    Автоматическая копия нового ядра для `/ boot / efi` при обновлении ядра

    Удаление строк из файла, который открывается в меньшем режиме

    BareOS резервируется до точки монтирования LVM вместо установленного логического тома LVM?

    Fedora24, пытаясь установить java (JDK)

    Как изменить основной дисплей с двумя экранами Fedora 16?

    Будет ли мой бинарный файл linux работать со всеми дистрибутивами?

    последняя перезагрузка в локальном часовом поясе?

    Установка linux на 32-битной машине UEFI

    Linux и Unix - лучшая ОС в мире.