Wie kann überprüft werden, ob ein bestimmter in einer Variablen gespeicherter Dateideskriptor noch gültig ist?
Ich habe ein file-descriptor, gespeichert in einer Variablen sagen, var. Wie kann ich überprüfen, ob dieser Deskriptor gilt zu einem späteren Zeitpunkt?
fdvar1= open(.....);
fdvar2 = fdvar1; //Please ignore the bad design
....
//lots of loops , conditionals and threads. It can call close(fdvar2) also.
....
if(CheckValid(fdvar1)) //How can I do this check ?
write(fdvar1, ....);
Nun möchte ich prüfen, ob var1 (was immer noch hält die geöffnete Deskriptor) ist immer noch gültig.
Alle API ' s ?
Kommentar zu dem Problem
Warum ist die FD kopiert auf C-Ebene statt auf Betriebssystemebene?
Finden Sie in der Handbuch-Seite zum
dup
. Auch wenn Sie können überprüfen, die Gültigkeit, das Ergebnis ist meist wertlos, denn es ist möglich, dass andere geöffnete Datei erhalten Sie das gleiche descriptor, nachdem das original wurde geschlossen.
Diese wird wie erwähnt in TLPI übung 5.4 Recht deutlich.
InformationsquelleAutor der Frage Lunar Mushrooms | 2012-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
fcntl(fd, F_GETFD)
ist die kanonische billigste Weg, um zu überprüfen, dassfd
ist eine gültige, offene Datei-Deskriptoren. Wenn Sie brauchen, um batch-check-eine Menge, mitpoll
mit einer null-timeout und derevents
member auf 0 gesetzt und die Prüfung fürPOLLNVAL
imrevents
nach gibt es effizienter ist.Mit dieser sagte, die operation "prüfen, ob eine bestimmte Ressource-handle ist immer noch gültig" ist fast immer grundlegend falsch. Nach ein Ressource-handle freigegeben wird (z.B. ein fd ist
close
d), dessen Wert neu zugewiesen werden können, um die nächste solche Ressource, die Sie zuordnen. Wenn es irgendwelche Referenzen, die verwendet werden könnten, die Sie falsch bedienen, die auf die neue Ressource eher als die alte. Also, die richtige Antwort ist vermutlich: Wenn Sie nicht bereits wissen, von der Logik des Programms, haben Sie die große fundamentale logische Fehler, die behoben werden müssen.InformationsquelleAutor der Antwort R..
Können Sie die
fcntl()
Funktion:InformationsquelleAutor der Antwort
Ich glaube nicht, dass es irgendeine Funktion, die Ihnen sagen kann, wenn der descriptor ist immer noch gültig. Der Deskriptor ist in der Regel nur eine kleine ganze Zahl wie 6 und Ihre libc können wählen, um die Wiederverwendung, die Anzahl, wenn Sie die Datei schließen und eine neue öffnen später.
Stattdessen sollten Sie sich überlegen
dup()
kopieren der Datei descriptor. Durch duplizieren der Datei-Deskriptor anstatt das gleiche descriptor in mehreren Orte, es wird vielleicht einfacher für Sie, um zu wissen, ob der Datei-Deskriptor ist immer noch gültig. Sie müssen nur daran denken, zu schließen, sowohl in der ursprünglichen Beschreibung und den dupliziert, wenn Sie fertig sind.InformationsquelleAutor der Antwort David Grayson
Vom diese forum-Artikel:
InformationsquelleAutor der Antwort wbao
Scheint es mir, dass, wenn Sie wissen möchten, ob es noch Punkte, die auf dieselbe Ressource, eine (nicht perfekte) Ansatz wäre es, die
fstat()
den Deskriptor nur nach öffnen und dann später können Sie es wieder tun und die Ergebnisse vergleichen. Beginnen Sie mit.st_mode
&S_IFMT
und gehen von dort aus-ist es ein filesystem-Objekt? Blick auf.st_dev /.st_ino.
Ist es eine Steckdose? Versuchengetsockname()
,getpeername()
. Es wird nicht 100% sicher, aber es kann Ihnen sagen, wenn es ist definitiv nicht das gleiche.InformationsquelleAutor der Antwort John Hascall
löste ich dieses problem für mich. ich weiß nicht, ob es kann verwendet werden, für Allgemeine Zwecke, sondern auch für serielle verbindungen, es funktioniert gut (z.B. /dev/ttyUSB0)!
Für details siehe z.B. Mann Seite http://linux.die.net/man/2/fstat
Cheers,
Flo
InformationsquelleAutor der Antwort flozn