在C程序的运行时确定`OSTYPE`

时间:2016-09-08 02:07:33

标签: c macos environment-variables

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在运行终端时可用,但显然不在环境变量列表中。怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

  

getenv()函数返回指向该值的指针   环境,如果没有匹配则为NULL。

如果您在POSIX(大多数Unix和某些Linux版本),我同意Paul对uname的评论。

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

编辑:uname

好点Jonathan。 man 2 uname on my linux告诉我如何使用(并开始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
       };