Моля, голи с мен, този въпрос има малко настройка.
По моята операционна система по подразбиране 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
преди да изведете нищо.