/ / ¿En qué se diferencia el lanzamiento de `less` del lanzamiento de` cat` en ZSH con respecto al uso de la pantalla alternativa y la suspensión de fondo - terminal, señales, zsh, terminal-emulador, menos unix

¿En qué se diferencia el lanzamiento de `less` del lanzamiento de` cat` en ZSH con respecto al uso de la pantalla alternativa y la suspensión de fondo - terminal, señales, zsh, terminal-emulador, menos unix

Tenga en cuenta conmigo, esta pregunta tiene un poco de una configuración.

En mi sistema operativo, por defecto, ZSH tiene la -tostop (o es el tty?).

Esto permite que los procesos en segundo plano salgan al shell cuando tienen salida.

Por lo tanto:

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

Correspondientemente

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

Leyendo la documentación y experimentando un poco, descubrí que ZSH tiene 4 tipos de procesos suspendidos (puede ver esto usando 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

Esto implicaría que el 3888 El proceso está recibiendo una señal SIGTTOU.

Todo esto tiene sentido.

Ahora mi pregunta es que, ¿por qué es eso? less no se ve afectado por stty tostop o 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

Como se puede ver en ambos casos, less Siempre se está suspendiendo en el fondo.

Ahora, se sobre less -X, y también conozco la característica de pantalla alternativa que tienen los emuladores de terminal. De hecho, puede ejecutar los 2 comandos anteriores con less -X, y resulta en el mismo tipo de suspensión. Aunque -X hace que no use pantallas alternativas, menos se consigue suspended (tty output)!

Lo que quiero saber es la mecánica real de cómo less siempre es suspendido con suspended (tty output), incluso cuando tostop se está cambiando, e incluso cuando -X Se está alternando también. ¿Cómo puede estar enviando siempre la shell? SIGTTOU a less, a menos que haya alguna otra manera less esta siendo suspendido

Respuestas

1 para la respuesta № 1

(usted no especifica su sistema operativo, pero esta respuesta se basa en Linux)

Utilizando strace puedes ver stty haciendo un ioctl en fd 0 (stdin) alternando un bit en el c_lflag Valor de la estructura termios.

strace tambien revela que less abrirá /dev/tty y emitir un ioctl en él para cambiar el c_lflag.

Asi que less simplemente hace lo mismo que stty tostop Antes de emitir cualquier cosa.