Linux 的变量可分为两类:环境变量和本地变量。
环境变量,或者称为全局变量,存在与所有的shell 中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了。Linux 的环境变量具有继承性,即子shell 会继承父shell 的环境变量。
本地变量,当前shell 中的变量,很显然本地变量中肯定包含环境变量。Linux 的本地变量的非环境变量不具备继承性。
GNU/Linux下面每个程序运行都有一个所谓的运行环境,这里的环境实际上就是一组变量的定义。所有的变量和他们的值都是字符串形式表达的。通过转换,通常变量名字都是用大写字符表达。
然后我们在编程的时候如何来设置自己程序运行时所需要的环境变量呢!
这就用到了我们下面需要介绍的这两个函数:
头文件 #include
点击(此处)折叠或打开
- int setenv(const char *name, const char *value, int overwrite);
- char *getenv(const char *name);
函数说明: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中一个系统调用:
点击(此处)折叠或打开
- #include <unistd.h>
- char *getcwd(char *buf, size_t size)
我们写个例子来验证一下:
点击(此处)折叠或打开
- #include<unistd.h>
- #include<stdlib.h>
- #include<fstream>
- #include<iostream>
- #include<string>
- #include<sstream>
- using namespace std;
- int main()
- {
- ofstream of;
- string path;
- string filename;
- string env;
- stringstream ss;
- char buf[50];
- char *p;
- filename = "ddx";
- of.open(filename.c_str());
- of.close();
- getcwd(buf,50);
- ss << buf;
- ss << "/";
- ss << filename;
- env = "MYENV";
- setenv(env.c_str(),ss.str().c_str(),1);
- p = getenv(env.c_str());
- cout << p <<endl;
- return 0;
- }