Ist es möglich, das Slave-Ende eines PTY nach dem Schließen wiederzuverwenden?

Ist es möglich, das Slave-Ende eines PTY nach dem Schließen wiederzuverwenden?

Nachdem das Slave-Ende verwendet wurde ( open(),,,,, ) , beendet das Master- Ende und kehrt mit einem EIO-Fehler zurück. Aber ich hatte erwartet read(), das Slave-Ende mehrmals verwenden zu können, ohne das Master-FD zu unterbrechen .write()close()read()open()close()

Ist es möglich, die beiden Enden nach dem Slave gültig zu halten ? Wie kann ich mein „Master“-Programm weiterlaufen lassen, wenn das Slave-Ende geschlossen ist? Soll ich die gesamte Sequenz close()erneut ausführen ?grantpt(); unlockpt(); ptsname();

Antwort1

Kurz: nein

Lang: Eine Pseudo-Terminal-Slave-Verbindung ist ein Ende einesVerbindung, wie eine Pipe. Beides sind Möglichkeiten, Daten über den Kernel zwischen Benutzerprozessen hin und her zu übertragen.

Sobald ein Ende geschlossen ist, verlieren Sie die Verbindung. Die ptsnameBeschreibung in POSIX lautet:

Bei einem Fehler ptsname()wird ein Nullzeiger zurückgegeben. Dies kann vorkommen, wenn fildes einungültiger Dateideskriptoroder wenn der Slave-Gerätename im Dateisystem nicht existiert.

Sobald Sie einen Dateideskriptor schließen, ist er ungültig.

Wenn Sie eine Verbindung wiederverwenden möchten, können Sie das Problem umgehen, indem Sie beispielsweise den geöffneten Slave-Dateideskriptor an einen neu erstellten Prozess übergeben, z. B. von einer Serveranwendung, die Sie zum Verwalten der Slave-Dateideskriptoren schreiben.

Weiterführende Literatur:

Der obige Text wurde 2016 verfasst. Ein Kommentar aus dem Jahr 2022 erwähntTIOCGPTPEER, ein ioctlCode, der es einer Anwendung ermöglicht, einenneuDateideskriptor:

(seit Linux 4.13) Bei einem Dateideskriptor in fd, der auf einen Pseudoterminal-Master verweist, öffnen Sie (mit den angegebenen Flags im Stil von open(2)) einen neuen Dateideskriptor und geben Sie ihn zurück, der auf das Peer-Pseudoterminal-Slave-Gerät verweist. Diese Operation kann unabhängig davon ausgeführt werden, ob der Pfadname des Slave-Geräts über den Mount-Namespace des aufrufenden Prozesses zugänglich ist.

(der geschlossene Dateideskriptor ist immer noch ungültig).

Antwort2

Per Kommentar zur anderen Antwort: Ja, tatsächlich.

Wenn Sie das PTY-Paar erstellen, lassen Sie Ihren Master-Endprozess den Slave-Endprozess öffnen und offen halten. Auf diese Weise geht sein Referenzzähler nie auf Null und wird nie ungültig, egal wie viele Clients den Slave öffnen und schließen.

verwandte Informationen