2014-12-18 17 views
5

Ich wundere mich nur, dass es verschiedene Funktionen in verschiedenen Betriebssystemen gibt, aber sie dienen dem gleichen Zweck, oder es kann gesagt werden, dass verschiedene Betriebssysteme verschiedene Systemprogrammiersprachen haben (wie die von Windows vs. UNIX).Ist die Implementierung von C-Bibliotheken abhängig vom Betriebssystem?

So, zum Beispiel, wie C-Bibliothek besteht aus der Implementierung von Funktionen, ihre Implementierung muss verschiedene Funktionen aufrufen (je nach Betriebssystem), um das gleiche zu implementieren. Ist das richtig? Also, sind Bibliotheken in Cygwin zum Kompilieren von C-Programm speziell für Windows und das von gcc, speziell für Linux? Hab ich recht? Wenn nicht, warum dann?

+0

Diese Frage ist vielleicht nicht so präzise wie es sein sollte, aber ich weiß wirklich nicht, wie ich es besser ausdrücken soll. Bitte, vergib mir. – PalashV

+0

Fragen Sie nach den Standardfunktionen wie 'printf()' oder 'malloc()' oder etwa als 'CreateThread()'? – dhein

+0

Bibliotheken enthalten Funktionen wie 'printf()' usw. und sie benötigen Systemaufrufe für die Implementierung solcher Funktionen. – PalashV

Antwort

4

Ja das ist richtig. Verschiedene Betriebssysteme haben verschiedene Funktionen, die dasselbe tun. Unter Windows beispielsweise erstellen Sie einen Thread, indem Sie CreateThread() aufrufen, während Sie unter Linux pthread_create() aufrufen.

Über die C-Laufzeit implementieren alle Betriebssysteme sie, aber anders. Unter Windows ist ein Wrapper, der CreateFile() aufruft, während unter Linux fopen() ein Wrapper für open() ist.

Cygwin und ähnliche Elemente fügen Bibliotheken hinzu, um die Linux-only-Funktion unter Windows zu implementieren. Zum Beispiel wird Cygwin pthread_create() unter Windows implementieren, indem es CreateThread() wie MS für fopen() umschließt.

+0

Danke, ich hatte gehofft, dass es so etwas sein sollte, aber ich hatte sehr wenig Wissen über Betriebssysteme. – PalashV

+0

"während auf Linux fopen() ist die native Funktion" Sie irren sich. Meintest du open()? – edmz

+0

@black Mein Fehler, ich habe 'open()' vergessen. – ElderBug

1

Ja, du hast es verstanden. Es gibt nicht viel, was ich hinzufügen kann.

Aber so weit ich weiß, dient das OS den Bibliotheken und sie werden nur verbunden. Der Grund dafür ist, dass die Programmierer, die die systemspezifischen Implementierungen entwickeln, ihr eigenes System am besten kennen. Die Implementierung einer ist nicht nur die Festplatte für eine Spur zu ihren Sachen fragen. (Sie wissen wahrscheinlich)

Sie müssen viele Umstände anderer Implementierungen berücksichtigen, die mit Dateideskriptoren arbeiten. Und vielleicht müssen Sie sich darauf verlassen, dass in einer bestimmten Funktion Ihres Betriebssystems etwas passiert, was für das generelle Verhalten nicht erforderlich ist. Aber in deiner Umgebung hält dies alles am Laufen.

Das ist auch der Grund, warum der C-Standard besagt, dass das Ändern des Quellcodes von Standardbibliotheken zu undefiniertem Verhalten führt, selbst wenn die Funktion selbst dasselbe Verhalten hat (versucht, die Cite für Sie zu finden, konnte aber nicht.)

Also bei allem ist eine Optimierung Sache. Es könnte eine allgemeine Implementierung geben, aber da das gesamte Betriebssystem auf diesen Implementierungen basiert, ist jedes Betriebssystem daran interessiert, das Beste für den eigenen Fall zu machen.

(wahrscheinlich nicht der einzige, aber ich bin nicht so tief in der Entwicklung OS als ich einen anderen Namen könnte)

1

Beachten Sie, dass es zwei Arten von Bibliotheksfunktionen: Dienstprogramme und Systemverpackungen. Nehmen wir an, Sie sind ein Anbieter, der versucht, eine portable Bibliothek zu erstellen.

Utility-Funktionen wie sprintf und atoi werden bei jeder Implementierung gleich sein, da sie keine OS-Systemdienste benötigen.

Normalerweise hätten Sie dann eine Abstraktionsschicht in Ihrer Bibliothek. Sie könnten eine Funktion haben, wie

void * getBytesFromOS (unsigned int count) ; 

die Seiten des Speichers zuordnet. Es würde verschiedene Implementierungen für verschiedene Systeme haben.Eine Malloc-Funktion, die eine solche Schnittstelle verwendet, kann zu 99% für alle Betriebssysteme identisch sein.

2

Ja.

Zum Hinzufügen zu ElderBug's answer variieren die C-Bibliotheken, die als Wrapper für verschiedene Arten von Systemaufrufen fungieren, systemübergreifend. Systemaufrufe, wie die folgenden (von NYU's Operating Systems, Lecture #4), verschieben den Prozess vom Benutzermodus in den Supervisor/Kernel-Modus.

Hinweis das Ziel zwischen dem Benutzer-Modus (die Wrapper) und dem Kernel-Modus (das OS‘Implementierung) differenzieren, from the lecture:

Ein wichtiges O Ziel ist es, dass einfache Prozeduraufruf Semantik von a beobachtet werden Benutzerprozeßsichtpunkt. Die Komplexität ist innerhalb des Kerns selbst verborgen, ein weiteres Beispiel des Betriebssystems, das den Benutzerprozessen eine abstraktere, d. H. Einfachere virtuelle Maschine zur Verfügung stellt.

enter image description here

Wie Sie wissen, sind diese Probe Anrufe über verschiedene Betriebssysteme nicht ähnlich wie Windows und Linux, aber die Namen der C-Wrapper-Funktionen sind --otherwise, die vorkompilierte Sprache selbst würde sich über die Systeme unterscheiden.

Hoffe, dass hilft!