title: Android. write failed: EPIPE (Broken pipe) when use Process
body: <p>Hello I tried to install app inside of my app via Process. For that function I created this method. </p>
  
  <pre><code>private void loadAndInstallApk(String string) {
      if(!isRooted()){
          return;
      }
      Uri uri = loadApk(string);
      if(uri == null){
          return;
      }
      Process p = null;
      DataOutputStream outs = null;
      try
      {
  
          p = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
          outs=new DataOutputStream(p.getOutputStream());
  
          String cmd="pm install -r " + uri.getPath();
          Log.d(TAG, "DATA = cmd = " + cmd);
          outs.writeBytes(cmd + "\n");
  
          // Close the terminal
          outs.writeBytes("exit\n");
          outs.flush();
              p.waitFor();
              if (p.exitValue() != 255) {
                  Log.d(TAG, "DATA succerss " + p.exitValue());
                  // Sucess 
              }
              else {
                  Log.d(TAG, "DATA Fail " + p.exitValue());
                  // Fail
              }
          }
      catch (IOException e){
          Log.e("Error", e.toString(), e);
      } catch (InterruptedException e) {
          Log.e("Error", e.toString(), e);
      } finally {
          if(outs != null) {
              try {
                  outs.close();
              } catch (IOException e) {
                  Log.d(TAG, e.toString(), e);
              }
          }
          try {
              File f = new File(uri.getPath());
              f.delete();
          }catch (NullPointerException e) {
  
              Log.e(TAG, "DATA = finally delete " + e.toString(), e);
          }
      }
  }
  </code></pre>
  
  <p>But it fails when it calls</p>
  
  <pre><code>        outs.writeBytes(cmd + "\n");
  </code></pre>
  
  <p>Error message:</p>
  
  <pre><code>E/Error﹕ java.io.IOException: write failed: EPIPE (Broken pipe)
  java.io.IOException: write failed: EPIPE (Broken pipe)
          at libcore.io.IoBridge.write(IoBridge.java:455)
          at java.io.FileOutputStream.write(FileOutputStream.java:187)
          at java.io.OutputStream.write(OutputStream.java:82)
          at java.io.DataOutputStream.writeBytes(DataOutputStream.java:156)
  ...
  Caused by: libcore.io.ErrnoException: write failed: EPIPE (Broken pipe)
          at libcore.io.Posix.writeBytes(Native Method)
          at libcore.io.Posix.write(Posix.java:202)
          at libcore.io.BlockGuardOs.write(BlockGuardOs.java:197)
          at libcore.io.IoBridge.write(IoBridge.java:450)
          at java.io.FileOutputStream.write(FileOutputStream.java:187)
          at java.io.OutputStream.write(OutputStream.java:82)
          at java.io.DataOutputStream.writeBytes(DataOutputStream.java:156)
  </code></pre>
  
  <p>Instead of</p>
  
  <pre><code>Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
  </code></pre>
  
  <p>I tried:</p>
  
  <pre><code>Runtime.getRuntime().exec("su");
  </code></pre>
  
  <p>It didn't help.</p>
  
  <p>Also this code work for my root tablet but it doesn't work for my TV box.</p>
  
  <p>I check device on root via methods:</p>
  
  <pre><code>private static boolean isRooted() {
      return findBinary("su");
  }
  
  public static boolean findBinary(String binaryName) {
      boolean found = false;
      if (!found) {
          String[] places = {"/sbin/", "/system/bin/", "/system/xbin/", "/data/local/xbin/",
                  "/data/local/bin/", "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/"};
          for (String where : places) {
              Log.d(TAG, "DATA where = " + where);
              if ( new File( where + binaryName ).exists() ) {
                  found = true;
                  break;
              }
          }
      }
      return found;
  }
  </code></pre>
  
  <p>It return true.</p>