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可用,但显然在环境变量列表中没有。如何解决这个问题?

最佳答案

对于崩溃,您应该在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
       };

关于c - 在C程序中的运行时确定`OSTYPE`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39381526/

10-11 16:16