2010-07-13 16 views
10

Esiste un modo portatile (sui sistemi POSIX) per determinare se un descrittore di file è ricercabile? Il mio pensiero è quello di utilizzare lseek(fd, 0, SEEK_CUR); e verificare se il valore restituito è -1, ma non sono sicuro se questo potrebbe fornire falsi negativi o falsi positivi. Utilizzare fstat e fare ipotesi su quali tipi di file sono ricercabili/non selezionabili non sembra una buona idea. Altre idee?Come determinare se un descrittore di file è ricercabile?

risposta

10

Il metodo lseek sembra ragionevole. Certamente non può causare un falso negativo - se così fosse, qualcosa è seriamente sbagliato nell'implementazione. Inoltre, secondo lo POSIX spec, si suppone che fallisca se il descrittore è una pipe, FIFO o socket, quindi in teoria non si dovrebbero avere falsi positivi. L'unica domanda rimanente è quanto i diversi sistemi siano conformi alle specifiche. Tuttavia, sembra che qualsiasi altro metodo, qualunque essi sia, sarebbe sicuramente meno portabile di questo.

2

È possibile utilizzare fstat(), quindi la macro S_ISREG nel campo Modalità della struttura di stato per verificare se si tratta di un file normale; un file normale, per definiton, è ricercabile mentre un file "non regolare" (speciale) potrebbe non essere (non so se ci sono file speciali che sono anche ricercabili).

Ma sì, controllare anche il valore restituito da lseek() e errno == ESPIPE dovrebbe funzionare. In linea di principio, the effect of lseek() on devices which are incapable of seeking is implementation-defined, quindi fai attenzione ai daemon nasali.

+3

Dispositivi di blocco, come i dischi rigidi, possono essere cercati. Forse anche i dispositivi dei personaggi, ma non ne sono sicuro. – Thomas

+1

alcuni dispositivi che non sono realmente ricercabili non mancherà la ricerca (al leaso su Linux, qualcuno ha cercato di far fallire la ricerca ma ha scoperto app userspace che dipendevano dal comportamento ...) – Spudd86

+0

True; alcuni device driver di carattere ignorano semplicemente seek() e silenziosamente restituiscono. –

Problemi correlati