unix中的环境表、环境变量(environ、getenv、setenv、putenv)

  • 环境表

    每个程序都有一张环境表。与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的c字符串地址。

    全局变量environ则包含了该指针数组的地址:extern char ** environ;
    如下程序可以打印环境表。

#include <stdio.h>
#include <stdlib.h>

extern char  ** environ;
int main()
{
	int i;
	for(i=0;environ[i]!=NULL;i++)
	{
		puts(environ[i]);
	}
	exit(0);
}

环境表中的环境变量的值大多数预定义为全大写字母。

在历史上,大多数UNIX系统支持main函数带三个参数:

	int main(int argc,char ** argv,char ** envp[]);

其中的第三个参数就是环境表。

POSIX.1规定应该使用environ而不使用第三个参数。

通常使用getnev和putenv来访问特定的环境变量,而不是environ变量。如果要查看整个环境,还是只能使用environ指针。

  • getenv

    • 函数定义
         #include <stdlib.h>
      
         char *getenv(const char *name);
      
    • 功能描述
      getnev通过name在环境表中搜索,如果成功,则返回该项的值,否则返回NULL。
      • 注意事项
        • 环境表中的字符串都是 以类似于 name=value 方式存放。
        • 在大部分的系统实现中,getenv返回一个指向环境表中的某项的指针。
        • 调用者必须特别小心,不要修改getenv返回来的指针所指向的内容,因为这样很可能会导致修改进程环境。
        • getenv不要求是可重入的。getenv返回的值是可以静态分配的,而且可以被如下一系列的函数所改变(getenv(), putenv(3), setenv(3), or unsetenv(3).)。
  • setenv、unsetenv

    • 函数定义
         #include <stdlib.h>
      
         int setenv(const char *name, const char *value, int overwrite);
      
         int unsetenv(const char *name);
      
    • 功能描述
      • setenv修改或者增加环境变量。如果环境中没有name环境变量,则setnev增加该环境变量,并把值设为value。如果有该环境变量,则根据overwrite的值来决定。overwrite为非0值,则覆盖之前的;overwrite为0,则不覆盖。
      • 如果要覆盖,则setenv会释放原来该name字段存放的空间,再重新分配空间,把value存储进去。
      • unsetenv删除环境表中的name字段。如果没有该字段,也执行成功,只是环境表没有变化。
    • 返回值
      • setenv:执行成功,返回0;如果环境表空间不足,返回-1。
      • unsetenv:执行成功,返回0;失败返回-1,并设置errno。
  • putenv

      #include <stdlib.h>
    
       int putenv(char *string);
    
    • 可以注意到putenv的变量没有const修饰,而getenv、setenv、unsetenv都有const修饰,所以putenv不太安全,一般不使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值