zoukankan      html  css  js  c++  java
  • getenv和putenv在获取和设置环境变量中的使用

     1 #include <stdlib.h>
     2 #include <stdio.h>
     3 #include <string.h>
     4 /*
     5 这个函数是对环境变量进行一些操作的
     6 */
     7 int main(int argc, char * argv[])        //主函数
     8 {
     9     char * var, * value;        //定义两个字符串指针变量var和value
    10     
    11     if (argc==1||argc>3)        //要是没有参数输入和有两个以上的参数输入的话
    12     {                //进入循环体,打印一句话,然后退出
    13         fprintf(stderr,"usage: environ var [value]\n");
    14         exit(1);
    15     }
    16     
    17     var=argv[1];            //否则就是有参数输入,将第一个参数赋值给var
    18     value=getenv(var);    //调用函数getenv获得与该var相关的值,要是没有的话返回null
    19     if(value)
    20         printf("Variable %s has value %s\n", var, value);//有的话打印对应关系
    21     else
    22         printf("Variable %s has no value\n", var);
    23         
    24     if(argc==3)            //如果输入参数有两个的话
    25     {
    26         char * string;        //首先定义一个字符串指针变量string
    27         value=argv[2];        //将第二个参数赋值给value
    28         string=malloc(strlen(var)+strlen(value)+2);//分配指定字节的存储区
    29         if(!string)//成功的话返回非空指针出错的话返回null,
    30         {
    31             fprintf(stderr, "Out of memory\n");//出错处理,打印到标准错误
    32             exit(1);
    33         }
    34         strcpy(string, var);//把var的内容复制到string开始的地方
    35         strcat(string,"=");//字符串拼接,结果放在string中
    36         strcat(string,value);//字符串拼接,结果放在string指向的地址中
    37         printf("Calling putenv with: %s\n", string);//输出一句话
    38         if(putenv(string)!=0)//将这个等式为参数放到环境变量中
    39         {//失败的话返回-1
    40             fprintf(stderr,"puterr failed\n");
    41             free(string);
    42             exit(1);
    43         }
    44         value=getenv(var);//成功的话执行这句,获取第一个参数的环境变量
    45         if(value)//成功的话返回相应的值
    46             printf("New value of %s is %s\n",var, value);//打印一句话
    47         else
    48             printf("New value of %s is null??\n",var);
    49     }
    50     exit(0);
    51 }

    下面是实验操作

     1 jason@t61:~/桌面$ gcc environ.c
     2 jason@t61:~/桌面$ ./a.out 
     3 usage: environ var [value]
     4 jason@t61:~/桌面$ ./a.out HOME
     5 Variable HOME has value /home/jason
     6 jason@t61:~/桌面$ ./a.out FRED
     7 Variable FRED has no value
     8 jason@t61:~/桌面$ ./a.out FRED hello
     9 Variable FRED has no value
    10 Calling putenv with: FRED=hello
    11 New value of FRED is hello
    12 jason@t61:~/桌面$ ./a.out 123 456 789
    13 usage: environ var [value]

     下面是进一步的实验

    1 jason@t61:~/桌面$ ./a.out FRED
    2 Variable FRED has no value
    3 jason@t61:~/桌面$ FRED=hello ./a.out FRED
    4 Variable FRED has value hello

    可以看出,环境变量仅在程序中有效,不会反映到父进程,也就是我们的shell中

    第3行的情况是说,行首的赋值是对环境变量的临时的改变,使得程序运行在一个FRED有赋值的环境中

    all in all:

    shell中设置的环境变量会成为一个全局变量,是正儿八经的双刃剑

  • 相关阅读:
    dev 调用汉化资源
    GridViewDataHyperLinkColumn 显示与内容分离
    gmail 邮箱找回方法
    C# 拼接 in 查询字符串
    asp.net ajax
    解决vmware 因为网络问题而引起的异常
    从改工具到改模型
    Orchard源码:EventBus&EventHandler
    AutoResetEvent和ManualResetEvent理解
    缓存设计
  • 原文地址:https://www.cnblogs.com/kongchung/p/4602818.html
Copyright © 2011-2022 走看看