Je crée un nouveau pseudo-terminal en ouvrant /dev/ptmx avec la fonction open() et les indicateurs O_RDWR | O_NOCTTY | O_NONBLOCK. Ensuite, j'utilise la fonction poll() pour attendre les données entrantes de l'extrémité distante:

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);

Tout fonctionne comme un rêve jusqu'à ce que l'extrémité distante ferme la connexion. Dans un tel cas, la fonction poll() renvoie tout le temps avec l'indicateur POLLHUP revents. C'est par conception, mais que puis-je faire pour le faire fonctionner comme avant, c'est-à-dire attendre qu'un autre processus s'ouvre et utilise le pseudo-terminal. Je veux dire qu'il attend, mais revient immédiatement avec POLLHUP défini. Par contre, si je ferme le descripteur de fichier, je n'ai aucune garantie de recevoir le même pseudo-identifiant de terminal qu'après la réouverture du /dev/ptmx. Existe-t-il un moyen de supprimer l'indicateur de révocation POLLHUP?

J'ai trouvé une question similaire: Poll () sur les retours de tuyaux nommés avec POLLHUP constamment et immédiatement, mais j'utilise déjà O_RDWR comme décrit ici mais cela n'aide pas comme dans le cas des tubes nommés.

0
no one special 8 févr. 2021 à 19:06

1 réponse

Meilleure réponse

Le problème peut être facilement résolu en rouvrant le pseudo-terminal juste après sa création. Le POLLHUP n'apparaîtra pas tant qu'au moins un écrivain existe donc nous pouvons le faire nous-mêmes avec open() et 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 mars 2021 à 20:16