2012-04-02 19 views
7

Estoy interesado en el funcionamiento interno de la biblioteca C estándar. Encontré un buen libro sobre una posible implementación, pero estoy buscando una explicación más profunda de toda la biblioteca estándar y los estándares (como POSIX), la definición de estos estándares en la biblioteca estándar.Trabajo interno de la biblioteca estándar C

Los borradores C son muy útiles pero no muy agradables de leer. Hay otra literatura sobre este tema?

  • Standard-Biblioteca-PJ-Plauger 1991
  • FreeBSD
  • GNU hombre
  • C proyecto (s)

Albertus

+7

Vuelva a abrir. Cerrar esto unilateralmente fue un abuso del poder de los moderadores. Creo que esta pregunta es perfectamente razonable, que puede responderse en el formato SO, y de hecho tengo una respuesta que no pude publicar debido a la desafortunada decisión unilateral de cierre. –

+0

@R ..: Bien, parece que la pregunta ahora está abierta, etiquetándote aquí para que recibas una notificación y veas que la pregunta se volvió a abrir =) – cha0site

+0

@ cha0site: ¡Gracias! –

Respuesta

6

Un buen punto de partida sería POSIX. La especificación POSIX 2008 está disponible en línea aquí:

http://pubs.opengroup.org/onlinepubs/9699919799/

es más accesible (pero a veces menos rigurosa) que el estándar de C, y cubre mucho más que el estándar de C, es decir, la mayor parte de las piezas estandarizadas de Bibliotecas estándar de sistemas similares a Unix.

Si le interesan las implementaciones, lo primero que debe tenerse en cuenta es que el comportamiento descrito por POSIX suele estar dividido (por razones de necesidad y pragmáticas) entre la implementación kernel y la implementación libc del espacio de usuario. Una gran cantidad de las funciones en POSIX (y algunas del estándar C) serán meramente envoltorios para "llamadas al sistema", es decir, transiciones al espacio del kernel para atender la solicitud. En algunas implementaciones de libc, incluso la búsqueda de estos contenedores será difícil, ya que a menudo se generan automáticamente mediante los scripts de compilación y/o se unifican en un solo archivo en lenguaje ensamblador.

La principal (cantidad significativa de código no kernel) subsistemas de la biblioteca estándar son generalmente:

  • stdio: En glibc, esto se implementa por la biblioteca del GNU libio, que es una implementación unificada de C stdio y C++ iostream, optimizados para que ninguno de los dos tenga que ralentizarse al ser un contenedor para el otro. Es un gran truco, y el código es difícil de encontrar y seguir. Otras implementaciones (especialmente las BSD, pero también otras bibliotecas en Linux) son mucho más simples y claras de leer. En última instancia, se basan en las funciones subyacentes del descriptor de archivo IO, como open, read, etc.
  • Subprocesos POSIX: En glibc y en uClibc moderno, esto es NPTL. No estoy familiarizado con las implementaciones de subprocesos de los BSD. Otras bibliotecas de Linux carecen de subprocesos o proporcionan sus propias implementaciones basadas principalmente en Linux clone y futex syscalls.
  • Biblioteca de matemáticas: en última instancia, casi todas están basadas en el antiguo código de matemáticas Sun de principios de los 90, pero divergieron mucho. Fdlibm es una buena aproximación de base del código utilizado en libcs ​​modernos.
  • Consultas de usuario, grupo, nombre de host (DNS), etc.: esto se maneja a través de libnss en glibc, y directamente en la mayoría de las otras librerías.
  • regular la expresión y pegote juego
  • Tiempo y gastos de envío
  • configuración regional y la conversión de juego de caracteres
  • Malloc

Si quieres empezar a leer fuentes de zona horaria, recomendaría que no empiezan con glibc. Es muy grande y difícil de manejar. Si desea leer glibc, tenga en cuenta que gran parte del código se esconde debajo de los árboles de sysdeps y está organizado según la diversidad de sistemas a los que se aplica.

dietlibc es bastante fácil de leer, pero si usted lee su fuente, tenga en cuenta que está lleno de errores de programación C comunes (por ejemplo, utilizando int donde se necesita size_t, no la comprobación de los desbordamientos, etc.). Si se tiene esto en cuenta, puede que no sea una mala elección, ya que ignorar muchos errores/fallas posibles hace que el código sea muy simple.

Dicho esto, para leer fuente de libc, recomendaría cualquiera de los BSD o musl (descargo de responsabilidad: soy el principal autor de musl, así que estoy un poco parcial aquí). Los BSD también tienen la ventaja de que el código del kernel es también extremadamente simple y legible, por lo que si desea leer el código del kernel al otro lado de una llamada al sistema, puede hacerlo también.

+0

Hola Gracias por esta interesante respuesta (y desbloqueo). Después de leer un poco de la especificación POSIX, noté que esta documentación es mucho más fácil de leer que el estándar C porque está enfocada en la definición estándar. Para mí, la página fuente/documentación BSD y el proyecto musl-library son dos buenos puntos de partida. El syscall-backend de estas bibliotecas también es interesante. Albertus – swaechter

+0

_unified implementación de C stdio y C++ iostream_ - ¿'g ++' no proporciona su propia implementación 'iostream'? –

+0

@Maxim: Sí, pero está diseñado para que el diseño binario de las clases sea el mismo que el diseño binario de las estructuras en glibc stdio, y los mismos objetos se usan para ambos en este caso ... –

5

En "C: Un Manual de referencia, Quinta Edición "por Harbison & Steele, la segunda parte del libro está dedicada a la biblioteca C Standard (Parte 2: capítulos 10-24).

http://careferencemanual.com

El documento Justificación de C99 no cubría la biblioteca C, pero la norma ANSI C89 Fundamento cubre en su capítulo 4. Hay una copia del documento aquí:

http://www.lysator.liu.se/c/rat/title.html

+0

Hola Gracias por la respuesta, el tema sobre la "definición" C89 es una buena ayuda. – swaechter

Cuestiones relacionadas