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