Qual è la differenza tra “le chiamate di sistema C” e “routine di libreria C”?

StackOverflow https://stackoverflow.com/questions/572942

  •  05-09-2019
  •  | 
  •  

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?

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.

entrare descrizione dell'immagine qui

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

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,

  1. 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.
  2. 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.
  3. Si sta scrivendo alcune initramfs o un codice init senza una biblioteca; per creare un'immagine più piccola o più veloce l'avvio.
  4. 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.
  5. Si vuole fare qualcosa di molto rapidamente all'avvio del programma, ma alla fine si desidera utilizzare le routine libc.
  6. Per evitare un bug noto nella libc.
  7. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top