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 [email protected]:~/桌面$ gcc environ.c
 2 [email protected]:~/桌面$ ./a.out
 3 usage: environ var [value]
 4 [email protected]:~/桌面$ ./a.out HOME
 5 Variable HOME has value /home/jason
 6 [email protected]:~/桌面$ ./a.out FRED
 7 Variable FRED has no value
 8 [email protected]:~/桌面$ ./a.out FRED hello
 9 Variable FRED has no value
10 Calling putenv with: FRED=hello
11 New value of FRED is hello
12 [email protected]:~/桌面$ ./a.out 123 456 789
13 usage: environ var [value]

下面是进一步的实验

1 [email protected]:~/桌面$ ./a.out FRED
2 Variable FRED has no value
3 [email protected]:~/桌面$ FRED=hello ./a.out FRED
4 Variable FRED has value hello

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

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

all in all:

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

时间: 2025-01-06 13:31:03

getenv和putenv在获取和设置环境变量中的使用的相关文章

Linux下获取和设置环境变量

1. 打印所有环境变量 /*打印所有的环境变量*/ char** env=__environ; while(*env) { printf("%s\n",*env); //printf("%c\n",**env); env++; } 2.使用getenv获取环境变量 //使用getenv获取环境变量,需要头文件stdlib.h char* path=getenv("HOME"); 3.使用setenv设置环境变量 char* p=getenv(&q

setx设置环境变量中注册表路径中hive意义

路径的格式应该是 hive\key\...\value.例如HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation\StandardName. “hive”是个多义词,它可以指hive(Windows注册表HIVE文件), hive(数据仓库工具).

python 程序中设置环境变量

python 中调用系统命令有三种方法: 1.os.system('command') ,这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息. 2.os.popen('command'),该方法不但执行命令还返回执行后的信息对象,是通过一个管道文件将结果返回,例如可以设置一个变量,返回结果. 1 cha = os.popen('ls /').readlines 3.模块subprocess,实际使用过程中发现,假设要在代码当前进程中设置

Java为什么要设置环境变量、JAVA_HOME

1. 为什么要说这个问题? 想起来两年前刚学习Java时,被要求先要设置环境变量,自然不解,随后网上找答案. 现在想来感觉当时看到的答案都是神神叨叨,含糊不清,没有几个说的明明白白的.当然也有可能是当时的我没看明白吧- 总之,相信我,看了我的博客,你不用再找别的地方了! 2. 环境变量 环境变量 就是英文直译:Environment Variable . 变量 知道吧? 对,就是可以随意给其赋值的一个存储单元. 那么环境 呢? 首先,你把操作系统当做是一个最大的软件,其它软件如Office.LO

Linux设置环境变量方法(export PATH)

1.动态库路径的设置 Linux下调用动态库和windows不一样.linux 可执行程序是靠配置文件去读取路径的,因此有些时候需要设置路径 具体操作如下 export LD_LIBRARY_PATH=/home/.....(动态库的目录) 不过这种设置方法只是在当前的session中有效 你可以修改配置文件实现任何session都有效 2.环境变量的设置 一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在"/opt/a

java设置环境变量小工具

unit MainUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Registry; type TfrmMain = class(TForm) btn1: TButton; edt1: TEdit; lbl1: TLabel; procedure btn1Click(Sender: TObject); private

关于hadoop登陆kerberos时设置环境变量问题的思考

中心思想,设置kerberos环境变量时,发现JDK源码当中的一个问题,故描述如下. 在平时的使用中,如果hadoop集群配置kerberos认证的话,使用java访问hdfs或者hive时,需要先进行认证登陆,之后才可以访问.登陆代码大致如下: package demo.kerberos; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Pa

Asp.Net Core 如何在 IIS 中设置环境变量

当运行一个 Asp.Net Core 应用的时候, WebHostBuilder 根据环境变量来判断当前运行的是哪个环境,可能是 Development,Staging或者Production.你也可以设置成随便的一个字符串. 这个链接将会告诉你 如何在各种平台各种环境中设置环境变量.但如果你使用 IIS来代理 Asp.Net Core.你需要在 web.config 中设置环境变量 <configuration> <system.webServer> <handlers&g

Ubuntu设置环境变量并立即生效

Ubuntu Linux系统包含两类环境变量:系统环境变量和用户环境变量.系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效. 修改用户环境变量 用户环境变量通常被存储在下面的文件中: ~/.profile ~/.bash_profile 或者 ~./bash_login ~/.bashrc 上述文件在Ubuntu 10.0以前版本不推荐使用. 系统环境变量 系统环境变量一般保存在下面的文件中: /etc/environment /etc/profile /etc/bash.ba