哪个C头定义了公共变量名(PATH,HOME,IFS ......)?

时间:2017-10-19 07:59:54

标签: c environment-variables posix

Chapter 8 of POSIX standard定义了常用环境变量列表"它们经常被广泛使用的命令解释器和应用程序导出"。

但是我找不到任何在我的类Unix系统中提供名字的C头。

我正在寻找类似的东西:

#define ENV_PATH "PATH"
#define ENV_USER "USER"
#define ENV_IFS "IFS"
...

哪里可以找到这样的标题?任何特定于操作系统的标题都可行:我不想自己为常量创建名称。

修改

如果您习惯于只使用主流操作系统,您可能会问:为什么要在此处使用常量? $ PATH到处都是$ PATH!

事实并非如此。

Plan 9 from Bell Labs中,环境变量通常是小写的(显然是由于aesthetics)。

Jehanne,由Plan 9派生的新操作系统中,我重新考虑了这种设计选择,以简化POSIX工具的集成。但是,由于我喜欢小写的环境变量,所以当Jehanne成为真正的操作系统时,我希望能够轻松切换回小写名称。 :-D

2 个答案:

答案 0 :(得分:2)

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

“广泛使用的命令解释器和应用程序经常导出的某些变量”的列表“can be found at http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08。 (实际的环境变量列表需要重新格式化,但无论如何......)

  

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

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   

要访问环境变量use the getenv() function

的值

exec() function documentation指定char **environ变量:

  

另外,以下变量必须由声明声明   用户是否直接使用:

extern char **environ;
     

被初始化为指向一个字符指针数组的指针   环境字符串。 argv和environ数组均已终止   由空指针。 。终止argv数组的空指针不计入argc

     

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

     

任何直接修改指针的应用程序   environ个变量点具有未定义的行为。

     

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

答案 1 :(得分:-1)

你可以做类似的事情,在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
}

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