In che modo printf scrive su stdout? [chiuso]

3

Ho cercato una risposta a questo per un paio di giorni, e tutti i risultati che ho trovato riguardano il modo in cui printf accetta un numero arbitrario di argomenti.

In che modo printf scrive su stdout? Qual è il modo più fondamentale per scrivere su un file in C? Come funzionano le librerie standard?

    
posta Josh Williams 21.04.2015 - 19:32
fonte

2 risposte

9

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 ....

    
risposta data 21.04.2015 - 21:58
fonte
6

printf( string, ... ) può essere pensato per (* 1) come% di richiamo interno% co_de che a sua volta può essere pensato come invocazione interna vfprintf( stdout, string, va_list )

L'implementazione di fputs( string, stdout ) è specifica del sistema operativo.

Quindi, (parti delle) librerie standard vengono riscritte su un sistema operativo dal sistema operativo in modo da utilizzare le funzionalità native fornite dal sistema sottostante per raggiungere il loro scopo.

(* 1) Dico "può essere pensato" perché se fa esattamente questo o qualcos'altro che è equivalente a quello specifico dell'implementazione, e nessuno dei nostri interessi.

    
risposta data 21.04.2015 - 19:35
fonte

Leggi altre domande sui tag