在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/