/ / Чим запуск `менше` відрізняється від запуску` кота` в ZSH щодо використання альтернативного екрану та фонової підвіски - термінал, сигнали, zsh, емулятор терміналу, менше-unix

Як запуск `менш 'відрізняється від запуску` cat `у ZSH щодо використання альтернативного екрана та фонової підвіски - термінал, сигнали, zsh, термінальні емулятори, менш унікальні

Будь ласка, оголі зі мною, це питання трохи налаштоване.

У моїй ОС за замовчуванням ZSH має -tostop (або tty?).

Це дозволяє фоновим процесам виводитись в оболонку, коли вони мають вихід.

Звідси:

> stty -tostop
> echo "random" >/tmp/random
> cat /tmp/random &
[1] 7588
random
[1]  + 7588 done       cat /tmp/random

Відповідно:

> stty tostop
> echo "random" >/tmp/random
> cat /tmp/random &
[1] 3888
[1]  + 3888 suspended (tty output)  cat /tmp/random

Читаючи документацію та трохи експериментуючи, я виявив, що ZSH має 4 типи призупинених процесів (ви можете переконатися в цьому за допомогою kill -$SIGNAL $PID ; jobs):

job state              - signal that gives you job state
suspended              - SIGTSTP
suspended (signal)     - SIGSTOP
suspended (tty input)  - SIGTTIN
suspended (tty output) - SIGTTOU

Це означатиме, що 3888 процес отримує сигнал SIGTTOU.

Це все має сенс.

Тепер моє питання в тому, чому це саме так less не впливає на stty tostop або stty -tostop?

> stty tostop
> less /tmp/random &
[1] 6300
[1]  + 6300 suspended (tty output)  less --LONG-PROMPT --chop-long-lines /tmp/random

> stty -tostop
> less /tmp/random &
[1] 4808
[1]  + 4808 suspended (tty output)  less --LONG-PROMPT --chop-long-lines /tmp/random

Як ви можете бачити в обох випадках, less завжди призупиняється у фоновому режимі.

Тепер я знаю про less -X, а також я знаю про альтернативну функцію екрана, яку мають емулятори терміналів. Насправді ви можете виконати вищезазначені 2 команди за допомогою less -X, і це призводить до такої ж суспензії. Незважаючи на -X робить його не використовувати альтернативні екрани, менше отримує suspended (tty output)!

Що я хочу знати, це справжня механіка того, як less завжди призупинено suspended (tty output), навіть тоді, коли tostop перемикається, і навіть коли -X також перемикається. Як може оболонка завжди відправляти SIGTTOU до less, якщо немає іншого способу less припиняється.

Відповіді:

1 для відповіді № 1

(ви не вказуєте свою ОС, але ця відповідь базується на Linux)

Використовуючи strace ти можеш бачити stty робити ioctl на fd 0 (stdin) перемикання одного біта в c_lflag значення термінової структури.

strace також виявляє, що less відкриється /dev/tty і видати ioctl на ньому змінити c_lflag.

Так less просто робить те саме, що і stty tostop перед тим, як щось вивести.