When using -k, make sure to flush all of the subprocess's output to
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 30 May 2006 20:18:24 +0000 (20:18 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 30 May 2006 20:18:24 +0000 (20:18 +0000)
stdout, even after the subprocess has died.

src/utils/pintos

index b18693b776f6bf1679ded0b590f1c690c9500114..079ab5a34d22e8970a631203acdf6913e2a7a4fe 100755 (executable)
@@ -702,11 +702,16 @@ sub xsystem {
            my ($buf) = "";
            my ($boots) = 0;
            local ($|) = 1;
-           while (waitpid ($pid, WNOHANG) == 0) {
+           for (;;) {
+               if (waitpid ($pid, WNOHANG) == 0) {
+                   # Subprocess died.  Pass through any remaining data.
+                   print $buf while sysread ($in, $buf, 4096) > 0;
+                   last;
+               }
+
                # Read and print out pipe data.
                my ($len) = length ($buf);
-               waitpid ($pid, 0), last
-                 if sysread ($in, $buf, 4096, $len) <= 0;
+               last if sysread ($in, $buf, 4096, $len) <= 0;
                print substr ($buf, $len);
 
                # Remove full lines from $buf and scan them for keywords.
@@ -725,9 +730,8 @@ sub xsystem {
                    }
                }
            }
-       } else {
-           waitpid ($pid, 0);
        }
+       waitpid ($pid, 0);
        alarm (0);
        &$cleanup ();