C 如何测试POSIX兼容性?

C 如何测试POSIX兼容性?,c,linux,testing,posix,compatibility,C,Linux,Testing,Posix,Compatibility,我正在用POSIXAPI和Linux编写一个C程序。 我在朋友的MacOSX PC上编译并运行了它,出现了一个小错误,但我没有使用Linux的特定功能 我将使用Linux添加到API中的一些特定功能。我还将为Mac Os X和FreeBSD使用特定的POSIX扩展。 我将使用条件编译来选择代码。如果操作系统不是这些,我将使用通用POSIX代码 我没有Darwin/Mac OSX和FreeBSD,Linux是我电脑中唯一的操作系统。我无法下载和安装FreeBSD,因为它超过500 MB。 我想知道

我正在用POSIXAPI和Linux编写一个C程序。 我在朋友的MacOSX PC上编译并运行了它,出现了一个小错误,但我没有使用Linux的特定功能

我将使用Linux添加到API中的一些特定功能。我还将为Mac Os X和FreeBSD使用特定的POSIX扩展。
我将使用条件编译来选择代码。如果操作系统不是这些,我将使用通用POSIX代码

我没有Darwin/Mac OSX和FreeBSD,Linux是我电脑中唯一的操作系统。我无法下载和安装FreeBSD,因为它超过500 MB。
我想知道一种方法来测试该程序在其他POSIX系统上的编译和行为是否符合预期。
我想知道是否有POSIX模拟器和编译器来进行测试。
这些测试很简单,它们不使用GUI和驱动程序,它们只是命令行

我需要做3个测试:FreeBSD、MacOSX/Darwin和通用POSIX,但我没有这些工具

编辑

有没有一个没有GUI,但有GCC/G++和ssh/scp的FreeBSD和Darwin的最低版本?达尔文是自由的,不是吗?

我的电脑很旧,但我想我可以将它们安装在虚拟机中,创建虚拟网络,并使用ssh/scp传输和测试程序。

如果你想为其他系统编译,通常不需要其他系统,您只需要一个适当的。

一个简单的方法是使用适当的功能测试宏编译程序。例如,如果您将
\u POSIX\u C_SOURCE
定义为POSIX的目标版本(当前为
200809L
),则您将请求系统头向您的程序公开除POSIX base需要/允许的内容外的任何内容。这可以通过命令行CFLAGS通过
-D_POSIX_C_SOURCE=200809L
完成。如果需要XSI选项(完整的单一Unix标准功能,它是POSIX base的超集),则使用
-D_XOPEN_SOURCE=700


这将无法帮助您检测缺乏POSIX功能的特定系统(例如,OSX已损坏,并且缺少我上次检查的
sem_init
,即使它在POSIX中是强制性的)或编写依赖于POSIX标准接口中非标准行为的代码所产生的问题(例如,在传递给
regcomp
的表达式中使用GNU正则表达式扩展)但它将帮助您捕获标准中未包含的接口的任何意外使用。

这有点陈词滥调,但“没有可移植的代码;只有已移植的代码”。没有任何替代方法可以替代要测试的系统。如果无法做到这一点,您必须根据标准的子集编写代码,您可以依赖不同的系统ng.避免条件编译是最好的;如果你不得不使用它,它会使生活复杂化。@Jonathan:虽然在某种程度上是这样,但在过去的5-10年里,它变得不那么复杂了,以至于人们为了“可移植性”到“古怪的系统”而做的许多传统事情现在看起来像是过时的垃圾。我同意双方都有争论,但我认为,编码标准和纠缠实现者,在他们不符合标准的情况下修复他们损坏的实现,作为一种推动未来的方式,有很多优点,我们不必扮演“每个目标的端口”的角色游戏。当大玩家加入游戏时,它也会获得更多的成功。从另一方面来说,GCC打击了很多UB(如签名溢出和别名违规)一开始确实破坏了一些东西,但这对于让程序员修复他们破坏的程序来说已经走了很长一段路。应用程序方面的一些类似的大胆行动可能会产生很大的影响。顺便说一句,采取这种方法并不一定意味着你的程序不会在流行的破坏平台上运行。它只是意味着你必须这样做提供修复/粘合层,使您的标准代码在那里运行。由于提问者将“使用Linux添加到API中的某些特定功能”,因此代码可能不会在任何地方都表现相同,至少不需要额外工作来提供Linux扩展的功能。我认为双引导或运行FreeBSD的VM应该是比较直截了当的(所以不能在FreeBSD上测试会被忽略);Mac OS X的问题更大。这取决于将要使用的功能;您可以在无条件编译的情况下进行大量的移植。对于OS X-。编译,但在未命名的信号量上返回一个错误。感谢链接。这真的很不幸,因为(未命名)信号量是POSIX提供的最有用的同步工具之一(特别是从信号处理程序使用它们的能力),而命名信号量相当笨重,污染了全局名称空间,如果意外终止,可能会被甩在后面。。。