当前位置:  技术问答>linux和unix

如何从程序中获得/设置环境变量?火急,回答完立即给分。

    来源: 互联网  发布时间:2015-04-23

    本文导语:  如何从程序中获得/设置环境变量?,火急,回答完立即给分。 | 获得一个环境变量可以通过调用‘getenv()’函数完成。 #include  char *getenv(const char *name); 设置一个环境变量可以通过调用‘putenv()’函数...

如何从程序中获得/设置环境变量?,火急,回答完立即给分。

|
获得一个环境变量可以通过调用‘getenv()’函数完成。

#include 

char *getenv(const char *name);

设置一个环境变量可以通过调用‘putenv()’函数完成。

#include 

int putenv(char *string);

变量string应该遵守"name=value"的格式。已经传递给putenv函数的字符串不能够被释放或变成无效,因为一个指向它的指针将由‘putenv()’保存。这意味着它必须是在静态数据区中或是从堆(heap)分配的。如果这个环境变量被另一个‘putenv()’的调用重新定义或删除,上述字符串可以被释放。
因为putenv()有这样的局限,在使用中经常会导致一些错误,GNU libc 中还包括了两个BSD风格的函数:
#include 
int setenv(const char *name, const char *value, int replace);
void unsetenv(const char *name);

setenv()/unsetenv()函数可以完成所有putenv()能做的事。setenv() 可以不受指针限制地向环境变量中添加新值,但传入参数不能为空(NULL)。当replace为0时,如果环境变量中已经有了name项,函数什么也不做(保留原项),否则原项被覆盖。
unsetenv()是用来把name项从环境变量中删除。注意:这两个函数只存在在BSD和GNU库中,其他如SunOS系统中不包括它们,因此将会带来一些兼容问题。我们可以用getenv()/putenv()来实现:

int setenv(const char *name, const char *value, int replace)
{
char *envstr;

if (name == NULL || value == NULL)
return 1;
if (getenv(name) !=NULL)
{
envstr = (char *) malloc(strlen(name) + strlen(value) + 2);
sprintf (envstr, "%s=%s", name, value);
if (putenv(envstr));
return 1;
}
return 0;
}
*/

记住环境变量是被继承的;每一个进程有一个不同的环境变量表拷贝(从core文件中我们可以看出这一点)。结果是,你不能从一个其他进程改变当前进程的环境变量,比如shell进程。

假设你想得到环境变量‘TERM’的值,你需要使用下面的程序:

char *envvar;

envvar=getenv("TERM");

printf("The value for the environment variable TERM is ");
if(envvar)
{
printf("%sn",envvar);
}
else
{
printf("not set.n");
}

现在假设你想创建一个新的环境变量,变量名为‘MYVAR’,值为‘MYVAL’。
以下是你将怎样做:

static char envbuf[256];

sprintf(envbuf,"MYVAR=%s","MYVAL");

if(putenv(envbuf))
{
printf("Sorry, putenv() couldn't find the memory for %sn",envbuf);
/* Might exit() or something here if you can't live without it */
}

|
有,老兄,我在补充一下怎样读取整个环境变量表?

如果你不知道确切你想要的环境变量的名字,那么‘getenv()’函数不是很有用。在这种情况下,你必须更深入了解环境变量表的存储方式。

全局变量,‘char **envrion’,包含指向环境字符串指针数组的指针,每一个字符串的形式为‘“NAME=value”’(和putenv()中的“string”的格式相同)。
这个数组以一个‘空’(NULL)指针标记结束。这里是一个打印当前环境变量列表的小程序(类似‘printenv’)。

#include 

extern char **environ;

int main()
{
char **ep = environ;
char *p;
while ((p = *ep++))
printf("%sn", p);
return 0;
}

一般情况下,‘envrion’变量作为可选的第三个参数传递给‘main()’;就是说,上面的程序可以写成:

#include 

int main(int argc, char **argv, char **envp)
{
char *p;
while ((p = *envp++))
printf("%sn", p);
return 0;
}

虽然这种方法被广泛的操纵系统所支持(译者注:包括DOS),这种方法事实上并没有被POSIX标准所定义。(一般的,它也比较没用)

    
 
 

您可能感兴趣的文章:

  • 程序中获取的环境变量能够根据Linux系统中相应环境变量而变化吗?
  • linux 下设置环境变量 使用了setenv 和putenv 在程序结束以后 发现变量又变回去了
  • 探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题
  • 关于系统变量,开机启动程序,和定时启动程序
  • java的应用程序中如何定义一个全局变量,在程序的任何地方都可以修改使用?
  • java程序环境变量的问题!
  • linux中大量的全局变量怎么体现结构化的程序设计?
  • unix shell中能否将后台运行程序的输出保存到变量中?
  • export 变量到子程序的问题
  • shell脚本变量与应用程序同步的问题
  • 如何在一段程序同步几个变量??
  • 急!送分求助,java程序中如何读取系统环境变量?
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 用什么函数在程序中获得环境变量的值?
  • 请问,怎么把某个程序的输出赋给shell变量??
  • awk程序中使用shell的变量
  • 请问gcc有没有类似CreateProcess的函数,可以获得调用的外部程序的进程ID呢? iis7站长之家
  • 在linux上,为什么不用配置环境变量还能运行java程序呢?
  • 请问在多线程得程序中,函数内的局部变量是否线程安全的
  • 程序中如何使用setenv或者export配置环境变量在当前shell生效
  • 如何安装linux源程序(希望回答详细些)
  • 简单的java程序问题,请求回答!!!!
  • 问一下程序在linux各版本中移植问题!急!急!急!盼有经验的高手能回答一下!谢谢!
  • 难道中国程序员真的是XXXX?没人能够回答这个问题??第三次提问! 100分送上!
  • 在笔记本上安装了Fedora Core 5,用FC5自带的Eclipse的开发java程序,Eclipse运行非常慢,了解者请回答。
  • 高分请教!回答完了再加200分!linux 上的c++或c 程序能不能读写excel文件?
  • 请使用JDK者来回答: 你们用什么编辑器来编JAVA源程序? 方便吗?
  • 这个程序到底怎么了,在线等待,(主要是方法的调用)急盼回答
  • 昨晚,通过朋友的帮助,现在程序还有一点错误,急盼回答!(在线等待)
  • 请教大家给程序注释:回答者给分100
  • 嵌入式系统字符驱动程序(应用)问题(初学),请帮忙回答
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux下怎么用程序获得U盘盘符文件
  • 怎样获得shell程序执行的路径
  • 请问gcc有没有类似GetExitCodeProcess的函数,可以获得调用的外部程序的返回值呢?
  • 如何不写驱动通过应用程序获得一块内存并取得它的物理地址?
  • 在程序中如何获得某个进程的CPU占用率
  • 在程序中如何获得某个硬盘或者目录的剩余空间?
  • 怎样在Application中获得程序的当前路径?
  • 在linux中,如何在程序中获得分辨率!
  • 请问:如何在java程序内获得 .class 文件的全路径?
  • 如何获得MYSQL驱动程序接口?
  • 请教,在程序运行中,获得屏幕输出信息
  • 能获得调用其它程序的时返回的参数吗?
  • 请问如何在程序中获得shell命令输出的信息?
  • 如何在java程序中获得拨号上网分配的动态IP?
  • sql server数据库有没有专门的jdbc驱动程序,若有,请教怎样获得?
  • 怎样用程序获得网卡地址!那位仁兄能告知
  • 送分! UNIX C编程。 程序中如何获得当前运行目录? .
  • 从哪儿可以获得jbuilder或者其他java程序的源代码
  • 请问gcc有没有类似CreateProcess的函数,可以获得调用的外部程序的进程ID呢?
  • 请问,在unix中用C/C++写的监控程序有没有可以获得磁盘空间的函数?
  • 重装服务器后IIS网站错误(应用程序中的服务器错误)
  • 为什么我在java程序里启动的一个程序在java程序关闭后,该程序的所有进程都关掉了
  • windows server2008上PowerBuilder程序系统错误解决方法
  • Linux 编程怎么样在程序开启一个程序,和关闭一个程序?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 请问从一个java程序中如何调用另一java程序,并控制可以其状态(最小化、最大化、结束程序),还有怎样知道那个被调用的程序结束。
  • 程序员的八种级别,你属于哪一级?
  • Linux下的程序是在内存中运行的吗?为什么在程序运行的时候可以删除程序文件?
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 我的程序是用c写的gtk+程序,有个函数的参数要传给它图片的文件名,但是图片和原程序不在同一目录下怎么办?怎么在程序里指定文件的路径
  • 在docker容器中通过apt-get安装新的程序


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3