Un buon punto di partenza sarebbe POSIX. La specifica POSIX 2008 è disponibile on-line qui:
http://pubs.opengroup.org/onlinepubs/9699919799/
è più accessibile (ma a volte meno rigorosa) rispetto allo standard C, e copre molto di più che lo standard C, vale a dire la maggior parte delle parti standardizzate di Librerie standard dei sistemi Unix.
Se si è interessati alle implementazioni, la prima cosa da tenere presente è che il comportamento descritto da POSIX viene solitamente diviso (per necessità e motivi pragmatici) tra l'implementazione del kernel e l'implementazione libc dello spazio utente. Un gran numero di funzioni in POSIX (e alcune dello standard C) saranno semplicemente wrapper per "system calls", cioè transizioni in kernelspace per soddisfare la richiesta. Su alcune implementazioni di libc, anche trovare questi wrapper sarà difficile, dato che spesso vengono generati automaticamente dagli script di build e/o unificati in un singolo file di linguaggio assembly.
Il principale (quantità significativa di codice non-kernel) sottosistemi della libreria standard sono generalmente:
- stdio: In glibc, ciò viene realizzato dalla libreria GNU libio, che è un'implementazione unificata di C iostream di stdio e C++, ottimizzati in modo che nessuno dei due debba essere rallentato essendo un wrapper per l'altro. È un grosso problema e il codice è difficile da trovare e seguire. Altre implementazioni (in particolare i BSD, ma anche altre libbie su Linux) sono molto più semplici e chiare da leggere. Alla fine si basano sulle funzioni di IO del descrittore di file sottostanti come
open
, read
, ecc.
- Thread POSIX: su glibc e su moderno uClibc, questo è NPTL. Non ho familiarità con le implementazioni dei thread di BSD. Altre librerie di Linux mancano di thread o forniscono le loro implementazioni basate principalmente su Linux
clone
e sulle syscalls futex
.
- Libreria matematica: in definitiva, quasi tutti si basano sul vecchio codice matematico Sun dei primi anni '90, ma sono molto divergenti. Fdlibm è una buona approssimazione di base del codice usato nelle libc moderne.
- Ricerca utente, gruppo, nome host (DNS), ecc. Questa viene gestita tramite libnss in glibc e direttamente nella maggior parte delle altre libbie.
- regolare espressione e glob corrispondenza
- Tempo di spedizione
- Locale e la conversione charset
- Malloc
Se si desidera iniziare la lettura di fonti fuso orario, consiglio che non inizia con glibc. È molto grande e ingombrante. Se vuoi leggere glibc, tieni presente che un sacco di codice si nasconde sotto gli alberi sysdeps ed è organizzato in base alla diversità dei sistemi a cui è applicabile.
dietlibc è abbastanza leggibile, ma se leggete la sua fonte, essere consapevoli del fatto che è pieno di errori comuni di programmazione C (per esempio usando int
in cui è necessario size_t
, non controllare per overflow, ecc). Se si tiene presente questo, potrebbe non essere una cattiva scelta, dal momento che ignorare un sacco di possibili errori/fallimenti tende a rendere il codice molto semplice.
Detto questo, per la lettura della sorgente di libc, consiglierei uno dei BSD o musl (disclaimer: io sono l'autore principale di musl quindi sono un po 'di parte). I BSD hanno anche il vantaggio che il codice kernelspace è anche estremamente semplice e leggibile, quindi se vuoi leggere il codice del kernel sull'altro lato di una chiamata di sistema, puoi farlo anche tu.
Riapri. Chiudere unilateralmente questo era un abuso del potere dei moderatori. Credo che questa domanda sia perfettamente ragionevole, disponibile nel formato SO, e infatti ho una risposta che mi è stata impedita di pubblicare dalla sfortunata decisione unilaterale di chiudere. –
@R ..: Giusto, sembra che la domanda sia ora aperta, taggandoti qui così ricevi una notifica e vedi che la domanda è stata riaperta =) – cha0site
@ cha0site: Grazie! –