<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I think my point was "why bother forking at all if we're using open to run a subprocess?".</div><div class=""><br class=""></div><div class="">Also, this will fail if the path contains spaces:</div><div class=""><br class=""></div><div class=""><div class="">+    my $ExecLine = join(' ', $Clang, "-###", $mode, @$Args, "2>&1", "|");</div><div class="">+    open(PS, $ExecLine);</div></div><div class=""><br class=""></div><div class="">Do newer Perls on newer Windows support the list form of open?</div><div class=""><br class=""></div><div class="">Jordan</div><div class=""><br class=""></div><br class=""><div><blockquote type="cite" class=""><div class="">On Nov 5, 2014, at 11:54 , Anton Yartsev <<a href="mailto:anton.yartsev@gmail.com" class="">anton.yartsev@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
  
    <meta content="text/html; charset=windows-1252" http-equiv="Content-Type" class="">
  
  <div bgcolor="#FFFFFF" text="#000000" class="">
    <div class="moz-cite-prefix">Ping!<br class="">
    </div>
    <blockquote cite="mid:5452879E.5080509@Gmail.com" type="cite" class="">
      <meta content="text/html; charset=windows-1252" http-equiv="Content-Type" class="">
      <div class="moz-cite-prefix">It seems that fork is the only native
        perl mean for creating subprocesses. There is a number of
        packages that provide means for spawning at <a href="http://cpan.org" class="">cpan.org</a>, but they
        are not guarantee to be included at the users perl distribution.</div>
      <blockquote cite="mid:658A0B49-9795-4D6E-AA12-363D7CD99B02@apple.com" type="cite" class="">
        <meta http-equiv="Content-Type" content="text/html;
          charset=windows-1252" class="">
        <div class="">Looking at this code, it's weird that we're doing this as a
          fork/exec (or not-exec) at all. Why can't we just spawn a
          sub-process?</div>
        <div class=""><br class="">
        </div>
        <div class="">Jordan</div>
        <div class=""><br class="">
        </div>
        <br class="">
        <div class="">
          <div class="">On Oct 21, 2014, at 6:47 , Anton Yartsev <<a moz-do-not-send="true" href="mailto:anton.yartsev@gmail.com" class="">anton.yartsev@gmail.com</a>>

            wrote:</div>
          <br class="Apple-interchange-newline">
          <blockquote type="cite" class="">
            <meta http-equiv="content-type" content="text/html;
              charset=windows-1252" class="">
            <div bgcolor="#FFFFFF" text="#000000" class=""> Hi all,<br class="">
              <br class="">
              Attached is the patch that prevents ccc/c++-analyzer from
              hang if launched with ActivePerl or Strawberry Perl
              interpreters.<br class="">
              The patch replaces the code that creates a pipe from child
              to parent to the more portable explicit writing to parent,
              this prevent interpreters from hang.<br class="">
              The conditions for hang are: child should open a pipe to
              the parent and parent should read from the child,
              otherwise no hang.<br class="">
              <br class="">
              The problem is possibly caused by the bug in emulation of
              'fork' by Perl interpreters on Windows. From <a moz-do-not-send="true" href="http://perldoc.perl.org/perlfork.html" class="">perlfork</a>
              documentation, BUGS section:<br class="">
              "In certain cases, the OS-level handles created by the
              pipe(), socket(), and accept() operators are apparently
              not duplicated accurately in pseudo-processes. This only
              happens in some situations, but where it does happen, it
              may result in deadlocks between the read and write ends of
              pipe handles, or inability to send or receive data across
              socket handles."<br class="">
              <br class="">
              An example from perlfork documentation also hangs:<br class="">
              <br class="">
              # simulate open(FOO, "-|")<br class="">
              sub pipe_from_fork ($) {<br class="">
                  my $parent = shift;<br class="">
                  pipe $parent, my $child or die;<br class="">
                  my $pid = fork();<br class="">
                  die "fork() failed: $!" unless defined $pid;<br class="">
                  if ($pid) {<br class="">
                    close $child;<br class="">
                  }<br class="">
                  else {<br class="">
                    close $parent;<br class="">
                    open(STDOUT, ">&=" . fileno($child)) or die;<br class="">
                  }<br class="">
                $pid;<br class="">
              }<br class="">
              <br class="">
              if (pipe_from_fork('BAR')) {<br class="">
              # parent<br class="">
              while (<BAR>) { print; }<br class="">
                close BAR;<br class="">
              }<br class="">
              else {<br class="">
                # child<br class="">
                print "pipe_from_fork\n";<br class="">
                exit(0);<br class="">
              }<br class="">
              <br class="">
              The hang is not reproduced only with the MSYS Perl.<br class="">
              <br class="">
              OK to commit?<br class="">
              <pre class="moz-signature" cols="72">-- 
Anton</pre>
            </div>
            <span class=""><ccc-analyzer_fork_open_hang.patch></span></blockquote>
        </div>
        <br class="">
      </blockquote>
      <br class="">
      <br class="">
      <pre class="moz-signature" cols="72">-- 
Anton</pre>
    </blockquote>
    <br class="">
    <br class="">
    <pre class="moz-signature" cols="72">-- 
Anton</pre>
  </div>

</div></blockquote></div><br class=""></body></html>