in reply to Re^2: STDOUT missing on Windows, works on Unix
in thread STDOUT missing on Windows, works on Unix
Actually, I do use windows and do know a little about what's going on.
The difference is that on *nix, you're creating a process tree like this:
yourshell perl bugSTDOUT.pl perl bugSTDOUTb.pl perl bugSTDOUTc.pl
Under windows it looks like this:
cmd.exe perl bugSTDOUT.pl * cmd.exe * perl bugSTDOUTb.pl * cmd.exe perl bugSTDOUTc.pl
I could go on to mention the pipe instance that is shared between the three marked processes; and the need to explicitly set a flag on a CreateProcess call to cause spawned process to inherit handles from its parent, but you likely wouldn't be interested.
If you more exactly emulate the *nix handling of the situation, by suppressing the creation of those intermediary shell processes with their associated virtual consoles, thus:
C:\test>type bug* bugSTDOUT.pl #!/usr/bin/perl print STDOUT "Running bugSTDOUTb.pl with backticks\n"; print STDOUT "stdout from bugSTDOUTb.pl=" . `$^X bugSTDOUTb.pl` . "\n" +; bugSTDOUTb.pl #!/usr/bin/perl print STDOUT "Running bugSTDOUTc.pl with system()\n"; system( $^X, 'bugSTDOUTc.pl' ); print STDOUT "$0 done\n"; bugSTDOUTc.pl #!/usr/bin/perl print STDOUT "Hello world!\n";
You get the behaviour you are seeking:
C:\test>bugSTDOUT.pl Running bugSTDOUTb.pl with backticks stdout from bugSTDOUTb.pl=Running bugSTDOUTc.pl with system() Hello world! bugSTDOUTb.pl done
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: STDOUT missing on Windows, works on Unix (Solution)
by abecher (Novice) on Dec 13, 2008 at 19:33 UTC | |
by ikegami (Patriarch) on Dec 13, 2008 at 19:45 UTC |