Unix进程环境之3---进程环境列表

    技术2026-01-18  4

    1:进程环境

    简介当一个进程(proecss) 调用另一个程序 (program) 时,同时会传递这个程序执行的环境列表 (environment list)

    进程环境列表是一个字符指针数组,每个字符指针是一个以空字符(null-terminated) 结束的 C 字符串。

    字符指针数组地址包含在全局变量environ 里。如下:

    extern char **environ;

    加入环境包含五个字符串,则表示为以下图示:

    通常环境列表有名称--- 值对组成,名称为大写,大写只是约定的惯例。

    要访问特定的环境变量不用environ 指针,通常通过函数 getenv  和  putenv 来访问。但是要访问整个环境变量就要用到environ 指针了。

    2:进程环境操作函数

    ISO C定义了一个函数可以用来取得环境列表值,前提是这个列表值要提前定义好。函数的头文件及函数原型为:

    #include <stdlib.h>

    char *getenv(const char *name);

    Returns: pointer to value associated with name, NULL if not found

    要去的特定的环境列表,用getenv 直接返回结果。比如,取得登录用户名为:

    char * user = getenv("LOGNAME"); user 保存登录用户名。

    3:以下是取得环境变量的例子:

       程序中所用到的环境变量值由Single UNIX 所定义,程序在 ubuntu10.4 上执行,所以有些值为空。

    #include<stdio.h> #include<stdlib.h> int main(int argc,char * argv[]) { char * val = NULL; char * env_name[] = {"COLUMNS","DATEMSK","HOME","LANG","LC_ALL",/ "LC_COLLATE","LC_CYPE","LC_MESSAGES","LC_MONETARY","LC_MUNERIC",/ "LC_TIME","LINES","LOGNAME","NLSPATH","PATH",/ "PWD","TERM","TMPDIR","TZ"/ }; int length=19; int i=0; for(i=0;i<length;i++) { val = getenv(env_name[i]); printf("%s = %s/n",env_name[i],val); } return 0; }

    4:操作环境变量:

    以下函数可以操作环境变量值:getenv putenv setenv unsetenv clearenv Linux 系统支持这 5 个函数,其他的 Unix 系统不全支持。

    clearenv 不是  Single UNIX  规范 用来从 environment list 移除所有的值 .

     

    函数头文件及原型如下:

    #include <stdlib.h>

    int putenv(char *str);

    int setenv(const char *name, const char *value, int rewrite);

    int unsetenv(const char *name);

    All return: 0 if OK, nonzero on error

    注意:

    1:对于 setenv 函数,如果名称存在有以下两种情况: A:  rewrit 0 ,存在的名称将会被移除。 B:  rewrit 0 ,为存在的名称更新值。

    2 unsetenv  函数用来移除特定的环境值。

    3 putenv  setenv 的差别。

    setenv为环境列表参数分配内存来生成新的名称 --- 值对字符串。

    putenv 用新的值字符串地址来替换原来的地址。因此,在 Linux  Solaris 上, putenv 函数用新的字符串地址来替换原来的地址,所以不能用分配在栈上的字符串地址。因为栈地址在函数返回时会重新利用,导致赋值错误。

    最新回复(0)