Chinaunix首页 | 论坛 | 博客
  • 博客访问: 622827
  • 博文数量: 79
  • 博客积分: 848
  • 博客等级: 军士长
  • 技术积分: 1800
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-26 19:30
文章分类

全部博文(79)

文章存档

2015年(4)

2013年(39)

2012年(36)

分类: C/C++

2012-09-21 13:58:55

首先我需要先了解一下什么是环境变量!
Linux 的变量可分为两类:环境变量和本地变量。
环境变量,或者称为全局变量,存在与所有的shell 中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了。Linux 的环境变量具有继承性,即子shell 会继承父shell 的环境变量。
本地变量,当前shell 中的变量,很显然本地变量中肯定包含环境变量。Linux 的本地变量的非环境变量不具备继承性。
GNU/Linux下面每个程序运行都有一个所谓的运行环境,这里的环境实际上就是一组变量的定义。所有的变量和他们的值都是字符串形式表达的。通过转换,通常变量名字都是用大写字符表达。
然后我们在编程的时候如何来设置自己程序运行时所需要的环境变量呢!
这就用到了我们下面需要介绍的这两个函数:
头文件 #include

点击(此处)折叠或打开

  1. int setenv(const char *name, const char *value, int overwrite);

  2. char *getenv(const char *name);
对于setenv首先要说明的是,通过此函数并不能添加或修改 shell 进程的环境变量,或者说通过setenv函数设置的环境变量只在本进程,而且是本次执行中有效。如果在某一次运行程序时执行了setenv函数,进程终止后再次运行该程序,上次的设置是无效的,上次设置的环境变量是不能读到的。
函数说明:setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。参数 value则为变量内 容,参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参数 value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。返回值 执行成功则返回0,有错误发生时返回-1。
函数说明:getenv()用来取得参数envvar环境变量的内容。参数envvar为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为envvar=value。getenv函数的返回值存储在一个全局二维数组里,当你再次使用getenv函数时不用担心会覆盖上次的调用结果。
我们现在假设这样的一个运行场景,我们在一个进程中fork出来一个子进程,子进程中调用了execlp()函数,用来执行一个其他的程序脚本,而这个程序脚本中需要访问系统能另外一个文件,因而我们需要让这个子进程找个这个文件,如何来找到它,就需要我们来给这个子进程指定一个环境变量。这个环境变量的内容就是它所需文件的绝对路径,那么又一个问题产生了我们如何在c/c++获取一个文件的绝对路径呢。
我在网上找了好久,发现java有这样函数,但是c/c++则没有相应的函数来获取一个文件的绝对路径,但是我们可以这么思考这个问题,一般我们程序创建的文件,就在我们程序当前的运行的目录内,不然的我们需要来制定我们创建的文件的绝地路径,所以我们只需要知道当前程序运行的目录的绝对路径,然后加上我们创建的文件的文件名就是这个文件的绝对路径,c/c++是有办法获取我们运行目录的绝对路径的。
这里用到了c中一个系统调用:

点击(此处)折叠或打开

  1. #include <unistd.h>
  2.   char *getcwd(char *buf, size_t size)
作用:把当前目录的绝对路径保 存到 buf 中,buf 的大小为 size。如果 size太小无法保存该地址,返回 NULL 并设置 errno 为 ERANGE。可以采取令 buf 为 NULL并使 size 为负值来使 getcwd 调用 malloc 动态给 buf 分配,但是这种情况要特别注意使用后释放缓冲以防止内存泄漏。
我们写个例子来验证一下:

点击(此处)折叠或打开

  1. #include<unistd.h>
  2. #include<stdlib.h>
  3. #include<fstream>
  4. #include<iostream>
  5. #include<string>
  6. #include<sstream>
  7. using namespace std;
  8. int main()
  9. {
  10.     ofstream of;
  11.     string path;
  12.     string filename;
  13.     string env;
  14.     stringstream ss;
  15.     char buf[50];
  16.     char *p;
  17.     filename = "ddx";
  18.     of.open(filename.c_str());
  19.     of.close();
  20.     getcwd(buf,50);
  21.     ss << buf;
  22.     ss << "/";
  23.     ss << filename;
  24.     env = "MYENV";
  25.     setenv(env.c_str(),ss.str().c_str(),1);
  26.     p = getenv(env.c_str());
  27.     cout << p <<endl;
  28.     return 0;
  29. }
编译之后我们创建一个自己的环境变量MYENV,并且把其数值设置成了文件ddx的绝对路径!

阅读(5173) | 评论(0) | 转发(0) |
0

上一篇:微软面试

下一篇:Shell编程的10个最佳实践

给主人留下些什么吧!~~