Sind mehrere geschlossene Aufrufe für ein fd in derselben Funktion von Bedeutung?

10

Ich möchte nur wissen, was das Verhalten von zwei aufeinanderfolgenden Schließen auf einem fd ist.

zum Beispiel-

%Vor%

[fd ist ein int]

    
j10 08.10.2012, 13:28
quelle

5 Antworten

12

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

%Vor%

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

    
dasblinkenlight 08.10.2012, 13:32
quelle
7

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.

    
Art 08.10.2012 13:30
quelle
4

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.

    
Guido 30.12.2013 02:46
quelle
3

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.

    
Anirudh Ramanathan 08.10.2012 13:33
quelle
1

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%     
Mario The Spoon 08.10.2012 13:31
quelle

Tags und Links