Будь ласка, оголі зі мною, це питання трохи налаштоване.
У моїй ОС за замовчуванням 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
перед тим, як щось вивести.