Pregunta:
Tengo la 1ª edición del libro El entorno de programación Unix. En el capítulo 2, los autores afirman que los directorios se pueden leer como archivos y mencionan algunos datos sobre el formato de estos archivos. Dan algunos ejemplos de uso como cat .
(en el ejercicio 2-2).
Al menos en Darwin, los directorios ya no se pueden leer como archivos. Al menos, parecen ser archivos de longitud cero cuando se leen.
¿Cuándo ocurrió este cambio y hay alguna documentación oficial al respecto?
Respuesta:
La referencia del número de error de la última especificación POSIX (POSIX.1-2008) indica:
[EISDIR]
Es un directorio. Se intentó abrir un directorio con el modo de escritura especificado.
Esto significa que, en un sistema operativo compatible con POSIX, debería poder leer () un directorio si lo abrió de solo lectura (O_RDONLY).
Acabo de probar esto en una caja de NetBSD (que realmente se preocupa por POSIX) y funciona como se esperaba, mientras que falla en GNU / Linux con EISDIR (lo cual no debería suceder).
Un vistazo rápido a Linux muestra que esto está previsto ( http://lxr.free-electrons.com/source/fs/libfs.c#L189 ):
ssize_t generic_read_dir(struct file *filp, char __user *buf, size_t siz, loff_t *ppos)
{
return -EISDIR;
}
Si bien una implementación de un sistema de archivos concreto puede anularlo (como lo hace CEPH: http://lxr.free-electrons.com/source/fs/ceph/dir.c#L1142 ), el comportamiento predeterminado es devolver EISDIR cada vez que alguien intenta read () un directorio, incluso si está abierto de solo lectura.
He rastreado este cambio hasta 2.0.x, y al menos para el sistema de archivos ext2, este seguía siendo el caso.
Entonces, sí, en un sistema operativo compatible con POSIX debería poder leer un directorio, pero algunos núcleos (como Linux y, aparentemente, otros) simplemente ignoran esta condición y rompen el estándar.