先看什么是环境变量吧, 在Windows的cmd中, 我们输入一下set命令, 得到:
C:\Documents and Settings\Administrator>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Administrator\Application Data
CLIENTNAME=Console
CommonProgramFiles=C:\Program Files\Common Files
.......
我们注意到, 每行都有一个"="号, 前面的叫环境变量名, 后面的叫环境变量的值。 我们再执行一下: set | findstr -i username, 得到的结果为:
C:\Documents and Settings\Administrator>set | findstr -i username
USERNAME=Administrator
也就是说, 环境变量USERNAME的值是Administrator, 下面, 我们通过程序来获取一下这个东东:
#include <stdlib.h>
#include <stdio.h>
int main()
{
const char *pEn = getenv("USERNAME");
if (pEn)
{
printf("pEn is:\n%s\n", pEn);
}
else
{
printf("undefined\n");
}
return 0;
}
我们看到, 程序结果为:
pEn is:
Administrator
当然, 如果本来不存在某环境变量, 上面程序就会走入else分支。 下面, 我们看看如何用程序来设置自己想设置的环境变量:
#include <stdlib.h>
#include <stdio.h>
int main()
{
const char *pEn = getenv("testName");
if (pEn)
{
printf("pEn is:\n%s\n", pEn);
}
else
{
printf("undefined\n");
}
int iRet = putenv("testName=beauty");
if (iRet < 0)
{
printf("error\n");
}
else
{
printf("set successfully\n");
}
pEn = getenv("testName");
if (pEn)
{
printf("pEn is:\n%s\n", pEn);
}
else
{
printf("undefined\n");
}
return 0;
}
程序结果为:
undefined
set successfully
pEn is:
beauty
这多么好啊, 于是我还打算用这个方法实现进程间的通信, 以为进程都可以访问testName, 然而, 我错了, 因为上面的putenv设置的环境变量仅在当前进程中有效, 我连续两次运行上述程序, 发现都是一样的结果, 这说明第二个进程无法感知到testName, 而且, 我们在cmd中执行一下set | findstr -i testname, 也发现没有增加testName这个环境变量。 好吧, 看来进程通信的想法是遇到一些问题了。 如果以后找到了用程序(函数)设置系统环境的方法, 我再来完善本文。
在Android系统中, 我们经常用setprop和getprop命令来设置和获取环境变量, 当然也有对应的函数来实现这个功能, 而且设置的是系统的环境变量, 不同进程间是可以访问同一环境变量的, 这样就可以实现两个进程间的通信了, 确实可行, 而且非常普遍。
说到这里, 本文标题的疑问就释然了, 能否用环境变量实现进程间的通信, 取决于所设的环境变量是否为系统环境变量(永久生效的)。好吧, 先这样。