zoukankan      html  css  js  c++  java
  • [Java] 关于java.lang.Runtime.exec()方法运行命令所在目录的探讨。

    测试代码:

    import java.util.*;
    import java.io.
    *;

    public class BadExecJavac
    {
        
    public static void main(String args[])
        
    {
            
    try
            
    {            
                Runtime rt 
    = Runtime.getRuntime();
                Process proc 
    = rt.exec("spant");
                
    //int exitVal = proc.exitValue();
                int exitVal = proc.waitFor();
                System.
    out.println("Process exitValue: " + exitVal);
            }
     catch (Throwable t)
              
    {
                t.printStackTrace();
              }

        }

    }



    代码创建一个新进程,运行一个叫spant.exe(一个病毒软件)的软件,正确运行(注:spant.exe被我放置在C:\WINNT\System32\目录下)。这时候脑海中出现一个疑问,程序是如何找到spant.exe所在目录的呢?带着疑问,更改了spant.exe的路径为C:\,再次运行程序,抛出以下错误信息:
    java.io.IOException: CreateProcess: spant error=2
    我想应该是程序找不到需要创建的spant进程。
    我认为Runtime.exec()运行程序的默认目录应该又系统默认环境变量指定,于是打开系统Path环境变量,发现:
    Path = %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\j2sdk1.4.1_06\bin\;C:\Program Files\Microsoft SQL Server\80\Tools\BINN

    于是,我尝试把spant.exe转移到其中一个环境变量指定的目录:C:\j2sdk1.4.1_06\bin\中,再次运行程序,spant.exe被成功调用。答案已经非常清晰。

    带着程序员应该具备的严谨态度,我再做如下尝试:
    为环境变量添加一个路径: C:\

    然后重启cmd.exe,把spant.exe转移到C:\,再次运行程序,spant.exe再次被成功调用。
    所有疑问都已经解决,得出如下结论:

    结论:java.lang.Runtime.exec()方法所唤起的程序的路径由系统默认环境变量Path所指定。
  • 相关阅读:
    【cf932E】E. Team Work(第二类斯特林数)
    【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)
    斯特林数及斯特林反演
    Codeforces Round #608 (Div. 2)
    【cf1272】F. Two Bracket Sequences
    Codeforces Round #606 (Div. 2)
    【hdu4045】Machine scheduling(dp+第二类斯特林数)
    【poj2661】Factstone Benchmark(斯特林公式)
    [USACO1.4] Packing Rectangles
    [CF1313D] Happy New Year
  • 原文地址:https://www.cnblogs.com/johnny/p/125406.html
Copyright © 2011-2022 走看看