Unterschied zwischen C-Standardbibliothek und C-POSIX-Bibliothek


73

Ich bin ein wenig verwirrt von "C Standard Lib" und "C POSIX Lib", weil ich festgestellt habe, dass viele in "C POSIX Lib" definierte Header-Dateien auch Teil von "C Standard Lib" sind.

Ich gehe also davon aus, dass "C standard lib" eine von der ANSI C-Organisation definierte Bibliothek ist und auf verschiedenen Plattformen (Win32 / Unix-ähnlich) unterschiedliche Implementierungen vorhanden sind und "C POSIX lib" nur eine Implementierung für "C standard" ist lib "unter Unix-ähnlichen Betriebssystemen, richtig?

Aber "C POSIX lib" enthält einige Header nicht angegeben in "C Standard lib", wie <sys/types.h>, <sys/wait.h>und <pthread.h>.

Nehmen wir <pthread.h>als Beispiel, ich nehme an, das Gegenstück zu "C standard lib" ist <threads.h>. Wenn ich dann ein Multithread-Programm unter Linux schreiben möchte, welche Header-Datei sollte ich einschließen, <pthread.h>oder <threads.h>?


9
ANSI C ist seit 1990 veraltet, als C zum internationalen Standard wurde. Seitdem wird C von einer ISO-Arbeitsgruppe gepflegt .
Lundin

5
@ Lundin Total Unsinn. ANSI C ist nichts anderes als veraltet. Tatsächlich wurde C11 von INCITS als ANSI-Standard übernommen, der als INCITS / ISO / IEC 9899-2012 bekannt ist und der neue ANSI C-Standard ist.
Wiz

2
@Wiz Es ist ein internationaler Standard und dies ist eine internationale Seite. In diesem Sinne hat es keinen Sinn gemacht, seit 1990 über ANSI C zu sprechen. Es ist das gleiche, als würde ich C auf dieser Site als "SS C" bezeichnen, da ich aus Schweden und dem schwedischen Standard stamme heißt SS / ISO / IEC 9899.
Lundin

2
@Lundin Während die Leute konsequent denken, dass 'ANSI C' bedeutet, dass C89 es nicht wahr macht; insbesondere als ANSI C 2012 C11 verabschiedete; wodurch "ANSI C" C11 bedeutet. Egal wie viele Leute denken, dass es nicht so ist.
Wiz

10
@Wiz Sie verpassen den Punkt. Für das internationale Publikum war es nur sinnvoll, von 1989 bis 1990, als der ISO-Standard veröffentlicht wurde, von ANSI C zu sprechen. So sind informell C89 und ANSI C synonym geworden, obwohl ANSI noch heute ISO-Standards übernimmt. Aber seit 1990 ist es den Menschen außerhalb der USA egal, was das American National Standard Institute vorhat.
Lundin

Antworten:


53

POSIX ist eine Obermenge der Standard-C-Bibliothek, und es ist wichtig zu beachten, dass es sich davon unterscheidet. Wenn C und POSIX jemals in Konflikt geraten, gewinnt C.

Sockets, Dateideskriptoren, gemeinsam genutzter Speicher usw. sind Teil von POSIX, jedoch nicht in der C-Bibliothek vorhanden.

pthread.hwird für POSIX-Threads verwendet und threads.hist ein neuer Header für C11 und Teil der C-Bibliothek. Möglicherweise werden pthreads irgendwann in der Zukunft zugunsten der C-Threads veraltet sein, aber Sie können sich wahrscheinlich noch nicht darauf verlassen, dass C11 weit verbreitet ist. Wenn Sie Portabilität wünschen, sollten Sie daher vorerst pthreads bevorzugen. Wenn die Portabilität keine Rolle spielt und Sie C11-Threads zur Verfügung haben, sollten Sie diese wahrscheinlich verwenden.


Beispielsweise wird signal.h sowohl in en.wikipedia.org/wiki/C_standard_library als auch in en.wikipedia.org/wiki/C_POSIX_library erwähnt . Aber ich verstehe immer noch nicht. Ist signal.ha Header der Standard C Bibliothek oder ist es nur in POSIX Systemen verfügbar?
Koray Tugay

2
@KorayTugay Der beste Weg, dies herauszufinden, ist IMO, auf die POSIX-Webseite zu gehen und nach signal.h zu suchen . Es wird darauf hingewiesen, dass der Header in der C-Standardbibliothek vorhanden ist, POSIX sich jedoch darauf erstreckt. Erweiterungen sind mit gekennzeichnet CX. Es heißt, Sie müssen eine Definition hinzufügen, aber normalerweise werden die Erweiterungen durch die Standard-Compiler-Flags aktiviert. Eine andere Möglichkeit ist das Lesen des C-Standards .
Per Johansson

Ich denke nicht, dass Pthreads zugunsten von C11-Threads veraltet sein werden, zumal C11-Threads (mit Ausnahme eines unwichtigen Details) eine richtige Teilmenge von Pthreads sind.
Fuz

@Alcott - Um @Per Johansson eine großartige Antwort hinzuzufügen, kann man, soweit ich weiß, "berücksichtigen", dass der C-Standard "minimale" Betriebssystemfähigkeiten voraussetzt und somit beispielsweise davon ausgeht, dass nur ein einziger Prozess ausgeführt wird das System, daher gibt es "keine Notwendigkeit" (keine Definition) für Header wie <semaphore.h>, <pthread.h>und so weiter (dennoch sollte ich beachten, dass spätere Versionen von C, soweit ich weiß, C11, <thread.h>Definition enthält ).
Guy Avraham

@PerJohansson Wie nennt man den Teil der POSIX C-Bibliothek, der nicht die Standard-C-Bibliothek ist?
Tim

11

Die C POSIX- Bibliothek ist eine Spezifikation einer C-Standardbibliothek für POSIX-Systeme. Es wurde zeitgleich mit dem ANSI C-Standard entwickelt. Es wurden einige Anstrengungen unternommen, um POSIX mit Standard C kompatibel zu machen. POSIX enthält zusätzliche Funktionen zu den in Standard C eingeführten.


5

POSIX 7 Zitat

http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap01.html#tag_14_01

1.1 Beziehung zu anderen formalen Standards

Es wurde große Sorgfalt darauf verwendet, dass dieses Volumen von POSIX.1-2008 vollständig den folgenden Standards entspricht:

ISO C (1999) ISO / IEC 9899: 1999, Programmiersprachen - C, einschließlich ISO / IEC 9899: 1999 / Cor.1: 2001 (E), ISO / IEC 9899: 1999 / Cor.2: 2004 (E), und ISO / IEC 9899: 1999 / Cor.3.

Auf Teile der Norm ISO / IEC 9899: 1999 (im Folgenden als ISO C-Norm bezeichnet) wird verwiesen, um die Anforderungen zu beschreiben, die auch in diesem Band von POSIX.1-2008 vorgeschrieben sind. Einige Funktionen und Header, die in diesem Band von POSIX.1-2008 enthalten sind, haben eine Version im ISO C-Standard. In diesem Fall werden entsprechend CX-Markierungen hinzugefügt, um anzuzeigen, wo der ISO C-Standard erweitert wurde (siehe Codes). Jeder Konflikt zwischen diesem Band von POSIX.1-2008 und dem ISO C-Standard ist unbeabsichtigt.

Ich habe einige wichtige API-Erweiterungen aufgelistet unter: Ich habe nie wirklich verstanden: Was ist POSIX?


0

ANSI C lebt noch, denke ich: ANSI C wird von ISO C, Cxx geerbt und erweitert. POSIX hat ANSI C absolut befolgt. "

Wir können ANSI C unter Windows, Unix-ähnlichen, eingebetteten Geräten einfach schreiben. Cxx oder POSIX können jedoch Probleme haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.