Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8366736

Closed System.out causes child process to hang on Windows

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: P4 P4
    • tbd
    • 25
    • core-libs
    • None
    • generic
    • windows

      This seems to be a problem in the Windows implementation of ProcessBuilder().inheritIO()

      This is the root cause of JDK-8366731

      The child process doesn't read from its stdin, but when it tries to write a non-trivial amount of data to its stdout, the writes get blocked

      https://bugs.openjdk.org/secure/attachment/115994/Test.java
      ========================
      import java.io.*;
      public class Test {
          public static void main(String args[]) throws Throwable {
      if (args.length == 2) {
      System.out.close();
      ProcessBuilder pb = new ProcessBuilder().inheritIO()
      .command(args[0], "Test",
      args[0], // location of java.exe
      args[1], // num loops in child process
      "child");
      var env = pb.environment();
      Process process = pb.start();
      process.waitFor();

      System.out.println("Done");
      } else {
      int n = Integer.parseInt(args[1]);
      for (int i = 0; i < n; i++) {
      System.out.println("Hello");
      }
      }
          }
      }
      ========================
      $ javac Test.java
      $ bin/java.exe Test bin/java.exe 0
      [completes with no output]
      $ bin/java.exe Test bin/java.exe 1
      [completes with no output]
      $ bin/java.exe Test bin/java.exe 10000
      [gets stuck ...]

      "main" #3 [52572] prio=5 os_prio=0 cpu=62.50ms elapsed=35.60s tid=0x0000021373b08f10 nid=52572 runnable [0x000000ae19bfe000]
         java.lang.Thread.State: RUNNABLE
      Thread: 0x0000021373b08f10 [0xcd5c] State: _at_safepoint _at_poll_safepoint 0
         JavaThread state: _thread_in_native
              at java.io.FileOutputStream.writeBytes(java.base@26-internal/Native Method)
              at java.io.FileOutputStream.write(java.base@26-internal/FileOutputStream.java:352)
              at java.lang.System$Out.write(java.base@26-internal/System.java:1910)
              at java.io.BufferedOutputStream.flushBuffer(java.base@26-internal/BufferedOutputStream.java:123)
              at java.io.BufferedOutputStream.flush(java.base@26-internal/BufferedOutputStream.java:203)
              - locked <0x0000000640c09040> (a java.io.BufferedOutputStream)
              at java.io.PrintStream.write(java.base@26-internal/PrintStream.java:541)
              - locked <0x0000000640c09008> (a java.io.PrintStream)
              at sun.nio.cs.StreamEncoder.writeBytes(java.base@26-internal/StreamEncoder.java:220)
              at sun.nio.cs.StreamEncoder.implFlushBuffer(java.base@26-internal/StreamEncoder.java:315)
              at sun.nio.cs.StreamEncoder.flushBuffer(java.base@26-internal/StreamEncoder.java:101)
              - locked <0x0000000640c09138> (a java.io.OutputStreamWriter)
              at java.io.OutputStreamWriter.flushBuffer(java.base@26-internal/OutputStreamWriter.java:179)
              at java.io.PrintStream.writeln(java.base@26-internal/PrintStream.java:690)
              - locked <0x0000000640c09008> (a java.io.PrintStream)
              at java.io.PrintStream.println(java.base@26-internal/PrintStream.java:1004)
              at Test.main(Test.java:23)

      =================================
      EXPECTED:

      Child inherited a closed System.out. So printing to it should have no effect (same as in the parent process)

      ACTUAL:

      Child process gets stuck when trying to write to System.out.

            rriggs Roger Riggs
            iklam Ioi Lam
            Votes:
            0 Vote for this issue
            Watchers:
            9 Start watching this issue

              Created:
              Updated: