Gibt es einen portablen Weg (auf POSIX-Systemen) zu bestimmen, ob ein Dateideskriptor gesucht werden kann? Mein Gedanke ist, lseek(fd, 0, SEEK_CUR);
zu verwenden und zu überprüfen, ob der Rückgabewert -1 ist, aber ich bin unsicher, ob dies falsche negative oder falsche positive Ergebnisse geben könnte. Die Verwendung von und die Annahme von Annahmen darüber, welche Arten von Dateien gesucht/nicht suchbar sind, klingt nicht nach einer guten Idee. Irgendwelche anderen Ideen?Wie kann festgestellt werden, ob ein Dateideskriptor gesucht werden kann?
Antwort
Die lseek
Methode scheint vernünftig. Es kann sicherlich nicht zu einem falschen Negativ führen - wenn ja, ist etwas ernsthaft falsch mit der Implementierung. Nach dem POSIX spec soll es auch fehlschlagen, wenn der Deskriptor eine Pipe, ein FIFO oder ein Socket ist, also sollten Sie theoretisch auch keine falschen Positive haben. Die einzige Frage ist, wie gut die verschiedenen Systeme den Spezifikationen entsprechen. Es scheint jedoch, dass alle anderen Methoden, was immer sie auch sein mögen, auf jeden Fall weniger tragbar sind.
Sie können fstat() verwenden, dann das Makro S_ISREG im Modusfeld der Stat-Struktur, um zu prüfen, ob es sich um eine reguläre Datei handelt; eine reguläre Datei, per definiton, ist suchbar, während eine "nicht-reguläre" (spezielle) Datei möglicherweise nicht vorhanden ist (ich weiß nicht, ob es spezielle Dateien gibt, die auch gesucht werden können).
Aber ja, überprüfen Sie den Rückgabewert von lseek() und errno == ESPIPE sollte auch funktionieren. Im Prinzip the effect of lseek() on devices which are incapable of seeking is implementation-defined, also hüte dich vor Nasendämonen.
- 1. Wie kann festgestellt werden, ob PHPUnit-Tests ausgeführt werden?
- 2. Wie kann festgestellt werden, ob ein Netzwerkadapter kabellos ist?
- 3. Wie kann festgestellt werden, ob ein entferntes Netzwerkgerät verfügbar ist?
- 4. Kann festgestellt werden, ob ein UII-Bild dehnbar ist?
- 5. Kann festgestellt werden, ob ein Objekt zur Laufzeit verfügbar ist?
- 6. Wie kann festgestellt werden, ob der CKEditor geladen ist?
- 7. Wie kann festgestellt werden, ob das OAuth-Token abgelaufen ist?
- 8. Wie kann festgestellt werden, ob eine .NET-Ausnahme behandelt wird?
- 9. Wie kann festgestellt werden, ob eine Internetverbindung verfügbar ist?
- 10. Wie kann festgestellt werden, ob die Montage durchgeführt wurde?
- 11. Wie kann festgestellt werden, ob VSTO 2010 Runtime installiert ist?
- 12. Bereich kann nicht gesucht werden
- 13. Kann festgestellt werden, ob sich die SIM/Telefonnummer geändert hat?
- 14. Kann festgestellt werden, ob ViewController als Modal dargestellt wird?
- 15. Wie kann festgestellt werden, ob ein NSSet Berührungen für ein bestimmtes Steuerelement enthält?
- 16. Medienelement kann nicht in Silverlight gesucht werden
- 17. Array kann nicht nach indexOf() gesucht werden
- 18. Überprüfung, ob ein Zeiger freigegeben werden kann
- 19. Wie kann festgestellt werden, ob eine Instanz um ein Ruby-Modul erweitert wurde?
- 20. Wie kann festgestellt werden, ob ein Laufwerk im Netzwerk installiert ist?
- 21. Wie kann festgestellt werden, ob ein Ereignis mit einer API von Drittanbietern (C#) abgeschlossen wurde?
- 22. Wie kann festgestellt werden, ob ein Verzeichnis mit Java remote gemountet wird?
- 23. Wie kann festgestellt werden, ob ein Skript beim Start oder manuell ausgeführt wird?
- 24. Wie kann festgestellt werden, ob ein Android-Telefon die Datenverbindung für das Streaming verwendet?
- 25. Wie kann festgestellt werden, ob ein Netzwerkpfad verfügbar ist oder nicht (online oder offline)?
- 26. Wie kann festgestellt werden, ob das JavaScript-Objekt ein Ereignis ist?
- 27. Wie kann am einfachsten festgestellt werden, ob ein Android Wear-Gerät mit dem Telefon verbunden ist?
- 28. Wie kann festgestellt werden, ob ein In-App-Abonnement bei Google Play verlängert wurde?
- 29. Wie kann festgestellt werden, ob in VB.net bereits ein Datensatz existiert?
- 30. ob ein getöteter Kindprozess fortgesetzt werden kann?
Block-Geräte wie Festplatten können gesucht werden. Vielleicht sogar Charaktergeräte, aber ich bin mir nicht sicher. – Thomas
einige Geräte, die nicht wirklich suchbar sind, scheitern nicht an der Suche (unter Linux versuchte jemand, die Suche fehlzuschlagen, entdeckte jedoch Userspace-Apps, die vom Verhalten abhingen ...) – Spudd86
True; Einige Zeichengerätetreiber ignorieren einfach seek() und kehren automatisch zurück. –