首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

4.2  环境变量

我们在第2章讨论过环境变量。这是一些能用来控制shell脚本和其他程序行为的变量。你也可以用它们来配置用户环境。例如,每个用户有一个环境变量HOME,这个变量定义了用户的主目录,即该用户会话(session)的默认开始位置。正如我们已看到的,我们可以在shell中检查环境变量:

你也可以使用shell的set命令来列出所有的环境变量。

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

环境由一组格式为“名字=值”的字符串组成。getenv函数以给定的名字搜索环境中的一个字符串,并返回与该名字相关的值。如果请求的变量不存在,它就返回null。如果变量存在但无关联值,它就成功的返回一个字符串,但该字符串的第一个字节是null。由于getenv返回的字符串是存储在getenv提供的静态空间中,所以要注意不要被应用程序覆盖,比如被后续的getenv调用所覆盖。

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

让我们来写一个程序打印所选的任意环境变量的值。如果给程序传递第二个参数,我们还将设置环境变量的值。

实验:getenv和putenv

(1) 紧接在main函数声明后的几行用于确保程序environ.c被正确调用:

(2) 此后,我们用getenv从环境中取出变量的值:

(3) 接下来,我们检查程序调用时是否有第二个参数。如果有,我们通过构造一个格式为“名字=值”的字符串并调用putenv来设置变量的值。

(4) 最后,我们再次调用getenv来查看变量的新值。

运行这个程序,我们可以查看和修改环境变量:

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

4.2.1  环境变量的用途

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

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

举个例子,在我们CD数据库应用程序的未来版本中,我们可以通过改变一个环境变量,比如CDDB,来指定所用的数据库。这样,每个用户就能指定他或她自己的默认值,或者在每次运行时使用shell命令来设定:

$ CDDB=mycds cdapp

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

4.2.2  environ变量

正如我们已看到的,程序的环境由一组格式为“名字=值”的字符串组成。程序可以通过environ变量直接访问这个字符串数组。environ变量的声明如下所示:

实验:environ变量

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

当在Linux系统中运行该程序时,我们得到如下的输出(略做删减)。这些变量的数目、出现顺序和值依赖于操作系统的版本、所用的shell以及程序运行时的用户设置。

实验解析

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

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论