2009-02-21 10 views

risposta

30

Le chiamate di sistema sono funzioni del sistema operativo, come in UNIX, la funzione malloc() si basa sulla chiamata di sistema sbrk() (per ridimensionare lo spazio di memoria del processo).

Le librerie sono solo codice dell'applicazione che non fa parte del sistema operativo e sarà spesso disponibile su più di un sistema operativo. Sono fondamentalmente le stesse chiamate di funzione all'interno del proprio programma.

La linea può essere un po 'sfocata, ma è sufficiente visualizzare le chiamate di sistema come funzionalità a livello di kernel.

12

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 tutte le altre, solo che sono comunemente fornite (praticamente universalmente). Molte routine di libreria standard sono wrapper (sottili o meno) attorno alle chiamate di sistema, che tendono a sfocare un po 'la linea.

Per quanto riguarda quale utilizzare, come regola generale, utilizzare quello più adatto alle proprie esigenze.

6

Le chiamate descritte nella sezione 2 del manuale sono tutti wrapper relativamente sottili attorno alle chiamate effettive ai servizi di sistema che intercettano il kernel. Le routine di libreria standard C descritte nella sezione 3 del manuale sono funzioni di libreria sul lato client che possono o non possono effettivamente utilizzare le chiamate di sistema.

This posting ha una descrizione delle chiamate di sistema e del trapping al kernel (in un contesto leggermente diverso) e spiega il meccanismo sottostante alle chiamate di sistema con alcuni riferimenti.

11

Le librerie di funzioni comuni sono costruite in cima all'interfaccia di chiamata di sistema, ma le applicazioni sono libere di utilizzarle entrambe.

Le chiamate di sistema sono come chiavi di autenticazione che hanno l'accesso per utilizzare le risorse del kernel.

enter image description here

sopra di immagine da avanzate di programmazione Linux e aiuta a capire come le applicazioni degli utenti interagiscono con il kernel.

+0

foto fantastica. molto chiaro – henryyao

3

Come regola generale, è consigliabile utilizzare sempre la versione della libreria C. Spesso hanno wrapper che gestiscono cose esoteriche come riavvii su un segnale (se richiesto). Questo è particolarmente vero se sei già collegato alla libreria. Tutte le regole hanno dei motivi per essere infrante. Motivi per utilizzare le chiamate dirette,

  1. Si desidera essere libc agnostico; Forse con un programma di installazione. Tale codice potrebbe essere eseguito su Android (bionic), uClibc e più tradizionali sistemi glibc/eglibc, indipendentemente dalla libreria utilizzata. Inoltre, caricamento dinamico con wrapper per creare uno strato glibc/bionico run-time che consente un doppio binario Android/Linux.
  2. Hai bisogno di prestazioni estreme. Anche se questo è probabilmente raro e probabilmente errato.Probabilmente il ripensamento del problema offrirà migliori prestazioni e non chiamando il sistema è spesso una prestazione vincente, che il libc può occasionalmente fare.
  3. Si sta scrivendo del codice initramfs o init senza una libreria; per creare un'immagine più piccola o avviare più velocemente.
  4. Si sta testando un nuovo kernel/piattaforma e non si vuole complicare la vita con un file system completo; molto simile allo initramfs.
  5. Si desidera eseguire un'operazione molto rapidamente all'avvio del programma, ma alla fine si desidera utilizzare le routine libc.
  6. Per evitare un errore noto nello libc.
  7. La funzionalità non è disponibile tramite libc.

Siamo spiacenti, la maggior parte degli esempi sono specifici per Linux, ma i razionali dovrebbero essere applicati ad altre varianti di Unix. L'ultimo elemento è abbastanza comune quando vengono introdotte nuove funzionalità in un kernel. Ad esempio, quando kqueue o epoll in cui è stato introdotto per la prima volta, non era disponibile il libc per supportarli. Questo può accadere anche se il sistema ha una vecchia libreria, ma un kernel più recente e si desidera utilizzare questa funzionalità.

Se il processo non ha utilizzato il libc, molto probabilmente avrà qualcosa nel sistema. Codificando le proprie varianti, è possibile annullare la cache fornendo due percorsi per lo stesso obiettivo finale. Inoltre, Unix condividerà le tabelle codici tra i processi. Generalmente non vi è alcun motivo per non utilizzare la versione libc.

Altre risposte hanno già svolto un lavoro stellare sulla differenza tra libc e le chiamate di sistema.