¿Es posible reutilizar el extremo esclavo de un PTY después de cerrarlo?

¿Es posible reutilizar el extremo esclavo de un PTY después de cerrarlo?

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 ptsnamedescripció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:

Lo anterior fue escrito en 2016. Un comentario de 2022 mencionaTIOCGPTPEER, que es un ioctlcó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.

información relacionada