代码之家  ›  专栏  ›  技术社区  ›  ludwigm

获取已执行shell命令的结果失败/挂起

  •  0
  • ludwigm  · 技术社区  · 14 年前

    try
                    {
                        Process process = Runtime.getRuntime().exec("su");
                        DataOutputStream os = new DataOutputStream(process.getOutputStream());
                        DataInputStream osRes = new DataInputStream(process.getInputStream());
                        for (String single : commands) {
                           os.writeBytes(single + "\n");
                           os.flush();
                           String temp = new String();
                           while(  (temp = osRes.readLine()) != null)
                           {                                      
                               Log.v("NITRO", temp);
                               result2 += temp + "\n";                            
                           }                      
                        }
                        os.writeBytes("exit\n");
                        os.flush();
                        process.waitFor();
                    } catch (IOException e)
                    {
                        Toast.makeText(Main.this, "Error", Toast.LENGTH_LONG);
                    } catch (InterruptedException e)
                    {
                        Toast.makeText(Main.this, "Error", Toast.LENGTH_LONG);
                    }
    

    这是StackTrace,当我在挂起时停止调试器时,它将挂起:

    OSFileSystem.readImpl(int, byte[], int, int) line: not available [native method]    
    OSFileSystem.read(int, byte[], int, int) line: 118  
    ProcessManager$ProcessInputStream(FileInputStream).read(byte[], int, int) line: 312 
    ProcessManager$ProcessInputStream(FileInputStream).read() line: 250 
    DataInputStream.readLine() line: 309    
    Main$2$1.run() line: 84 
    ViewRoot(Handler).handleCallback(Message) line: 587 
    ViewRoot(Handler).dispatchMessage(Message) line: 92 
    Looper.loop() line: 123 
    ActivityThread.main(String[]) line: 4627    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
    Method.invoke(Object, Object...) line: 521  
    ZygoteInit$MethodAndArgsCaller.run() line: 868  
    ZygoteInit.main(String[]) line: 626 
    NativeStart.main(String[]) line: not available [native method]  
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   st0le    14 年前

    尝试在while循环之前移动出口…您知道应用程序永远不会终止,因此 while exit 应该导致应用程序终止,从而导致循环获得 null ...