Al livello più basso possibile da un programma utente in esecuzione in alcuni sistemi operativi , la libc sta facendo chiamate di sistema (o syscalls). Si tratta spesso di una singola istruzione macchina (spesso SYSCALL
o SYSENTER
) a cui vengono dati alcuni parametri e che commuta il microprocessore a modalità supervisore in modo controllato. Quindi il kernel sta elaborando i parametri e gestendo il syscall e infine tornando allo spazio utente. Per Linux, potresti leggere il suo Assembly HowTo e x86-64 ABI spec.
BTW, potresti installare Linux e studiare il codice sorgente di qualche libc. Nota che musl-libc è abbastanza leggibile.
Naturalmente i syscalls (e il protocollo per invocarli) sono specifici del sistema operativo. Potresti leggere syscalls (2) per ottenere un elenco di essi (per Linux).
printf
(e puts
) alla fine invocheranno scrivi (2) syscall. Per motivi di prestazioni, <stdio.h>
è di buffering.
Si noti che printf
è standardizzato in C99 (uno standard di linguaggio di programmazione) ma write
è standardizzato nel POSIX Interfaccia del sistema operativo portatile standard (ma Microsoft Windows non è conforme a POSIX).
Spesso, printf
non chiama fputs
, ma userà qualche syscall (come write
su Linux). A proposito, alcune implementazioni (in particolare il GCC compilatore e GNU libc con le sue% built-in __builtin__snprintf*
note da /usr/include/bits/stdio2.h
incluse da <stdio.h>
) sono in grado di ottimizzare alcune semplici chiamate a printf
in chiamate a puts
....