2014-12-18 13 views
5

Mi chiedo semplicemente se ci sono diverse funzioni in diversi sistemi operativi, ma hanno lo stesso scopo, oppure si può dire che diversi sistemi operativi hanno linguaggi di programmazione di sistema diversi (come quello di Windows rispetto a quello di UNIX).L'implementazione delle librerie C dipende dal sistema operativo?

Quindi, ad esempio, poiché la libreria C consiste nell'implementazione di funzioni, la loro implementazione deve chiamare funzioni distinte (in base al sistema operativo), per implementare la stessa cosa. È corretto? Quindi, le librerie sono utilizzate in Cygwin per compilare il programma C appositamente scritto per Windows e quello di gcc, specialmente per Linux? Ho ragione? Se no, perché allora?

+0

Questa domanda potrebbe non essere precisa come dovrebbe essere, ma davvero non so come esprimerla meglio. Gentilmente, perdonami. – PalashV

+0

Stai chiedendo le funzioni standard come 'printf()' o 'malloc()' o about thoose come 'CreateThread()'? – dhein

+0

Le librerie contengono funzioni come 'printf()', ecc. E necessitano di chiamate di sistema per l'implementazione di tali funzioni. – PalashV

risposta

4

Sì, è corretto. OS diversi hanno funzioni diverse che fanno la stessa cosa. Ad esempio, su Windows si crea una discussione chiamando CreateThread(), mentre su linux si chiama pthread_create().

Informazioni sul runtime C, tutti i sistemi operativi li implementano, ma in modo diverso. Su Windows, fopen() è un wrapper che chiamerà CreateFile(), mentre su linux fopen() è un wrapper per open().

Cygwin e simili aggiungono librerie per implementare la funzione solo di Linux su Windows. Ad esempio, cygwin implementerà pthread_create() su Windows, avvolgendo CreateThread(), come MS ha fatto per fopen().

+0

Grazie, speravo che fosse qualcosa del genere, ma avevo una conoscenza molto scarsa dei sistemi operativi. – PalashV

+0

"mentre su linux fopen() è la funzione nativa" Ti sbagli. Intendevi open()? – edmz

+0

@black Il mio male, ho dimenticato di 'open()'. – ElderBug

1

Sì, ce l'hai. Non c'è molto che possa aggiungere.

Ma per quanto ne so il sistema operativo sta servendo le librerie e sono appena collegate. Il motivo è che i programmatori che sviluppano le implementazioni specifiche del sistema conoscono meglio il proprio sistema. Implementare un fopen() non è solo chiedere all'Hard Disk una corsia per i suoi contenuti. (probabilmente lo sai)

Devi rispettare molte circostanze di altre implementazioni che funzionano con i descrittori di file. E forse devi fare affidamento su qualcosa che accade in una funzione specifica sul tuo sistema operativo, cosa che per il comportamento dei generani non è necessario. Ma nel tuo ambiente questo continua a funzionare.

Ecco anche il motivo per cui la standard C dice che cambia il codice sorgente di risultati librarys standard in un comportamento indefinito, anche se la funzione è di per sé serve ancora lo stesso comportamento (ha cercato di trovare la citare per voi, ma non era in grado, mi spiace.)

Quindi è una cosa di ottimizzazione. Potrebbe esserci implementazione generante, ma poiché l'intero sistema operativo è basato su tutte le implementazioni, ogni sistema operativo è interessato a farli funzionare al meglio per il proprio caso.

(probabilmente non l'unico, ma io non sono così in profondità nello sviluppo del sistema operativo, come ho potuto nominare un altro)

1

Tenete a mente che ci sono due tipi di funzioni di libreria: utilità e involucri di sistema. Supponiamo che tu sia un fornitore che sta tentando di creare una libreria portatile.

Le funzioni di utilità come sprintf e atoi saranno le stesse su qualsiasi implementazione perché non necessitano di servizi di sistema OS.

In genere si avrebbe un livello di astrazione nella libreria. Potresti avere una funzione come

void * getBytesFromOS (unsigned int count) ; 

che alloca pagine di memoria. Avrebbe implementazioni diverse per vari sistemi.Una funzione malloc che utilizza tale interfaccia potrebbe essere del 99% uguale nei vari sistemi operativi.

2

Sì.

Per aggiungere a ElderBug's answer, le librerie C che fungono da wrapper per diversi tipi di chiamate di sistema variano tra i sistemi. Le chiamate di sistema, ad esempio le seguenti (da NYU's Operating Systems, Lecture #4), spostano il processo dalla modalità utente alla modalità supervisore/kernel.

Nota l'obiettivo di differenziare tra la modalità utente (i wrapper) e la modalità kernel (il sistema operativo' implementazione), from the lecture:

Un importante obiettivo del sistema operativo è così semplice la semantica procedura di chiamata sono osservati da una punto di vista del processo utente. La complessità è nascosta all'interno del kernel stesso, ancora un altro esempio del sistema operativo che fornisce una macchina virtuale più astratta, cioè più semplice, ai processi dell'utente.

enter image description here

Come sapete, queste chiamate di esempio non sono simili tra i diversi sistemi operativi come Windows e Linux, ma i nomi delle funzioni C involucro sono --otherwise, il linguaggio pre-compilato per sé differirebbe tra i vari sistemi.

Spero che questo aiuti!