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

91
我对"C标准库"和"C POSIX库"有点困惑,因为我发现在"C POSIX库"中定义的许多头文件也是"C标准库"的一部分。
所以,我猜想,"C标准库"是由ANSI C组织定义的库,在不同平台(Win32/类Unix)上有不同的实现,而"C POSIX库"只是Unix-like操作系统上"C标准库"的一个实现,对吗?
但是,"C POSIX库"包含了一些在"C标准库"中没有指定的头文件,比如、和。
以为例,我假设它的"C标准库"对应文件是,那么如果我想在Linux上编写一个多线程程序,我应该包含哪个头文件,还是?

11
自1990年C语言成为国际标准以来,ANSI C已经过时。自那以后,C语言由ISO工作组维护。请注意不要改变原文意思。 - Lundin
7
@Lundin 完全胡说八道。 ANSI C 已经过时了。实际上,C11 已被 INCITS 采纳为一种名为 INCITS/ISO/IEC 9899-2012 的 ANSI 标准,这是新的 ANSI C 标准。 - Wiz
2
@Wiz 这是一个国际标准,这也是一个国际网站。因此,自从1990年以来,讨论ANSI C已经没有任何意义了。如果我在这个网站上开始将C语言称为“SS C”,因为我来自瑞典,而瑞典的标准被称为SS/ISO/IEC 9899,那也是一样的。 - Lundin
2
@Lundin 虽然人们一直认为“ANSI C”意味着C89,但这并不是真的;特别是当ANSI C在2012年采用了C11时,从而使“ANSI C”意味着C11。无论人们如何认为它不是这样。 - Wiz
11
@Wiz,你没有理解重点。对于国际观众来说,只有在1989年到1990年发布ISO标准之前提到“ANSI C”才有意义。因此,即使ANSI今天仍然采用ISO标准,但非正式地,“C89”和“ANSI C”已经成为同义词。但自1990年以来,美国国家标准协会在美国以外的人们看来已经不再那么重要了。 - Lundin
显示剩余3条评论
4个回答

70

POSIX是标准C库的一个超集,值得注意的是它会参考标准C库。如果C和POSIX发生冲突,C会胜出。

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

pthread.h用于POSIX线程,而threads.h是C11的新头文件,是C库的一部分。也许在未来,pthread会被废弃,取而代之的是C11的线程,然而你不能保证C11已经广泛部署。因此,如果你想要可移植性,现在应该优先选择pthread。如果可移植性不是问题,并且你有C11线程可用,你应该使用C11线程。


例如,signal.h在http://en.wikipedia.org/wiki/C_standard_library和http://en.wikipedia.org/wiki/C_POSIX_library中都有提到。但是我仍然不明白。signal.h是标准C库的头文件,还是只在POSIX系统中可用? - Koray Tugay
2
@KorayTugay 最好的方法是去 POSIX 网页 并搜索 signal.h。它会指出头文件存在于 C 标准库中,但 POSIX 对其进行了扩展。扩展标记为 CX。它说你必须添加一个定义,但通常扩展是通过默认编译器标志启用的。另一个选择是阅读 C 标准 - Per Johansson
我认为pthread不会被C11线程所取代,特别是因为除了一个不重要的细节外,C11线程是pthread的一个适当子集。 - fuz
@Alcott - 补充一下@Per Johansson的好答案,据我所知,可以“考虑到”C标准“假定最小”的操作系统功能,因此,例如,假定系统上只运行一个进程,因此没有必要(没有定义)使用头文件如<semaphore.h>、<pthread.h>等(然而,我应该指出,据我所知,C11的后续版本确实包含了<thread.h>的定义)。 - Guy Avraham
1
@PerJohansson,你如何称呼 POSIX C 库中不属于标准 C 库的部分? - Tim
@Tim 我想这个答案所说的就是“超集”,虽然“超集”是一个强烈的词,但我会说POSIX C库基本上是C标准库的扩展,以拥有更多的功能来控制底层的东西,如线程、进程、文件系统、I/O等。 - Sourabh Choure

12

C POSIX 库是针对 POSIX 系统的 C 标准库规范。它与 ANSI C 标准同时开发。为了使 POSIX 兼容标准 C,做出了一些努力;POSIX 包含了比标准 C 更多的函数。


8

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,包括 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 标准已扩展的部分(请参见 Codes)。任何 POSIX.1-2008 版本与 ISO C 标准之间的冲突都是无意的。

我在这里列出了一些主要的 API 扩展:我从未真正理解:什么是 POSIX?


0

ANSI C仍然活着,我认为:ANSI C被ISO C、Cxx继承和扩展。POSIX一直在完全遵守ANSI C。

我们可以轻松地在Windows、类Unix系统、嵌入式设备上编写ANSI C;但是Cxx或POSIX可能会有问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接