Qual è la differenza tra “le chiamate di sistema C” e “routine di libreria C”?
Domanda
Non ci sono più sezioni nelle pagine di manuale. Due di loro sono:
2 Unix and C system calls 3 C Library routines for C programs
Per esempio c'è getmntinfo(3)
getfsstat(2)
, entrambi sembrano come fanno lo stesso cosa. Quando si dovrebbe usare, che e qual è la differenza?
Soluzione
Le chiamate di sistema operano funzioni di sistema, come su UNIX, la funzione Le biblioteche sono solo codice di applicazione che non fa parte del sistema operativo e spesso è disponibile su più di un sistema operativo. Sono fondamentalmente la stessa di chiamate di funzione all'interno del vostro programma. La linea può essere un po 'sfocata, ma solo visualizzare le chiamate di sistema come funzionalità a livello di kernel. malloc()
è costruito in cima alla href="http://linux.die.net/man/2/sbrk" rel="noreferrer"> sbrk()
chiamata di sistema
Altri suggerimenti
Le chiamate di sistema sono l'interfaccia tra il codice a livello utente e il kernel. le routine di libreria C sono chiamate di libreria come un altro, hanno appena capita di essere veramente comunemente fornite (più o meno universalmente). Un sacco di routine di libreria standard sono involucri (sottili o di altro tipo) intorno chiamate di sistema, che tende a confondere la linea un po '.
Per quanto quale usare a, come regola generale, utilizzare quello che meglio si adatta alle vostre esigenze.
Biblioteche di funzioni comuni sono costruiti sulla parte superiore dell'interfaccia chiamata di sistema, ma le applicazioni sono liberi di utilizzare entrambi.
Le chiamate di sistema sono come le chiavi di autenticazione che hanno l'accesso per utilizzare le risorse del kernel.
sopra di immagine da avanzate di programmazione Linux e aiuta a capire come le applicazioni degli utenti interagiscono con il kernel.
Le chiamate descritte nella sezione 2 del manuale sono tutti involucri relativamente sottili in tutto le chiamate reali ai servizi di sistema che trappola per il kernel. I C routine di libreria standard descritto nella sezione 3 del manuale sono funzioni di libreria client-side che possono o non possono effettivamente utilizzare le chiamate di sistema.
Questo intervento ha una descrizione delle chiamate di sistema e cattura al kernel (in un contesto leggermente differente) e spiega il meccanismo sottostante dietro sistema chiama con alcuni riferimenti.
Come regola generale, è necessario utilizzare sempre la versione della libreria C. Spesso hanno wrapper che gestiscono le cose esoteriche come riavviato su un segnale (se è stato chiesto che). Ciò è particolarmente vero se si è già collegato con la libreria. Tutte le regole hanno motivi per essere infrante. Motivi per utilizzare le chiamate dirette,
- Vuoi essere
libc
agnostica; Magari con un programma di installazione. Tale codice potrebbe funzionare su Android ( bionico ), uClibc , e sistemi più tradizionali glibc / EGLIBC, a prescindere dalla libreria utilizzata. Inoltre, il caricamento dinamico con wrapper per fare un / strato di Bionic runtime glibc permettendo un doppio binario Android / Linux. - Devi prestazioni estreme. Anche se questo è probabilmente rara e molto probabilmente sbagliata. Probabilmente ripensare il problema darà migliori vantaggi di prestazioni e non di chiamare il sistema è spesso una vittoria prestazione che il
libc
occasionalmente può fare. - Si sta scrivendo alcune
initramfs
o un codiceinit
senza una biblioteca; per creare un'immagine più piccola o più veloce l'avvio. - Si sta testando un nuovo kernel / platform e non si vuole complicare la vita con un file system in piena regola; molto simile al
initramfs
. - Si vuole fare qualcosa di molto rapidamente all'avvio del programma, ma alla fine si desidera utilizzare le routine
libc
. - Per evitare un bug noto nella
libc
. - La funzionalità non è disponibile tramite
libc
.
Siamo spiacenti, la maggior parte degli esempi sono Linux specifica, ma razionali dovrebbe valere per altre varianti di Unix. L'ultima voce è abbastanza comune quando le nuove funzionalità vengono introdotte in un kernel. Per esempio, quando kqueue
o epoll
dove introdotto prima, non vi era alcuna libc
a loro sostegno. Questo può accadere anche se il sistema dispone di una libreria vecchio, ma un kernel più recente e si desidera utilizzare questa funzionalità.
Se il processo non ha utilizzato il libc
, quindi molto probabilmente qualcosa nel sistema avrà. Codificando le proprie varianti, è possibile negare la cache, fornendo due percorsi per lo stesso obiettivo finale. Inoltre, Unix
condivideranno le pagine di codice tra i processi. In generale non v'è alcuna ragione per non utilizzare la versione libc
.
Altre risposte hanno già fatto un lavoro stellare sulla differenza tra le chiamate libc
e di sistema.