gpt4 book ai didi

c - C程序运行时确定 `OSTYPE`

转载 作者:行者123 更新时间:2023-11-30 15:06:11 24 4
gpt4 key购买 nike

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:

The getenv() function returns a pointer to the value in the environment, or NULL if there is no match.

如果您使用 POSIX(大多数 Unix 以及所有 Linux),我同意 Paul 对 uname 的评论。

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

编辑:uname

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

概要

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com