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
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.
È 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.
- 1. Come verificare se un descrittore di file ha dati disponibili?
- 2. Come posso determinare se un file è bloccato usando VBS?
- 3. Come posso determinare se un file è vuoto?
- 4. Come determinare se un poliedro è convesso?
- 5. descrittore di socket vs descrittore di file
- 6. Come riaprire un descrittore di file chiuso
- 7. Conversione di PDF ricercabile in un PDF non ricercabile
- 8. Come verificare se un file esiste ancora utilizzando un descrittore di file
- 9. Come verificare se un determinato descrittore di file memorizzato in una variabile è ancora valido?
- 10. Come ottenere un flusso FILE * da un descrittore di file?
- 11. Come ottenere un puntatore FILE da un descrittore di file?
- 12. Come determinare se un tipo è un tipo di collezione?
- 13. fopen crea un descrittore di file?
- 14. Come posso determinare se un file è un file immagine in .NET?
- 15. Come determinare se un handle di file Perl è un handle di lettura o scrittura?
- 16. Script di Bash: determinare se il file è stato modificato?
- 17. Come posso determinare se un determinato file è in realtà un file MP3?
- 18. Come determinare se l'URL è un'immagine?
- 19. Determinare se un tipo è statico
- 20. Come determinare se è in attesa un semaforo di invio?
- 21. Determinare se un carattere è alfabetico
- 22. .NET: come determinare se un oggetto è un oggetto COM?
- 23. C# - come determinare se un tipo è un numero
- 24. ftell su un descrittore di file?
- 25. Come determinare se un file viene ancora trasferito via ftp
- 26. In c, come si può bloccare un descrittore di file?
- 27. Determinare se NSNumber è NaN
- 28. Come determinare se un pacchetto è RTP/RTCP?
- 29. Come determinare se Type è una struct?
- 30. Come determinare se l'assemblaggio è stato annullato?
Dispositivi di blocco, come i dischi rigidi, possono essere cercati. Forse anche i dispositivi dei personaggi, ma non ne sono sicuro. – Thomas
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
True; alcuni device driver di carattere ignorano semplicemente seek() e silenziosamente restituiscono. –