in reply to Running a perl script as a system command in another thread hangs while main thread reading from STDIN

I see no difference between the two runs of the program;

C:\test>junk49 ### Running a regular command ### 0s : Thread 0 - > Creating threads 0s : Thread 1 - Created 0s : Thread 2 - Created 0s : Thread 3 - Created 1s : Thread 0 - All Threads created 1s : Thread 0 - > Waiting for input now. All threads should finish now + without pressing enter 3s : Thread 1 - Starting 'echo hello world' 3s : Thread 2 - Starting 'echo hello world' 3s : Thread 3 - Starting 'echo hello world' 3s : Thread 1 - Finished the command: hello world 3s : Thread 2 - Finished the command: hello world 3s : Thread 3 - Finished the command: hello world 10s : Thread 0 - > Input received, all done 10s : Thread 0 - All Threads joined C:\test>junk49 1 ### Running a perl script ### 0s : Thread 0 - > Creating threads 0s : Thread 1 - Created 0s : Thread 2 - Created 0s : Thread 3 - Created 1s : Thread 0 - All Threads created 1s : Thread 0 - > Waiting for input now. All threads should finish now + without pressing enter 3s : Thread 1 - Starting 'perl -e "print \"hello world\""' 3s : Thread 2 - Starting 'perl -e "print \"hello world\""' 3s : Thread 3 - Starting 'perl -e "print \"hello world\""' 3s : Thread 1 - Finished the command: hello world 3s : Thread 2 - Finished the command: hello world 3s : Thread 3 - Finished the command: hello world 14s : Thread 0 - > Input received, all done 14s : Thread 0 - All Threads joined
and nor would I expect to.

The threads won't terminate until they are joined; and they won't be joined until the code moves past <STDIN>; to the join loop.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
  • Comment on Re: Running a perl script as a system command in another thread hangs while main thread reading from STDIN
  • Select or Download Code

Replies are listed 'Best First'.
Re^2: Running a perl script as a system command in another thread hangs while main thread reading from STDIN
by rmahin (Scribe) on Sep 30, 2014 at 01:04 UTC

    Thanks for your response. Well, shoot. I tested this again on my Windows 7 machine, actually running from command line (before was running from the built in shell of Komodo Edit) and I do see that it works as expected. I apologize for the incorrect assessment. Tested against a Windows 2008 R2 machine, and saw the correct behavior as well. Windows 2012 R2 however, is still behaving abnormally. I tested on another Windows 2012 (not R2) and found the same problem. I'm glad this is the case, considering the 2012 machine is where we first noticed the problem, and this means we do not all of a sudden have a widespread problem in our code. However, it does not help me solve the problem. Which there is...somewhere.

    The trouble is not with the threads terminating (agreed, the message I printed was misleading), but with the system command being run. Perl processes start up, but they do not terminate. Given that I'm executing a single print statement I would expect these processes to disappear rather quickly and not linger until I hit enter in the test script. Have any ideas or advice on how to debug this issue further?

    C:\>perl -v This is perl 5, version 18, subversion 2 (v5.18.2) built for MSWin32-x +64-multi-thread (with 1 registered patch, see perl -V for more detail) Copyright 1987-2013, Larry Wall Binary build 1801 [297964] provided by ActiveState http://www.ActiveSt +ate.com Built Feb 24 2014 11:06:47 Perl may be copied only under the terms of either the Artistic License + or the GNU General Public License, which may be found in the Perl 5 source ki +t. Complete documentation for Perl, including FAQ lists, should be found +on this system using "man perl" or "perldoc perl". If you have access to + the Internet, point your browser at http://www.perl.org/, the Perl Home Pa +ge. C:\>perl test.pl 1 ### Running a perl script ### 0s : Thread 0 - > Creating threads 0s : Thread 1 - Created 0s : Thread 2 - Created 0s : Thread 3 - Created 1s : Thread 0 - All Threads created 1s : Thread 0 - > Waiting for input now. All system commands should fi +nish without pressing enter 3s : Thread 2 - Starting 'perl -e "print \"hello world\""' 3s : Thread 3 - Starting 'perl -e "print \"hello world\""' 3s : Thread 1 - Starting 'perl -e "print \"hello world\""' 68s : Thread 0 - > Input received, all done 68s : Thread 1 - Finished the command: hello world 68s : Thread 2 - Finished the command: hello world 68s : Thread 3 - Finished the command: hello world 68s : Thread 0 - All Threads joined

      Could you try adding the -l option to your perl one line and try it on the errant system(s).


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

        Tried as you suggested, and there was no change at all :/

        C:\>test.pl 1 ### Running a perl script ### 0s : Thread 0 - > Creating threads 0s : Thread 1 - Created 0s : Thread 2 - Created 0s : Thread 3 - Created 1s : Thread 0 - All Threads created 1s : Thread 0 - > Waiting for input now. All threads should finish now + without pressing enter 3s : Thread 1 - Starting 'perl -le "print \"hello world\""' 3s : Thread 2 - Starting 'perl -le "print \"hello world\""' 3s : Thread 3 - Starting 'perl -le "print \"hello world\""' 17s : Thread 0 - > Input received, all done 17s : Thread 2 - Finished the command: hello world 17s : Thread 3 - Finished the command: hello world 17s : Thread 1 - Finished the command: hello world 17s : Thread 0 - All Threads joined