第4章 Linux环境(环境变量)

环境变量简述

UNIX规范为各种应用定义了许多标准环境变量,包括终端类型、默认的编辑器、时区等。C语言程序可以通过putenv和getenv函数来访问环境变量

#include <stdlib.h>
char *getenv(const char *name);
int putenv(const char *string);

环境由一组格式为"名字=值"的字符串组成.getenv函数以给定的名字搜索环境中的一个字符串,并返回与该名字相关的值。如果请求的变量不存在,它就返回null。如果变量存在但无关联值,它将运行成功并返回一个空字符串,即该字符串的第一个字节是null。由于getenv返回的字符串是存储在getenv提供的静态空间中,所以如果想进一步使用它,你就必须将它复制到另一个字符串中,以免它被后续的getenv所覆盖

putenv函数以一个格式为"名字=值"的字符串作为参数,并将该字符串加到当前环境中。如果由于可用内存不足而不能扩展环境,它会失败并返回-1.此时错误变量errno将被设置为ENOMEM

getenv和setenv

紧接在main函数声明后的几行代码用于确保程序environ.c被正确调用,它只带有一个或两个参数:

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

// 紧接在main函数声明后的几行代码用于确保程序environ.c
int main(int argc,char *argv[])
{
    char *var, *value;
    if(argc == 1 || argc > 3){
        fprintf(stderr,"usage:environ var [value]
");
        exit(1);
    }
// 调用,getenv从环境中取出变量的值
    var = argv[1];
    value = getenv(var);
    if(value)
        printf("Variable %s has value %s
",var ,value
     else
        printf("Variable %s has not value
",var);
// 检查程序调用时是否有第二个参数。如果有,则通过构造一
    if(argc == 3){
        char *string;
        value = argv[2];
        string = malloc(strlen(var)+strlen(value)+2);
        if(!string){
            fprintf(stderr,"out of memory
");
            exit(1);
        }
        strcpy(string,var);
        strcat(string,"=");
        strcat(string,value);
        printf("Calling putenv with:%s
",string);
        if(putenv(string) !=0){
            fprintf(stderr," putenv failed
");
            free(string);
            exit(1);
        }
// 最后,再次调用getenv来查看变量的新值
    value = getenv(var);
    if(value)
        printf("New value of %s is %s
",var,value);
    else
        printf("New value of %s is null??
",var);
    }
    exit(0);
}


注意:环境仅对程序本身有效。你在程序里做的改变不会反映到外部环境中,这是因为变量的值不会从子进程(你的程序)传播到父进程(shell)

环境变量的用途

程序经常使用环境变量来改变它们的工作方式。用户可以通过以下方式设置环境变量的值:在默认环境中设置、通过登录shell读取.prefile文件来设置、使用shell专用的启动文件(rc)或在shell命令中对变量进行设定。例如

[root@centos7-apue test4]# ./environ FRED
Variable FRED has not value
[root@centos7-apue test4]# FRED=hello ./environ FRED
Variable FRED has value hello

shell将行首的变量赋值作为对环境变量的临时改变。在上面的第二个例子中,程序environ将运行在一个变量FRED有一个赋值的环境中

举个例子,通过设置CDDB,来指定所用的数据库。这样,每个用户就能指定自己的默认值,或者在每次运行时使用shell命令来设定

CDDB=mycds;export CDDB

环境变量是一把双刃剑,使用它的时候要小心!与命令选项相比,它们对用户来说更加"隐蔽",这样就就使得程序的调试变得更加困难。从某种意义上来说,环境变量就像全局变量一样,它们会改变程序的行为,产生不可预期的结果

environ变量

程序的环境由一组格式为"名字=值"的字符串组成。程序可以通过environ变量直接访问这个字符串数组。environ变量的声明如下所示

#include <stdlib.h>
extern char **environ;

实验 environ变量

下面这个程序showenv.c使用environ变量打印环境变量:

#include <stdio.h>
#include <stdlib.h>
extern char **environ;
int main()
{
	char **env = environ;
	while(*env){
		printf("%s
",*env);
		env++;
	}
	exit(0);
}

当在Linux系统中运行该程序时,你将得到如下输出,这些变量的数目、出现顺序和值取决于操作系统的版本、所用的shell以及程序运行时的用户设置

实验解析

这个程序遍历environ变量(一个以null结尾的字符串数组),并打印整个环境。

原文地址:https://www.cnblogs.com/anyux/p/11957237.html