2013-05-07 28 views
0

我想獲得一個操作系統(Windows XP)環境變量,我的代碼如下(JDK 1.6):爲什麼eclipse或cmd控制檯緩存OS env變量?

public class TestEnv{ 

public static void main(String...args){ 
    System.out.println(System.getenv("catalina_home")); 
} 
} 

在第一頁,有沒有在我的電腦被稱爲catalina_home變量,它輸出null,然後我在My Computer > Advanced > Environment Variables增加一個catalina_home變量,它仍然輸出null,如果我關機並重新啓動eclipse,它會輸出正確的值。如果我在cmd控制檯中運行此代碼,請關閉並重新啓動新的cmd控制檯以獲取正確的值,並且如果刪除現有變量,首先會輸出非空值,直到重新啓動eclipse或cmd控制檯,它可以輸出null。所以我認爲eclipse或cmd控制檯已經緩存了OS env變量,但沒有證據,即使他們真的這樣做,我想知道爲什麼? 任何想法將不勝感激。 Thx非常。

回答

2

在Unix(Linux + Mac)和Windows上,進程在啓動時會創建env變量的副本。

這意味着變量的映射始終是進程本地的,並且不會看到其他進程所做的更改。

有兩個原因:

  1. 安全。攻擊者可以通過在進程啓動後修改env變量來修改正在運行的進程的行爲並導致意外/不需要的行爲;想象一下攻擊者可以更改現有進程的變量PATH。這樣,他們可以將受損代碼注入受信任的進程。

  2. 線程安全。如果任何人都可以隨時更改局部變量,則需要一種同步訪問和修改的方法。

+0

非常感謝。 – hiway 2013-05-07 14:43:42

+0

線程安全性是一個有效的點。安全性是IMO對操作系統的設計決定。畢竟,對環境的修改可以像讀取目錄權限或修改內存頁面一樣受到保護。 – Devolus 2013-05-08 04:36:32

+0

請注意,在Amiga上,env變量是特殊設備上的文件存儲'ENV:'(想想Linux上的'/ sys/env/varname')。文件系統規則管理訪問/刷新規則,但它允許任何人隨時更改已運行的進程的環境變量。這使得移植軟件有點奇怪。 – 2013-05-08 09:14:55

3

當一個進程開始時,它會從它的父節點獲得當前環境的一個副本。您必須重新啓動一個進程才能獲得一組新的環境。它就是這樣兒的。 :)這不是eclipse的問題,它是操作系統的行爲。

0

如果您在命令解釋程序中使用SET命令設置環境變量,則它將應用於此處,然後應用於該進程的環境。無需重新啓動,不需要註銷,無需更多。

相關問題