【发布时间】:2016-12-24 12:27:15
【问题描述】:
我有兴趣编写一个 Vala 程序,该程序将确定当前的操作系统并采取相应的行动(具体如何行动我还没有决定,但与这个问题无关)。所以我想知道的是如何在运行时在 Vala 程序中确定当前的操作系统(包括 Linux 的特定发行版)。
【问题讨论】:
标签: operating-system vala
我有兴趣编写一个 Vala 程序,该程序将确定当前的操作系统并采取相应的行动(具体如何行动我还没有决定,但与这个问题无关)。所以我想知道的是如何在运行时在 Vala 程序中确定当前的操作系统(包括 Linux 的特定发行版)。
【问题讨论】:
标签: operating-system vala
除非您正在编写系统级代码(如包管理器或操作系统配置代码),否则您不应该。更好的选择是使用已经为您抽象了分发细节的库。
如果你必须这样做,有两种主要方法:
在构建时
在这里,您的构建系统应该负责检测操作系统/发行版,并将定义传递给编译器(如 -DDISTRO_UBUNTU)或编写 config.vala 文件(可能来自模板 config.vala.in 替换,例如 autotools有AC_CONFIG_FILES 设施可以做到这一点)。
在运行时
您的工具在运行时会自行进行检测。
哪个更适合您的应用程序是一种设计选择。
至于如何做,您可以检查几件事:
uname -a(或其他参数,见 man uname)将为您提供当前正在运行的内核。
lsb_release -a(并非在每个发行版上都可用,有时是您可能依赖于软件包的可选软件包)将为您提供有关您正在运行的发行版和发行版版本的信息。
在 Debian/Ubuntu 衍生产品上有一个名为 /etc/debian_version 的文件,它指示当前安装的版本。不过,这些信息并不完全准确。
有些人正在尝试读取/etc/issue,但这很危险,因为管理员/用户可能会修改该文件。
您可以询问用户她正在运行哪个操作系统。
还有一些你可以使用的操作系统信息库。
【讨论】:
您可以使用uname(2) 系统调用(如何在 Vala 中执行此操作留给用户作为练习),或阅读/proc/version(请参阅proc(5)),或阅读/etc/issues 或关注Linux Standard Base约定(例如popenlsb_release -a 的输出)。
但正如 Jens Mühlenhoff answered,您不应该这样做,并避免根据某些特定分布编写代码。
有些用户可能想要伪造或隐藏这些信息(想想某人有一些“Linux From Scratch”系统)。
【讨论】: