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.