我在使用 C/C++ 函数getenv()时遇到了一个奇怪的问题。该函数在 Linux 系统(Linux Mint 16 Cinnamon 64bit)上的 MySQL UDF 中使用。我通过编辑文件/etc/environment在系统范围内设置了 JAVA_HOME 环境变量,当使用env命令时,它与所有其他变量一起打印在 shell 中,无论是作为用户还是 root。代码很简单,如下所示:
char *javaHome;
javaHome = getenv("JAVA_HOME");
if (!javaHome) {
char *m = "Error getting JAVA_HOME variable";
strcpy(message, m);
return 1;
}
UDF 在条件中永久返回错误消息,因此javaHome变量始终为空。我创建了另一个简单的 C++ 程序并将 cpp 文件放入已编译的 UDF 库所在的 MySQL 插件目录 ( /usr/lib/mysql/plugin )。
#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
char *javaHome = getenv("JAVA_HOME");
cout << javaHome;
return 0;
}
代码按预期返回变量的值,即 JRE 的路径。UDF 代码在我的 Windows 系统上运行良好,但为了让它在 Unix 系统上运行,我不得不稍微修改代码并将GetEnvironmentVariableA()函数替换为getenv()。我无法弄清楚问题是什么。任何指针将不胜感激。
编辑:我已经测试了“HOME”变量的结果,奇怪的是输出是/etc/mysql/而不是/root/,正如我所期望的那样。UDF 是否有自己的环境或类似的环境?