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 ptsname
Beschreibung 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:
- 7.2 Pseudoterminals(Textterminal-Anleitung)
close
- einen Dateideskriptor schließen(POSIX)grantpt
- Zugriff auf das Slave-Pseudoterminalgerät gewähren(POSIX)pipe
- Erstellen Sie einen Interprozesskanal(POSIX)ptsname
- Namen des Slave-Pseudoterminalgeräts abrufen(POSIX)unlockpt
- Entsperren eines Pseudoterminal-Master/Slave-Paares(POSIX)
Der obige Text wurde 2016 verfasst. Ein Kommentar aus dem Jahr 2022 erwähntTIOCGPTPEER, ein ioctl
Code, 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.