何か創りたい。
http://toshirr.blog13.fc2.com/
* Toshi's Recess Room - Toshi Creates. - 環境変数を変更したら再起動すべきか
<< 2017/03 - 2017/04 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 - 2017/05 >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ No. ]
[ 日時 : --/--/-- (--.) --:--:-- ]
[ カテゴリ : スポンサー広告 ]


環境変数を変更したら再起動すべきか

i アプリ→オープンアプリ移植の話は書くと長くなりそうですので明日以降に。
今日は Windows の環境変数についてお話ししたいと思います。

様々なアプリケーションをインストールしていると、ときに環境変数に手が加えられることがあります。
中でも PATH はその代表的な存在だと言えるでしょう。
例えばコマンド プロンプトから利用するような開発ツールは、
どこのフォルダから開いても名前を打つだけで起動できるように PATH に追記することがよくあります。

ここからが本題です。
環境変数が変更された場合、それをシステムに反映させるために再起動すべきなのでしょうか。

実際にやってみると分かりますが、
システムのプロパティで環境変数を変更して再び設定を開いてみると、ちゃんと保存されていることが分かります。
つまり「変更」のみなら再起動せずとも可能です。

では次に、このような手順を行ってみます。

1. スタート メニューからコマンド プロンプトを起動します。これを (A) とします。
2. (A) で set コマンドを実行して、PATH の内容を確認します。
3. システムのプロパティで、環境変数 PATH に何か追記します。
4. 再びスタート メニューからコマンド プロンプトを起動します。これを (B) とします。
5. (B) で set コマンドを実行して、PATH の内容を確認します。追記した内容が反映されているはずです。
6. 今度は (A) で set コマンドを実行します。こちらは追記が反映されていません。

5. の手順からも分かるように、環境変数の変更自体はきちんと反映されていますが、
6. の手順からも分かるように、これが (A) にまで及ぶことはありません。
どういう理由からなのでしょう。

まず set コマンドは、「自プロセスの環境変数を表示する」ことに留意します。
プロセスは起動時に環境変数が割り当てられるわけですが、set はそこから表示しているだけで、
その都度システムから取得しているわけではなさそうです。これは 6. からも明らかです。
もしその都度であれば、(A) にも追記した内容が反映されているはずですからね。

今度はこのような手順を行ってみます。

1. スタート メニューから「他のアプリケーションを起動できるアプリケーション」を起動しておきます。
  要は、ランチャーのようなアプリケーションであれば何でも構いません。
2. そのアプリケーションからコマンド プロンプトを起動します。これを (A) とします。
3. (A) で set コマンドを実行して、PATH の内容を確認します。
4. システムのプロパティで、環境変数 PATH に何か追記します。
5. スタート メニューからコマンド プロンプトを起動します。これを (B) とします。
6. (B) で set コマンドを実行して、PATH の内容を確認します。追記した内容が反映されているはずです。
7. 今度は (A) で set コマンドを実行します。こちらは追記が反映されていません。
8. ここで、1. で起動したアプリケーションからもう一度コマンド プロンプトを起動します。これを (C) とします。
9. (C) で set コマンドを実行して、PATH の内容を確認します。こちらも追記が反映されていません。

今までの流れで行くと、追記後に起動した (C) には追記が反映されていそうですが、されていないのです。
一体何故なのでしょうか。



実は、これは一言で言えば「プロセス間の継承」という仕組みによるものなのです。

環境変数は親プロセスの持っているものが子プロセスにそのまま引き継がれます。
2 番目に行った手順で言えば、(A) と (C) はいずれも 1. で起動したアプリケーションから起動されており、
このアプリケーションが持っていた環境変数をどちらも継承したため、追記の影響を受けなかったのです。
つまり、一旦プロセスを起動してしまえば、その後にいくら環境変数が変更されようが、
そのプロセスも、そこから起動された子プロセスもその影響を全く受けないというわけです。



しかし、少し考えると「いや待て」ということになるのではないかと思います。
両方の手順の中で、(B) はいずれもスタート メニュー = Explorer.exe から起動されています。
環境変数が親プロセスから継承されるのであれば、(B) も追記の影響を受けないのでは?



実は、これは Explorer.exe の挙動が関係しているのです。

環境変数が変更されるとすべてのトップレベル ウィンドウに WM_SETTINGCHANGE メッセージが送信されます。
Explorer.exe のウィンドウも例外なくこれを受け取り、
そこで「自プロセスの環境変数を更新する処理」を行っています。
それによって、これ以降 Explorer.exe から起動されたアプリケーションは、
更新された環境変数を Explorer.exe から継承することができるというわけです。

普通のアプリケーションはそんなことしませんが、Explorer.exe は仮にもシェルなので、
子プロセスに与える影響が大きいためにこんなことをしているのかもしれません。
ちなみに、その更新の処理は非公開 API である shell32.dll の
RegenerateUserEnvironment API を利用しているそうです。

ということで記事のタイトルの話をしますと、
環境変数を変更しても、それに関心を持つのは一部の特殊なアプリケーションだけです。
システムの重要なプロセスでさえも再起動前は変更が反映されていませんでした。
そのため、システム全体に確実に変更を反映させるためにはやはり再起動が一番のようです。
スポンサーサイト

[ No. 885 ]
[ 日時 : 2009/12/22 (Tue.) 00:05:48 ]
[ カテゴリ : プログラミング ]
[ コメント : 0 ]
[ トラック バック : 0 ]


コメント


コメントの投稿









トラック バック


トラック バック URI

http://toshirr.blog13.fc2.com/tb.php/885-91ac618d


前後の記事

これ以降に書かれた記事 : オープンアプリ開発備忘録(i アプリからの移植含む)
これ以前に書かれた記事 : Challenge the 移植

プロフィール

Toshi

  • Author:Toshi
  • 何かを創りたい Toshi の記録


ブログ内の検索


最近の記事


最近のコメント


最近のトラック バック


カレンダー

03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -


月別の記事


カテゴリ別の記事


RSS フィード


<< 2017/03 - 2017/04 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 - 2017/05 >>
* Toshi's Recess Room - Toshi Creates. - 環境変数を変更したら再起動すべきか
http://toshirr.blog13.fc2.com/
(C) 2005 - 2009 Toshi, All Rights Reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。