C标准库和C POSIX库之间的区别


73

我对“ C标准库”和“ C POSIX库”感到有些困惑,因为我发现,“ C POSIX库”中定义的许多头文件也是“ C标准库”的一部分。

因此,我假设“ C standard lib”是由ANSI C组织定义的库,并且在不同平台(类似于Win32 / Unix)上有不同的实现,而“ C POSIX lib”只是“ C standard的实现”类Unix操作系统上的“ lib”,对吗?

但是“C POSIX LIB”包含了一些头在“C标准库”未指定,如<sys/types.h><sys/wait.h><pthread.h>

<pthread.h>为例,我相信它的“C标准库”对应的是<threads.h>,那么如果我想要写在Linux上,这头文件,我应该包括,多线程程序<pthread.h><threads.h>


9
自1990年C成为国际标准以来,ANSI C就已经过时了。从那时起,C由ISO工作组维护。
伦丁

5
@Lundin完全是胡说。ANSI C只是过时的。实际上,INCITS已将C11用作ANSI标准,即新的ANSI C标准,称为INCITS / ISO / IEC 9899-2012
Wiz 2013年

2
@Wiz这是一个国际标准,这是一个国际站点。考虑到这一点,自1990年以来谈论ANSI C一直没有任何意义。这就像我开始将本站点上的C称为“ SS C”一样,因为我来自瑞典和瑞典标准。被称为SS / ISO / IEC9899。–
Lundin

2
@Lundin虽然人们一直认为'ANSI C'意味着C89并不正确;特别是当ANSI C在2012年采用C11时;从而使“ ANSI C”表示C11。无论有多少人可能认为不是。
Wiz 2013年

10
@Wiz您错过了重点。对于国际观众来说,从1989年到1990年ISO标准发布时,只讲ANSI C才有意义。因此,尽管今天ANSI仍采用ISO标准,但非正式地C89和ANSI C已成为同义词。但是自1990年以来,美国境外的人们一直不在乎美国国家标准学会的工作。
隆丁

Answers:


54

POSIX是标准C库的超集,需要注意的是它很重要。如果C和POSIX发生冲突,则C获胜。

套接字,文件描述符,共享内存等都是POSIX的一部分,但在C库中不存在。

pthread.h用于POSIX线程,threads.h是C11的新标头,是C库的一部分。也许将来某个时候将不推荐使用pthread,而推荐使用C线程,但是您可能还不能指望C11能够进行广泛的部署。因此,如果您希望具有可移植性,则现在应该首选pthreads。如果不考虑可移植性,并且您有可用的C11线程,则应该使用那些线程。


例如,在en.wikipedia.org/wiki/C_standard_libraryen.wikipedia.org/wiki/C_POSIX_library中都提到了signal.h 。但是我还是不明白。是标准C库的signal.ha标头,还是仅在POSIX系统中可用?
Koray Tugay 2015年

2
@KorayTugay找出问题的最佳方法是IMO进入POSIX网页并搜索signal.h。将会注意到,标头存在于C标准库中,但是POSIX对其进行了扩展。扩展名标有CX。它说您必须添加一个定义,但是通常扩展是由默认的编译器标志启用的。另一种选择是阅读C标准
Per Johansson 2015年

我认为不赞成使用pthread来支持C11线程,尤其是因为C11线程(除了一个不重要的细节)是pthread的适当子集。
fuz

@Alcott-据我了解,要给@Per Johansson添加一个很好的答案,可以“考虑” C标准“假定最小”的OS功能,因此,例如,假设仅在一个进程上运行系统,因此诸如此类的标头“不需要”(没有定义)<semaphore.h>, <pthread.h>(但是,据我所知,据我所知,C的更高版本C11确实包含<thread.h>定义)。
Guy Avraham

@PerJohansson您怎么称呼POSIX C库的一部分,它不是标准的C库?
蒂姆(Tim)

11

C POSIX库是POSIX系统的C标准库的规范。它是与ANSI C标准同时开发的。已尽力使POSIX与标准C兼容。POSIX包含标准C中引入的功能的附加功能。


5

POSIX 7报价

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?


0

我认为ANSI C仍然存在:ANSI C是由ISO C,Cxx继承和扩展的。POSIX绝对遵守ANSIC。”

我们可以轻松地在Windows,Unix-like,嵌入式设备上编写ANSIC。但是Cxx或POSIX可能有问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.