Ich bin auf ein Problem gestoßen, bei dem die Funktion open nie zurückkehrt, wenn ich versuche, eine serielle Schnittstelle zu öffnen. Es passiert nicht immer, und das Problem verschwindet für eine Weile, wenn ich meinen USB-Seriell-Adapter abziehe und wieder anschließe. Mein Code sieht wie folgt aus:
fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY);
wobei bsdPfad /dev/cu.KeySerial1 ist. Ich habe versucht, die Option O_NONBLOCK zum Befehl open hinzuzufügen, aber es bleibt immer noch hängen.
Natürlich würde ich gerne verstehen, warum das so ist. Ich glaube, dass, was auch immer das Problem ist, mit O_NONBLOCK sollte open auf jeden Fall zurückkehren, selbst wenn es nicht in der Lage war, den Port zu öffnen. Wenn es nicht in der Lage ist, den Port zu öffnen, sollte fileDescriptor -1 sein und errno gesetzt werden (ich überprüfe dies unmittelbar nach dem Aufruf von open). Natürlich geschieht dies nicht. Ist meine Vermutung falsch? Gibt es einen bekannten Grund dafür, dass open() nie zurückkehrt, selbst wenn O_NONBLOCK angegeben ist, wenn ein Fehler auftritt?
Mit der neuesten Version des Prolific PL-2303-Treibers und einem PL-2303-basierten USB-zu-Seriell-Adapter unter 10.7.2 konnte ich das Problem heute erneut reproduzieren. Ein paar Anmerkungen:
- Aufgehängt im
open()
Aufrufs ist der Prozess nicht unterbrechbar durch Befehl-. (Steuerung-C). - Laufen
ps -avx
zeigt einen Prozessstatuscode von U für den Prozess an. Ich bin mir nicht sicher, was dieser Code bedeutet. Er erscheint nicht in den Manualseiten fürps
gefunden durch Googeln. Es gibt keine Auflistung von Prozessstatuscodes in der Manpage fürps
auf meinem Rechner. Vielleicht ist es spezifisch für die Mac-Version (10.4+?) vonps
? - Ich habe festgestellt, dass bei der Fahrt unmittelbar vor dem ersten Auftreten dieses Problems mein Anruf bei
ioctl()
um die Optionen des Anschlusses wieder in den Zustand zu versetzen, in dem sie waren, bevor ich sie für die Verwendung in meinem Programm geändert habe. Ich musste das Programm beenden (über den Debugger von Xcode). Unmittelbar danach, beim nächsten Start des Programms,open()
hing...