Ko-Window プログラマーズマニュアル 「環境変数の取り扱い」 ●環境変数について (難しい説明) 環境変数は OS が管理する文字列変数です。Human68k では、通常各プロセスへは親 プロセスから環境変数領域のアドレス(これを単に環境のアドレスと呼ぶことがある) を受け取ります。これは親の環境変数領域のコピーではありませんので、直接書き換 えれば親の環境(通常シェルが用意する)を変更することになってしまいます。C言語ラ イブラリのスタートアップルーチンでは、互換性のためにこれを自分のプロセスメモ リ内にコピーしたのちポインタリストを用意して main() へ渡します。だから C言語 の関数 getenv() や setenv() でポインタを得てそれを更新しても、親の環境は変わ りません。 ●環境変数について (簡単な説明) 環境変数は、COMMAND.X の set コマンドで変更したり表示できる文字列のことで す。PATH の設定なんかもこれに含まれているので、OS 自体もこの文字列を参照して いることがわかるでしょう。これをC言語から取り扱う関数が、通常は getenv() に なります。 ● Ko-Window からの環境変数のアクセス 実は Ko-Window のプロセスは、親の環境のコピーを作りません。C言語のスタート アップルーチンがそれを作るのですが、ウィンドウとしての常駐時にその部分のメモ リを無駄が無いように切り放して開放してしまうからです。だから Ko-Window のアプ リケーションからは C言語ライブラリの getenv() や setenv() の関数は使えません。 間違って使ってしまうと、メモリ上の他のプロセスを破壊してしまう可能性があり危 険です。 そこで、v2.24+12.8 以降の corlib.a では、getenv() の代用ルーチンを用意しま した。KoWindowGetEnv() で、使い方は getenv() と完全に同じです。corlib.h を include しておけば勝手に getenv に define してくれるため、特に意識しなくて も大丈夫です。 もちろん DOS CALL の GETENV() を直接使っても OK です。 Ko-Window プログラ ムから環境変数を参照するには次のようにできます。 int GETENV( name, envptr, buf ); char *name; 変数名 char *envptr; 環境アドレス(通常はNULLでよい) char *buf; 格納バッファ これは doslib の関数です。例えば環境変数 HOME の値を得たければ GETENV( "HOME", 0, buf ); と実行して下さい。これで buf に変数 HOME に設定されている文字列が格納されま す。なお変数が定義されていない場合は負の数を返します。また buf は 256 byte 用意して下さい。 例 char homebuf[256]; if( GETENV( "HOME", 0, homebuf ) >= 0 ){ strcat( homebuf, "/.login" ); }else strcpy( homebuf, ".login" ); 同様に、環境変数の設定は SETENV() を使います。これらは通常の doslib の関数 であり X68K の C言語マニュアルに詳しく載ってると思いますのでそちらも参照して みて下さい。ちなみに libc では _dos_getenv() や _dos_setenv() という名前に変 更されていますが、doslib.h を include している限り、XC lib と同じ大文字の名 前でも呼び出せます。 1995/2/17 小笠原博之 oga@dgw.yz.yamagata-u.ac.jp DenDenNET: DEN0006 COR.