2010-07-13 19 views
10

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

10

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.

2

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.

+3

Block-Geräte wie Festplatten können gesucht werden. Vielleicht sogar Charaktergeräte, aber ich bin mir nicht sicher. – Thomas

+1

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

+0

True; Einige Zeichengerätetreiber ignorieren einfach seek() und kehren automatisch zurück. –

Verwandte Themen