zoukankan      html  css  js  c++  java
  • 第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结尾的字符串数组),并打印整个环境。

  • 相关阅读:
    jsp中页面包含的方法(转载)
    comparator的用法
    Spring对Hibernate事务管理【转】
    jQuery笔记
    Spring事务配置的五种方式【转】
    Spring AOP 学习小结【转】
    DWR3.0 dwr 返回值(数组,集合,Map)
    关于tomcat startup.bat启动后一闪而过的问题(转)
    Spring 异常关键字 no matching editors or conversion strategy found 解决方法
    关于dhtmlxScheduler的使用说明(ADD EDIT DEL,自定义CelendarBox)【转】
  • 原文地址:https://www.cnblogs.com/anyux/p/11957237.html
Copyright © 2011-2022 走看看