为什么eclipse或cmd控制台缓存操作系统环境变量



我想获得一个操作系统(windows XP)的环境变量,我的代码如下(jdk 1.6):

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

首先,在我的PC中没有名为catalina_home的变量,它输出null,然后我在My Computer > Advanced > Environment Variables中添加catalina_home变量,它仍然输出null,如果我关闭并重新启动eclipse,它输出正确的值。如果我像这样在cmd控制台中运行此代码,我应该关闭并重新启动一个新的cmd控制台以获得正确的值,如果我删除一个现有的变量,首先它输出一个非空值,直到我重新启动eclipse或cmd控制台,它可以输出null。所以我认为eclipse或cmd控制台缓存在操作系统环境变量,但没有证据,即使他们真的这样做,我想知道为什么?任何想法都将不胜感激。非常感谢。

当一个进程启动时,它将从它的父进程获得当前环境的副本。您必须重新启动进程才能获得一组新的环境。事情就是这样。:)这不是eclipse的问题,这是操作系统的行为。

在Unix (Linux + Mac)和Windows上,进程在启动时都会复制一个env变量。

这意味着变量的映射始终是一个进程的局部,它不会看到其他进程所做的更改。

有两个原因:

  1. 安全。攻击者可以在进程启动后通过修改环境变量来修改正在运行的进程的行为,从而导致意外/不想要的行为;想象一下,攻击者可以更改现有进程的PATH变量。这样,他们就可以将受感染的代码注入受信任的进程。

  2. 线程安全。如果任何人都可以随时更改本地变量,你就需要一种同步访问和修改的方法。

如果您在命令解释器中使用set命令设置环境变量,它将立即应用于该进程的环境。

最新更新