【问题标题】:Determine `OSTYPE` during runtime in C program在 C 程序运行时确定“OSTYPE”
【发布时间】:2016-09-08 02:07:33
【问题描述】:

C程序中,我需要在运行时找到OSTYPE,在此基础上做一些操作。

这里是代码

#include <stdlib.h>
#include <string.h>

int main () {
    const char * ostype = getenv("OSTYPE");
    if (strcasecmp(ostype, /* insert os name */) == 0) ... 
    return 0;
}

但是getenv 返回NULL(并且存在分段错误)。当我在终端中执行 echo $OSTYPE 时,它会打印 darwin15 。但是当我执行env | grep OSTYPE 时,什么都没有打印出来,这意味着它不在环境变量列表中。为了让它在我的本地机器上工作,我可以转到.bash_profile 并手动导出OSTYPE,但如果我想在新机器上运行生成的可执行文件,这并不能解决问题。

为什么OSTYPE 在运行终端时可用,但显然不在环境变量列表中。如何解决这个问题?

【问题讨论】:

标签: c macos environment-variables


【解决方案1】:

对于崩溃,您应该在 strcmp 或任何函数中使用它之前检查返回是否为 NULL。来自 man 3 getenv:

getenv() 函数返回一个指向 环境,如果没有匹配则为 NULL。

如果您在 POSIX(大多数 Unix 和某种程度上所有 Linux),我同意 Paul 对 uname 的评论。

但实际上您可以在编译时使用预编译器(使用#ifdef)检查 OSTYPE,这是一个类似的问题:Determine OS during runtime

编辑:uname

好点乔纳森。我的 linux 上的 man 2 uname 告诉如何使用(开始 POSIX,macos 也有相同的标题):

概要

   #include <sys/utsname.h>

   int uname(struct utsname *buf);

描述 uname() 在 buf 指向的结构中返回系统信息。 utsname 结构是 定义在:

       struct utsname {
           char sysname[];    /* Operating system name (e.g., "Linux") */
           char nodename[];   /* Name within "some implementation-defined
                                 network" */
           char release[];    /* Operating system release (e.g., "2.6.28") */
           char version[];    /* Operating system version */
           char machine[];    /* Hardware identifier */
       #ifdef _GNU_SOURCE
           char domainname[]; /* NIS or YP domain name */
       #endif
       };

【讨论】:

  • OP 可能想要在运行时区分darwin14darwin15,在代码在平台上编译之后,这意味着它可以使用其中任何一个。不清楚。
猜你喜欢
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2018-06-15
  • 1970-01-01
  • 2010-12-31
相关资源
最近更新 更多