Разница между стандартной библиотекой C и библиотекой C POSIX

Меня немного смущает "C standard lib" и "C POSIX lib", потому что я обнаружил, что многие файлы заголовков, определенные в "C POSIX lib", также являются частью "C стандартной библиотеки".

Итак, я предполагаю, что "C standard lib" - это lib, определяемый организацией ANSI C, и существуют разные реализации на разных платформах (Win32/Unix-like), а "C POSIX lib" - это просто реализация для "C standard lib" на Unix-подобных операционных системах, правильно?

Но "C POSIX lib" содержит некоторые заголовки, не указанные в "C стандартной lib", такие как <sys/types.h>, <sys/wait.h> и <pthread.h>.

Возьмите <pthread.h> в качестве примера, я предполагаю, что его коллега "C стандартной библиотеки" <threads.h>, тогда, если я хочу написать многопоточную программу в Linux, в какой заголовочный файл я должен включить, <pthread.h> или <threads.h>?

Ответ 1

POSIX является надмножеством стандартной библиотеки C, и важно отметить, что он от него зависит. Если C и POSIX когда-либо конфликтуют, C выигрывает.

Сокеты, файловые дескрипторы, разделяемая память и т.д. являются частью POSIX, но не существуют в библиотеке C.

pthread.h используется для потоков POSIX, а threads.h - это новый заголовок для C11 и является частью библиотеки C. Возможно, pthreads будут устаревать в будущем в пользу C, но вы, вероятно, не можете рассчитывать на то, что C11 будет иметь широкое развертывание. Поэтому, если вам нужна переносимость, вы должны теперь использовать pthreads. Если переносимость не вызывает беспокойства, и у вас есть потоки C11, вы, вероятно, должны использовать их.

Ответ 2

Библиотека C POSIX - это спецификация стандартной библиотеки C для систем POSIX. Он был разработан в то же время, что и стандарт ANSI C. Были предприняты определенные усилия для обеспечения совместимости POSIX со стандартом C; POSIX включает дополнительные функции для тех, которые введены в стандартном C.

Ответ 3

POSIX 7 quote

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

1.1 Связь с другими формальными стандартами

Была предпринята большая осторожность, чтобы гарантировать, что этот объем POSIX.1-2008 полностью выровнен со следующими стандартами:

ISO C (1999)     ISO/IEC 9899: 1999, Языки программирования - C, включая ISO/IEC 9899: 1999/Cor.1: 2001 (E), ISO/IEC 9899: 1999/Cor.2: 2004 (E) и ISO/IEC 9899:. 1999/Cor.3

Части стандарта ISO/IEC 9899: 1999 (далее по тексту - стандарт ISO C) относятся к описанию требований, также предусмотренных этим объемом POSIX.1-2008. Некоторые функции и заголовки, включенные в этот том POSIX.1-2008, имеют версию в стандарте ISO C; в этом случае метки CX добавляются, если необходимо, чтобы показать, где стандарт ISO C был расширен (см. коды). Любой конфликт между этим объемом POSIX.1-2008 и стандартом ISO C непреднамерен.

Я перечислил некоторые основные расширения API по адресу: Я никогда не понимал: что такое POSIX?

Ответ 4

"@Lundin Абсолютно чепуха", я согласен с этим комментарием. Мы не можем сказать: "ANSI C устарел, мы должны сказать: ANSI C наследуется и расширяется ISO C, Cxx. POSIX полностью подчиняется ANSI C".

Ответ 5

ANSI C все еще жив, я думаю, должно быть: ANSI C наследуется и расширяется ISO C, Cxx. POSIX полностью подчиняется ANSI C ".

Мы можем легко написать ANSI C для Windows, Unix-Like, встроенного устройства; но Cxx или POSIX могут иметь проблемы.