Creo una nueva pseudo-terminal abriendo /dev/ptmx con la función open() y las banderas O_RDWR | O_NOCTTY | O_NONBLOCK. Luego uso la función poll() para esperar los datos entrantes desde el extremo remoto:

struct pollfd pollFileDescriptors[numberOfTerminals];
for (unsigned terminalIndex = 0; terminalIndex < numberOfTerminals; terminalIndex++) {
    pollFileDescriptors[terminalIndex].fd = terminals[terminalIndex].getFileDescriptor();
    pollFileDescriptors[terminalIndex].events = POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND;
}

int ready = poll(pollFileDescriptors, terminals.getNumberOfTerminals(), timeoutMSec);

Todo funciona como un sueño hasta que el extremo remoto cierra la conexión. En tal caso, la función poll() devuelve todo el tiempo con la bandera POLLHUP revents. Esto es por diseño, sin embargo, ¿qué podría hacer para que funcione como antes, es decir, esperar a que se abra otro proceso y use el pseudo-terminal? Quiero decir, espera, pero regresa inmediatamente con POLLHUP configurado. Por otro lado, si cierro el descriptor de archivo, no tengo garantía de recibir el mismo pseudo-terminal-id que después de volver a abrir el /dev/ptmx. ¿Hay alguna forma de eliminar la marca de revents POLLHUP?

Encontré una pregunta similar: Poll () on Named Pipe regresa con POLLHUP constante e inmediatamente, sin embargo, ya estoy usando O_RDWR como se describe allí pero no ayuda como en el caso de canalizaciones con nombre.

0
no one special 8 feb. 2021 a las 19:06

1 respuesta

La mejor respuesta

El problema se puede resolver fácilmente volviendo a abrir el pseudo-terminal justo después de su creación. El POLLHUP no aparecerá mientras exista al menos un escritor, por lo que podemos hacerlo nosotros mismos con open() y ptsname():

// Create a new pseudo terminal
int fileDescriptor = open("/dev/ptmx", O_RDWR | O_NOCTTY | O_NONBLOCK);
grantpt(fileDescriptor);
unlockpt(fileDescriptor);

// Reopen it for write
const char *targetPath = ptsname(fileDescriptor);
int dummyWriterFileDescriptor = open(fileName.c_str(), O_WRONLY | O_NOCTTY | O_NONBLOCK);
0
no one special 7 mar. 2021 a las 20:16