8

ISO C 和 POSIX 都不提供在运行时确定底层操作系统的功能。从理论的角度来看,这并不重要,因为 C 为最常见的系统调用提供了包装器,并且从挑剔的角度来看,甚至不必有底层操作系统。

然而,在许多现实世界的场景中,比 C 愿意分享的更多地了解主机环境已被证明是有帮助的,例如,为了找出存储配置文件的位置或如何调用select(),所以:

用 C 编写的应用程序是否有一种惯用的方式来确定运行时的底层操作系统?

至少,我可以轻松地在 Linux、Windows、BSD 和 MacOS 之间做出选择吗?

我目前的猜测是检查某些文件/目录是否存在,例如C:\or /,但这种方法似乎不可靠。也许查询一系列此类来源可能有助于建立“操作系统指纹”的概念,从而提高可靠性。无论如何,我期待着你的建议。

4

5 回答 5

7

实际上,大多数系统都有一个uname显示当前正在使用的内核的命令。在 Mac OS 上,这通常是“Darwin”,在 Linux 上只是简单的“Linux”,在 Windows 上是“ERROR”,FreeBSD 将返回“FreeBSD”。

更完整的uname输出列表

我很确定 有一个 C 等价物uname,所以你不需要system()

于 2012-01-03T01:28:23.947 回答
4

如果您在 POSIX 系统上,则可以从<sys/utsname.h>.

这显然不是 100% 可移植的,但我认为不会有任何方法可以在运行时授予它。

有关详细信息,请参见手册页

于 2012-01-03T01:30:09.003 回答
1

运行时不是确定这一点的时候,因为一个平台没有史诗般的 kludges 二进制文件将无法在另一个平台上运行,你应该只#ifdef在平台敏感代码周围使用 s 。

于 2012-01-03T02:00:55.863 回答
1

接受的答案状态uname,但没有提供一个最小的工作示例,所以这里适用于任何有兴趣的人 - 希望它可以为您节省我花费的时间:

#include <stdio.h>
#include <stdlib.h>
#include <sys/utsname.h>

int main(void) {
   struct utsname buffer;
   if (uname(&buffer) != 0) {
      perror("uname");
      exit(0);
   }
   printf("OS: %s\n", buffer.sysname);

   return 0;
}

(可能)输出:

操作系统:Linux

PS:不幸的是,这使用了 POSIX 标头:由于缺少文件 sys/utsname.h,编译失败,这很可能在 Windows 中不起作用。

于 2018-11-20T15:00:54.280 回答
-2
if (strchr(getenv("PATH"),'\\'))
    puts("You may be on windows...");

我什至同意“运行时不是确定这个的时间......”

于 2017-04-19T06:30:31.873 回答