C/C++ 関数getenv()で奇妙な問題が発生しています。この関数は、Linux システム (Linux Mint 16 Cinnamon 64 ビット) 上の MySQL UDF 内で使用されます。/etc/environmentファイルを編集して JAVA_HOME 環境変数をシステム全体に設定しました。ユーザーとルートの両方でenvコマンドを使用すると、他のすべての変数とともにシェルに出力されます。コードは単純で、次のようになります。
char *javaHome;
javaHome = getenv("JAVA_HOME");
if (!javaHome) {
char *m = "Error getting JAVA_HOME variable";
strcpy(message, m);
return 1;
}
UDF は条件で永続的にエラー メッセージを返すため、javaHome変数は常に null です。別の単純な 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」変数の結果をテストしたところ、出力は不思議なことに、 /root/ではなく/etc/mysql/でした。UDF には独自の環境などがありますか?