Según mi conocimiento, los /dev/pts
archivos se crean para sesiones ssh o telnet.
tty
.
Según mi conocimiento, los /dev/pts
archivos se crean para sesiones ssh o telnet.
tty
.
Respuestas:
Nada se almacena en /dev/pts
. Este sistema de archivos vive puramente en la memoria.
Las entradas en /dev/pts
son pseudo-terminales (pty para abreviar). Los núcleos Unix tienen una noción genérica de terminales . Un terminal proporciona una forma para que las aplicaciones muestren salida y reciban entrada a través de un dispositivo terminal . Un proceso puede tener un terminal de control : para una aplicación en modo texto, así es como interactúa con el usuario.
Los terminales pueden ser terminales de hardware ("tty", abreviatura de "teletipo") o pseudo-terminales ("pty"). Los terminales de hardware están conectados a través de alguna interfaz, como un puerto serie ( ttyS0
, ...) o USB ( ttyUSB0
, ...) o sobre una pantalla y teclado de PC ( tty1
, ...). Los pseudo terminales son proporcionados por un emulador de terminal, que es una aplicación. Algunos tipos de pseudo terminales son:
Si un programa abre un terminal para escribir, la salida de ese programa aparece en el terminal. Es común tener varios programas que salen a un terminal al mismo tiempo, aunque esto puede ser confuso a veces ya que no hay forma de saber qué parte de la salida proviene de qué programa. Los procesos en segundo plano que intentan escribir en su terminal de control pueden suspenderse automáticamente por una señal SIGTTOU .
Si un programa abre un terminal para leer, la entrada del usuario se pasa a ese programa. Si varios programas leen desde el mismo terminal, cada carácter se enruta independientemente a uno de los programas; Esto no es recomendable. Normalmente solo hay un único programa que lee activamente desde el terminal en un momento dado; los programas que intentan leer desde su terminal de control mientras no están en primer plano son suspendidos automáticamente por una señal SIGTTIN .
Para experimentar, corre tty
en un terminal para ver cuál es el dispositivo terminal. Digamos que es /dev/pts/42
. En un shell en otra terminal, ejecute echo hello >/dev/pts/42
: la cadena hello
se mostrará en la otra terminal. Ahora ejecuta cat /dev/pts/42
y escribe la otra terminal. Para eliminar ese cat
comando (que hará que el otro terminal sea difícil de usar), presione Ctrl+ C.
Escribir en otro terminal es ocasionalmente útil para mostrar una notificación; por ejemplo, el write
comando hace eso. La lectura desde otra terminal no se realiza normalmente.
strace
leer el programa de entrada, pero eso es todo.
tostop
indicador tty. Esta bandera no está configurada por defecto. Y estoy corregido en la lectura de otro TTY. Lo probé y funciona, pero es por lectura, no por personaje (cuando se está sentado en un indicador de shell, son lo mismo que los shells leen 1 carácter a la vez). Podría ser bueno aclarar este punto, ya que así es como interpreté su respuesta.
read
llamada solo devolverá caracteres consecutivos (o más bien bytes, debería decir), pero la aplicación no tiene control sobre cuántos bytes read
devolverá una llamada, por lo que no es mejor.
Los archivos en /dev/pts
son "pseudo-ttys". Hasta cierto punto, son como tuberías con nombre, pero también imitan terminales de conexión en serie antiguas, como los VT-100. Los pseudo-ttys hacen el trabajo de transferir bytes del teclado al programa y del programa al dispositivo de salida, lo que suena simple. Pero eso responde a su pregunta explícita: el núcleo no almacena nada, /dev/pts/0
por ejemplo. Solo entran secuencias de bytes desde stdout de un programa conectado a pseudo-tty, y los programas cuyo stdin está conectado a la misma pseudo-tty leen esos bytes.
Los pseudo-ttys también ponen una capa de indirección en esos flujos de bytes. El núcleo puede inspeccionar bytes para valores especiales como "Control-C" o "Control-D" o "Control-U" (que son todos configurables, ver man stty
) y enviar un SIGINT, establecer el final del archivo en stdin, o borrar Una línea en la entrada. También hay una función de almacenamiento intermedio en algún lugar, por lo que mi "no almacena nada" está algo mal, pero solo por unos pocos kilobytes.
El kernel puede inspeccionar los valores de bytes en la salida y hacer cosas como convertir una nueva línea (salto de línea ASCII, LF o "\n"
) en dos bytes, retorno de carro y salto de línea (CRLF o "\r\n"
), o los bytes que requiera un hardware de terminal en serie. La indirección de un pseudo-tty permite la independencia del hardware.
Los pseudo-ttys también permiten todas las " ioctl()
llamadas en baudios establecidas", "establecer paridad", etc. Esto permite que los programas que se escribieron en el día de los VT-100, ADM-3 y Wyse continúen funcionando sin errores. El software, el controlador de dispositivo pseudo-ttys, actúa como hardware.
Los pseudo-ttys pueden ser utilizados por sshd
y telnet
, pero también se usan entre un emulador de terminal (como xterm
o rxvt
) y el shell que generalmente se ejecuta dentro del xterm.
Linux y muchos Unixes tienen pseudo-ttys. El plan 9 no. Los pseudo-ttys son un poco una reliquia, sobrante de los días de los terminales de hardware conectados por cable serie.
/dev/
es un directorio especial para archivos de dispositivo. Estas son abstracciones, no son archivos reales en el disco. El directorio está poblado en el arranque y puede cambiar para reflejar las interfaces de dispositivos existentes, que son creados y destruidos por el núcleo y un demonio de espacio de usuario, udevd
.
Muchos de los dispositivos así representados son virtuales. Esto incluye las entradas en /dev/pts
, que son dispositivos de consola. Es por eso que se crea uno para sesiones remotas; también se crean cuando abre una terminal de GUI local.
Puede abrirlos como archivos, aunque no tiene mucho valor de uso. Para obtener el /dev/pts
nodo al que está conectado su shell, use tty
:
> tty
/dev/pts/4
Ahora cambie a otra consola e intente:
> echo "duck!" > /dev/pts/4
Inteligente. Ahora intenta:
> cat /dev/pts/4
Luego intente y use el shell en / dev / pts / 4. Estás atascado hasta que salgas del cat
otro lado, pero la mayoría de lo que escribes en pts / 4 pasará (por ejemplo, intentando "hola mundo" con el que terminé hl
en pts / 4 y ello word
en la cat
consola).
Mi conjetura aquí es que el dispositivo está recibiendo información del shell y emitiéndola a través del sistema, que es cómo las cosas terminan en la pantalla: el shell no se trata de hardware, el sistema sí. Intenta strace bash
(y mira man strace
si no sabes lo que es); obtienes una ráfaga preliminar de llamadas cuando se inicia bash. Ahora comienza a presionar las teclas:
read(0, "h", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "e", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "y", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
Por cada letra escrita hay una lectura de entrada estándar y una escritura en salida estándar. ¿Pero a qué está conectado el estándar del shell? Ahora pruebe strace
con su terminal GUI: tendrá que averiguar el nombre si no lo sabe, por ejemplo, en KDE konsole
, y gnome-terminal
creo que GNOME tiene el nombre . El resultado de eso strace
es probablemente más críptico: el mío tiene muchos poll()
y recvfrom()
. No veo ninguna escritura, pero si ahora saca el cat
truco de otra terminal, notará que cuando escribe, las pulsaciones de teclas que lee cat no provocan ninguna respuesta en la salida de strace: la terminal no está ' t recibiéndolos. Por lo tanto, la aplicación de terminal GUI y cat compiten para leer desde el mismo dispositivo, en el que el shell está emitiendo.
echo Hello > /dev/pts/1
... Mira lo que pasa, es tu terminal.