Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪个C头定义了通用变量名(PATH、HOME、IFS?_C_Environment Variables_Posix - Fatal编程技术网

哪个C头定义了通用变量名(PATH、HOME、IFS?

哪个C头定义了通用变量名(PATH、HOME、IFS?,c,environment-variables,posix,C,Environment Variables,Posix,定义“由广泛使用的命令解释器和应用程序经常导出”的常用环境变量列表 但是,在我的任何类unix系统中,我都找不到任何提供名称的C头 我要找的东西是: #define ENV_PATH "PATH" #define ENV_USER "USER" #define ENV_IFS "IFS" ... 在哪里可以找到这样的标题?任何特定于操作系统的头文件都可以工作:我只是不想自己为常量发明名称 编辑 如果您习惯于只使用主流操作系统,您可能会问:为什么要在这里使用常量$PATH总是$PATH无处不在

定义“由广泛使用的命令解释器和应用程序经常导出”的常用环境变量列表

但是,在我的任何类unix系统中,我都找不到任何提供名称的C头

我要找的东西是:

#define ENV_PATH "PATH"
#define ENV_USER "USER"
#define ENV_IFS "IFS"
...
在哪里可以找到这样的标题?任何特定于操作系统的头文件都可以工作:我只是不想自己为常量发明名称

编辑

如果您习惯于只使用主流操作系统,您可能会问:为什么要在这里使用常量$PATH总是$PATH无处不在

事实并非如此

在中,环境变量通常是小写的(显然是由于)


在Plan9衍生的新操作系统中,我正在重新考虑这个设计选择,以简化POSIX工具的集成。然而,由于我喜欢小写的环境变量,我希望当Jehanne将成为“唯一真正的操作系统”时,能够轻松地切换回小写名称:-d

您可以这样做,并在get_env_variables函数中修改您想要的内容。只要创建一个类似于strncmp的函数来检查是否要修改这个变量

int main(int ac, char **av, char **env){
  int i = 0;

  while (env[i] != NULL){
   env[i] = get_env_variables(env[i]);
   i++;
  }
}

char *get_env_variables(char *str) {
  // PUT SOME CODE HERE
}

编辑:不要忘记返回新的env[i]。

如注释中所述,没有头文件提供应用程序和实用程序使用的任何POSIX指定的环境变量列表

“广泛使用的命令解释器和应用程序经常导出的某些变量”列表。(实际的环境变量列表需要重新格式化,但这里仍然是…)

与某些经常使用的变量冲突是不明智的 由广泛使用的命令解释器和应用程序导出:

ARFLAGS   IFS MAILPATH    PS1
CC    LANG    MAILRC  PS2
CDPATH    LC_ALL  MAKEFLAGS   PS3
CFLAGS    LC_COLLATE  MAKESHELL   PS4
CHARSET   LC_CTYPE    MANPATH PWD
COLUMNS   LC_MESSAGES MBOX    RANDOM
DATEMSK   LC_MONETARY MORE    SECONDS
DEAD  LC_NUMERIC  MSGVERB SHELL
EDITOR    LC_TIME NLSPATH TERM
ENV   LDFLAGS NPROC   TERMCAP
EXINIT    LEX OLDPWD  TERMINFO
FC    LFLAGS  OPTARG  TMPDIR
FCEDIT    LINENO  OPTERR  TZ
FFLAGS    LINES   OPTIND  USER
GET   LISTER  PAGER   VISUAL
GFLAGS    LOGNAME PATH    YACC
HISTFILE  LPDEST  PPID    YFLAGS
HISTORY   MAIL    PRINTER  
HISTSIZE  MAILCHECK   PROCLANG     
HOME  MAILER  PROJECTDIR   
要访问环境变量的值

指定
char**environ
变量:

此外,以下变量必须由 用户(如果要直接使用):

extern char **environ;
初始化为指向 环境字符串。argv和environ阵列分别终止 通过空指针。终止
argv
数组的空指针不计入
argc

应用程序可以在一次操作中更改整个环境 通过将
environ
变量指定为指向字符数组 指向新环境字符串的指针。赋值后 对于
环境
,应用程序不应依赖于新环境 字符串环境的剩余部分,作为对
getenv()
的调用,
putenv()
setenv()
unsetenv()
,或 依赖于环境变量的任何函数都可能 注意
environ
已更改,请将环境字符串复制到 新建数组并指定
environ
指向它

直接修改
environ
变量点具有未定义的行为

符合要求的多线程应用程序不得使用
环境
变量来访问或修改任何环境变量,而任何其他 线程正在同时修改任何环境变量。打电话给 应考虑依赖于任何环境变量的任何函数 使用
environ
变量访问该环境变量


POSIX和(特别是)C中都没有这样的标准头。您可以在程序开始时尝试获取env变量名称吗<代码>无效主(int ac、char**av、char**env)然后在路径、用户和IFS上循环?!为什么要再键入2个字符?路径总是路径。更改它永远不会起作用,因此没有必要将其定义为定义。@艺术编辑解释了为什么不是这样:例如,在Plan9中,用于搜索可执行文件的目录列表名为$path。@GiacomoTesio但是既不是
getenv(“path”)
,也不是
getenv(MAGIC\u LONG\u STRING\u以\u path结尾)
将以您期望的格式返回path变量。如果您希望可移植到此类系统,则需要依赖操作系统的代码,用您自己的代码替换对
getenv
的调用,或者需要模拟替换
getenv
,以您期望的格式返回数据。这又回到了这样一个模拟函数不需要特殊的定义,这里只有第一句话提供了答案。其余的引用了一份已经在问题中链接的文件。。。