Der erste Aufruf sollte 0
zurückgeben; Der zweite Aufruf sollte -1
zurückgeben und errno
auf EBADF
setzen.
Sie sollten verhindern, dass der zweite Anruf stattfindet, indem Sie fd
auf eine bekannte ungültige Nummer setzen, z. a -1
unmittelbar nach dem ersten Aufruf von close
und anschließend fd
vor dem zweiten Aufruf prüfen (und nicht aufrufen, wenn fd
-1
ist):
Dieses Codemuster hilft Ihnen, wenn Sie close
von mehreren Orten aus aufrufen müssen, aber Sie sind nicht sicher, ob die Datei geöffnet ist oder bereits geschlossen wurde. Die Übergabe von -1
an close
ist harmlos (Sie würden natürlich eine EBADF
erhalten).
Es sollte harmlos sein, es sei denn Sie sind eingefädelt oder tun etwas zwischen den zwei Aufrufen, um zu schließen. Dann könnten Sie am Ende eine fd schließen, die etwas anderes in Ihrem Programm geöffnet hat.
Die Art und Weise, wie Threading funktioniert, ist, dass Bibliotheken fast immer komische Dinge hinter Ihrem Rücken tun. Libc öffnet Dateien zum Nachschlagen von Fehlermeldungen oder anderen locale-abhängigen Dingen, der Resolver kann Konfigurationsdateien öffnen usw. Wenn Sie einen Dateideskriptor schließen und ihn wieder schließen, können Sie in einer Thread-Umgebung leicht in einer Situation landen, in der die Datei liegt Der Deskriptor wurde von einer Bibliothek wiederverwendet und Sie schließen ihn hinter seinem Rücken.
Das zweimalige Schließen der same -FD sollte nicht-fatal sein, wie andere darauf hingewiesen haben, aber hüte dich vor Code wie diesem
%Vor% Beim zweiten Schließen können Sie nicht sicher sein, ob fd
tatsächlich gleich newfd
ist! Dies würde zu Abstürzen führen, wenn Sie versuchen, newfd
zu verwenden.
Also (wenn es einen Code zwischen den beiden close
Aufrufen gibt), ist es nicht sicher, dies zu tun. Immer close
-Dateideskriptoren genau einmal. Immer free
puffert genau einmal.
Der zweite Aufruf schlägt mit Errno: EBADF
when fehl
Denn bis dahin ist fd kein aktiver Dateideskriptor.
Es sollte keinerlei Auswirkungen auf die Ausführung haben. Wenn jedoch beim ersten Schließen eine Fehlernummer gesetzt wurde, geht diese verloren. Daher sollten Sie den Dateideskriptor nicht zweimal schließen.
Wenn der Wert pf fd gleich bleibt, gibt der zweite Aufruf einen Fehler zurück, dass der fd nicht gültig ist (EBADF - wie dasblinkenlight gezeigt hat)
Denken Sie daran, etwas zu tun
%Vor%