2010-01-26 17 views
6

Estoy aprendiendo la API POSIX, y no entiendo la lógica detrás de algunos de los nombres.S_IRUSR semántica en POSIX

p. Ej. S_IRUSR, S_IRUSR

¿Qué significa el modelo S? Obtuve que R y W son para lectura y escritura. Pero, ¿qué convención de nomenclatura sigue POSIX? Al igual que Win32 sigue Notación húngara para nombrar, ¿qué sigue POSIX para su nomenclatura? Para estándares como POSIX, debe haber documentación para ello ...

Respuesta

3

El S_ líder es solo para identificar qué estructura/función va la constante.

De <sys/stat.h>, las constantes S_IRUSR, S_IWUSR, etc, son posibles valores para el miembro de st_modestruct stat (utilizado en stat() y amigos). Todos los miembros de struct stat comienzan con el prefijo st_, y hay varias macros relacionadas con stat que también comienzan con S_. La convención está simplemente allí para facilitar la coincidencia de los nombres de las estructuras, los nombres de los miembros y las constantes.

+2

En realidad, la convención tiene otro propósito muy importante. Impide que cosas como '#define mode foo' rompan' struct stat', etc. 'st_ *' está en el espacio de nombres reservado por el encabezado. Sería mucho más problemático si el estándar tuviera que reservar individualmente cada nombre como 'modo '... –

8

No estoy seguro si tienen algún significado, excepto que están en sys/stat.h, por lo que S puede significar "stat".

Intenté hacer un trabajo de detective, por ejemplo, el IEEE Std 1003.1, 2004 Edition entry for sys/stat.h dice esto: Publicado por primera vez en el Issue 1. Derivado del Issue 1 del SVID.

Entonces, el Developer Specs for System V Application Binary Interface (ver Volume 1a [pdf]), página 95, e incluso que tiene nombres que comienzan con S_. No he podido ir más atrás que esto.

Sobre su pregunta en general: gran parte de ella es historia. Por ejemplo, creat() está en POSIX, pero name comes from history. Muchos de los nombres de funciones POSIX (y comportamiento) provienen del estándar C. De hecho, su descripción por lo general tienen text like:

la funcionalidad descrita en esta página de referencia está alineado con el estándar ISO C. Cualquier conflicto entre los requisitos descritos aquí y el estándar ISO C es involuntario. Este volumen de IEEE Std 1003.1-2001 difiere al estándar ISO C.

Creo que la única forma de encontrar alguna lógica detrás de la API POSIX es leer el historial de Unix.

Lo siguiente puede ayudar:

1

Alok es correcta. Ver the specification for sys/stat.h. Si tuviera que escribir su propia implementación de stat()/statvfs() (muy común en los puertos que hacen que los programas que no son de posix funcionen en los hosts de POSIX) lo prefijaría con algo más, es decir, Z_IRUSR.

Aunque no tengo una lista a mano, estoy bastante seguro de que algunas implementaciones de C proporcionan varias opciones para sys/stat, S_ que le da un comportamiento POSIX típico y (X) que le da algo más. No he visto eso en mucho tiempo, sin embargo, por lo que no puedo recordar dónde me encontré.

+0

Introdujo ese enlace como si fuera a respaldar la respuesta de Alok, pero es el mismo que dio Alok, y no veo nada en la especificación que diga * por qué * todos los nombres comienzan con S. Además, ¿por qué? ¿Usarías diferentes nombres en hosts que no sean de Posix? ¿Eso no haría que el código * menos * fuera portátil? –

+0

@Rob Kennedy: Como noté, (ahora recuerden, volveremos cuando se estaba trabajando en la especificación única de UNIX) algunos sistemas implementaron POSIX en la parte superior de sus implementaciones patentadas, por lo que tuvo que usar POSIX deliberadamente para obtener POSIX . Por lo tanto, el espacio de nombres era un factor a tratar. No usaría nombres diferentes en hosts no posix, usaría nombres diferentes en hosts posix. Accidentalmente invertí eso, ¡gracias! –