/ / Как се стартира "малко" от стартирането на "cat" в ZSH по отношение на използването на алтернативен екран и фоново окачване - терминал, сигнали, zsh, терминален емулатор, less-unix

Как се стартира "по-малко" се различава от стартирането на "котка" в ZSH по отношение на използването на алтернативен екран и фоново окачване - терминал, сигнали, zsh, терминален емулатор, по-малко UNIX

Моля, голи с мен, този въпрос има малко настройка.

По моята операционна система по подразбиране 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 стойност на termios struct.

strace също разкрива това less ще отвори /dev/tty и издаване на ioctl на него, за да промените c_lflag.

Така less просто прави същото като stty tostop преди да изведете нищо.