2010-07-13 14 views
10

¿Hay alguna manera portátil (en sistemas POSIX) para determinar si un descriptor de archivo es buscable? Mi idea es usar lseek(fd, 0, SEEK_CUR); y verificar si el valor de retorno es -1, pero no estoy seguro si esto podría dar falsos negativos o falsos positivos. Usar fstat y hacer suposiciones sobre qué tipos de archivos son buscables/no buscables no parece una buena idea. ¿Alguna otra idea?¿Cómo determinar si un descriptor de archivo es buscable?

Respuesta

10

El método lseek parece razonable. Ciertamente no puede causar un falso negativo; si lo hizo, algo está muy mal con la implementación. Además, según el POSIX spec, se supone que falla si el descriptor es un conducto, FIFO o socket, por lo que, en teoría, tampoco debería tener falsos positivos. La única pregunta restante es qué tan bien diferentes sistemas cumplen con las especificaciones. Sin embargo, parece que cualquier otro método, cualquiera que sea, definitivamente sería menos portátil que esto.

2

Puede usar fstat(), luego la macro S_ISREG en el campo de modo de la estructura de estadísticas para comprobar si se trata de un archivo normal; un archivo normal, per definiton, es buscable, mientras que un archivo "no regular" (especial) puede no serlo (no sé si hay archivos especiales que también se pueden buscar).

Pero sí, verificar el valor de retorno de lseek() y errno == ESPIPE también debería funcionar. En principio, the effect of lseek() on devices which are incapable of seeking is implementation-defined, así que ten cuidado con los demonios nasales.

+3

Los dispositivos de bloque, como los discos duros, pueden ser buscables. Tal vez incluso dispositivos de personajes, pero no estoy seguro. – Thomas

+1

algunos dispositivos que no son realmente buscables no fallarán la búsqueda (al menos en Linux, alguien intentó hacer que la búsqueda fallara pero descubrió aplicaciones de espacio de usuario que dependían del comportamiento ...) – Spudd86

+0

Verdadero; algunos controladores de dispositivos de caracteres simplemente ignoran seek() y regresan silenciosamente. –

Cuestiones relacionadas