¿Cuándo dejaron de ser legibles los directorios como archivos?

29

Tengo la primera edición del libro The Unix Programming Environment. En el capítulo 2, los autores afirman que los directorios son legibles 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 son legibles como archivos. Al menos, parecen ser archivos de longitud cero cuando se leen.

¿Cuándo ocurrió este cambio? ¿Existe alguna documentación oficial al respecto?

Tyler
fuente
1
Lo recuerdo trabajando en algún momento 1991sep-1995jun en sun solaris. Creo que también dejó de funcionar para mí en algún momento de ese período. Cuando nos pasamos a máquinas sparc con el sistema V. (no recuerdo bien). Probablemente depende del sistema de archivos. Si el sistema de archivos no almacena los datos exactamente como se describe, se romperá a menos que se agregue una capa de compatibilidad. Tampoco funciona hoy usando Debian Gnu + Linux.
ctrl-alt-delor
1
Sé que leer un directorio como un archivo funcionó con Unix System V a fines de los 80 y principios de los 90. Funcionó bajo SunOS. Funcionó bajo algunas versiones de Irix. Creo que ir al sistema de archivos virtual y permitir muchas organizaciones de discos subyacentes significa que realmente no puede soportar esto de manera eficiente.
Bruce Ediger
8
Puede encontrar más información (no autorizada) aquí: utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory
camh
Verifiqué en AIX y Solaris; de hecho, en AIX aún cat .puede hacerlo mientras que en Solaris 11 (como en Linux) no puede. Guay.
gena2x

Respuestas:

13

La referencia del número de error de la última especificación POSIX (POSIX.1-2008) establece:

[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ó solo lectura (O_RDONLY).

Acabo de probar esto en un cuadro de NetBSD (que realmente se preocupa por POSIX), y funciona como se esperaba, mientras falla en GNU / Linux con EISDIR (lo que no debería suceder).

Un vistazo rápido a Linux muestra que esto está destinado ( 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 concreta del sistema de archivos 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 leer () un directorio, incluso si está abierto 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.

Sergio L. Pascual
fuente
66
Según Open Group, el comportamiento de Linux aquí es legal bajo una extensión XSI del estándar . readdir(2)Es más portátil. Eso me sugiere que la respuesta correcta a la pregunta de OP es "Cuando XSI se hizo popular".
Kevin