Después de utilizar el extremo esclavo ( open()
, read()
, write()
, close()
), el maestro read()
finaliza y regresa con un error EIO. Pero esperaba poder finalizar open()
/ close()
varias veces el esclavo sin interrumpir el fd maestro.
¿Es posible mantener válidos los dos extremos después del esclavo close()
? ¿Cómo puedo mantener mi programa "maestro" ejecutándose cuando el extremo esclavo está cerrado? ¿Se supone que debo volver a ejecutar la grantpt(); unlockpt(); ptsname();
secuencia completa?
Respuesta1
Corto: no
Largo: una conexión esclava pseudo-terminal es un extremo de unaconexión, como una pipa. Ambas son formas en que los datos pasan de un lado a otro entre procesos de usuario a través del kernel.
Una vez que se cierra un extremo, se pierde la conexión. La ptsname
descripción en POSIX dice:
En caso de error,
ptsname()
devolverá un puntero nulo. Esto podría ocurrir si fildes es undescriptor de archivo no válidoo si el nombre del dispositivo esclavo no existe en el sistema de archivos.
Una vez que cierra un descriptor de archivo, no es válido.
Si desea reutilizar una conexión, puede encontrar alguna solución, como pasar el descriptor del archivo esclavo abierto a un proceso recién creado, por ejemplo, desde una aplicación de servidor que escribe para administrar los descriptores del archivo esclavo.
Otras lecturas:
- 7.2 Pseudo terminales(Terminal de texto CÓMO)
close
- cerrar un descriptor de archivo(POSIX)grantpt
- conceder acceso al dispositivo pseudoterminal esclavo(POSIX)pipe
- crear un canal entre procesos(POSIX)ptsname
- obtener el nombre del dispositivo pseudoterminal esclavo(POSIX)unlockpt
- desbloquear un par pseudo-terminal maestro/esclavo(POSIX)
Lo anterior fue escrito en 2016. Un comentario de 2022 mencionaTIOCGPTPEER, que es un ioctl
código que permite a una aplicación obtener unnuevodescriptor de archivo:
(desde Linux 4.13) Dado un descriptor de archivo en fd que hace referencia a un pseudoterminal maestro, ábralo (con los indicadores de estilo open(2) dados) y devuelva un nuevo descriptor de archivo que haga referencia al dispositivo esclavo pseudoterminal del mismo nivel. Esta operación se puede realizar independientemente de si se puede acceder a la ruta del dispositivo esclavo a través del espacio de nombres de montaje del proceso de llamada.
(El descriptor de archivo cerrado aún no es válido).
Respuesta2
Por comentario sobre la otra respuesta: Sí, de hecho.
Cuando cree el par pty, haga que su proceso final maestro abra el extremo esclavo y manténgalo abierto. De esa manera, no importa cuántos clientes abran y cierren el esclavo, su recuento de referencias nunca llega a cero y nunca deja de ser válido.