在运行时确定OS

时间:2012-01-03 01:21:04

标签: c windows linux macos bsd

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

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

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

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

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

5 个答案:

答案 0 :(得分:6)

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

More complete list of uname outputs

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

答案 1 :(得分:3)

IF 您在POSIX系统上,可以从<sys/utsname.h>调用uname()。

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

有关详细信息,请参阅the man page

答案 2 :(得分:1)

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

答案 3 :(得分:0)

可接受的答案为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标头:Compilation fails due to missing file sys/utsname.h,该标头很可能在Windows中不起作用。

答案 4 :(得分:-2)

if (strchr(getenv("PATH"),'\\'))
    puts("You may be on windows...");

即使我同意&#34; Runtime还没有时间确定这个......&#34;