Thread: [poe-commits] SF.net SVN: poe: [1915] trunk/poe/lib/POE/Wheel/Run.pm
Brought to you by:
rcaputo
From: <rc...@us...> - 2006-03-29 04:22:59
|
Revision: 1915 Author: rcaputo Date: 2006-03-28 20:22:22 -0800 (Tue, 28 Mar 2006) ViewCVS: http://svn.sourceforge.net/poe/?rev=1915&view=rev Log Message: ----------- Chris Fedde, in rt.cpan.org ticket #16691, accidentally discovered a case where closing STDOUT and STDERR together, then opening them for redirection, was breaking STDIN in child processes. This fixes the case, but it does not close his original ticket. I'm committing this separately so I can check it out in Windows to make sure I didn't just break things there. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2006-03-28 21:37:31 UTC (rev 1914) +++ trunk/poe/lib/POE/Wheel/Run.pm 2006-03-29 04:22:22 UTC (rev 1915) @@ -283,20 +283,20 @@ # Fork! Woo-hoo! my $pid = fork; - # Stdio should not be tied. Resolves rt.cpan.org ticket 1648. - if (tied *STDOUT) { - carp "Cannot redirect into tied STDOUT. Untying it"; - untie *STDOUT; - } - if (tied *STDERR) { - carp "Cannot redirect into tied STDERR. Untying it"; - untie *STDERR; - } - # Child. Parent side continues after this block. unless ($pid) { croak "couldn't fork: $!" unless defined $pid; + # Stdio should not be tied. Resolves rt.cpan.org ticket 1648. + if (tied *STDOUT) { + carp "Cannot redirect into tied STDOUT. Untying it"; + untie *STDOUT; + } + if (tied *STDERR) { + carp "Cannot redirect into tied STDERR. Untying it"; + untie *STDERR; + } + # If running pty, we delay the slave side creation 'til after # doing the necessary bits to become our own [unix] session. if ($conduit eq 'pty') { @@ -395,30 +395,26 @@ close $stdout_read; close $stderr_read if defined $stderr_read; - # Need to close on Win32 because std handles aren't dup'ed, no - # harm elsewhere. Close STDERR later to not influence possible - # die. - close STDIN; - close STDOUT; + # Win32 needs the stdio handles closed before they're reopened + # because the standard handles aren't dup'd. # Redirect STDIN from the read end of the stdin pipe. + close STDIN; open( STDIN, "<&" . fileno($stdin_read) ) or die "can't redirect STDIN in child pid $$: $!"; # Redirect STDOUT to the write end of the stdout pipe. # The STDOUT_FILENO check snuck in on a patch. I'm not sure why # we care what the file descriptor is. + close STDOUT; open( STDOUT, ">&" . fileno($stdout_write) ) or die "can't redirect stdout in child pid $$: $!"; - # Need to close on Win32 because std handles aren't dup'ed, no - # harm elsewhere - close STDERR; - # Redirect STDERR to the write end of the stderr pipe. If the # stderr pipe's undef, then we use STDOUT. # The STDERR_FILENO check snuck in on a patch. I'm not sure why # we care what the file descriptor is. + close STDERR; open( STDERR, ">&" . fileno($stderr_write) ) or die "can't redirect stderr in child: $!"; @@ -482,7 +478,8 @@ eval { exec("$^X -e 0"); }; }; exit(0); - } else { + } + else { if (ref($program) eq 'ARRAY') { exec(@$program, @$prog_args) or die "can't exec (@$program) in child pid $$: $!"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2006-03-29 04:41:37
|
Revision: 1916 Author: rcaputo Date: 2006-03-28 20:41:20 -0800 (Tue, 28 Mar 2006) ViewCVS: http://svn.sourceforge.net/poe/?rev=1916&view=rev Log Message: ----------- Chris Fedde discovered that the "harmless" practice of closing STDIN, STDOUT, and STDERR before dup'ing them seems to cause a problem on Unix-based systems when the parent process doesn't have stdio handles of its own. This commit resolves his rt.cpan.org ticket, #16691. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2006-03-29 04:22:22 UTC (rev 1915) +++ trunk/poe/lib/POE/Wheel/Run.pm 2006-03-29 04:41:20 UTC (rev 1916) @@ -399,14 +399,14 @@ # because the standard handles aren't dup'd. # Redirect STDIN from the read end of the stdin pipe. - close STDIN; + close STDIN if POE::Kernel::RUNNING_IN_HELL; open( STDIN, "<&" . fileno($stdin_read) ) or die "can't redirect STDIN in child pid $$: $!"; # Redirect STDOUT to the write end of the stdout pipe. # The STDOUT_FILENO check snuck in on a patch. I'm not sure why # we care what the file descriptor is. - close STDOUT; + close STDOUT if POE::Kernel::RUNNING_IN_HELL; open( STDOUT, ">&" . fileno($stdout_write) ) or die "can't redirect stdout in child pid $$: $!"; @@ -414,7 +414,7 @@ # stderr pipe's undef, then we use STDOUT. # The STDERR_FILENO check snuck in on a patch. I'm not sure why # we care what the file descriptor is. - close STDERR; + close STDERR if POE::Kernel::RUNNING_IN_HELL; open( STDERR, ">&" . fileno($stderr_write) ) or die "can't redirect stderr in child: $!"; @@ -471,7 +471,8 @@ # Try to exit without triggering END or object destructors. # Give up with a plain exit if we must. - # On win32 cannot _exit as it will kill *all* threads, meaning parent too + # But we can't _exit on Win32 because it KILLS ALL THREADS, + # including the parent "process". unless (POE::Kernel::RUNNING_IN_HELL) { eval { POSIX::_exit(0); }; eval { kill KILL => $$; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2006-06-13 14:55:28
|
Revision: 1984 Author: rcaputo Date: 2006-06-13 07:55:10 -0700 (Tue, 13 Jun 2006) ViewCVS: http://svn.sourceforge.net/poe/?rev=1984&view=rev Log Message: ----------- Apply Randal Schwartz's support for pty-pipe, a POE::Wheel::Run hybrid conduit that allows stdio to use a pty and stderr to report out of band via a pipe. Resolves rt.cpan.org ticket 19607. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2006-06-13 14:31:33 UTC (rev 1983) +++ trunk/poe/lib/POE/Wheel/Run.pm 2006-06-13 14:55:10 UTC (rev 1984) @@ -151,10 +151,11 @@ croak "$type\'s Conduit type ($conduit) is unknown" if ( $conduit ne 'pipe' and $conduit ne 'pty' and + $conduit ne 'pty-pipe' and $conduit ne 'socketpair' and $conduit ne 'inet' ); - unless ($conduit eq "pty") { + unless ($conduit =~ /^pty(-pipe)?$/) { $stdio_type = $conduit; $conduit = "pipe"; } @@ -250,11 +251,17 @@ croak "could not create semaphore pipe: $!" unless defined $sem_pipe_read; # Use IO::Pty if requested. IO::Pty turns on autoflush for us. - if ($conduit eq 'pty') { + if ($conduit =~ /^pty(-pipe)?$/) { croak "IO::Pty is not available" unless PTY_AVAILABLE; $stdin_write = $stdout_read = IO::Pty->new(); croak "could not create master pty: $!" unless defined $stdout_read; + + if ($conduit eq "pty-pipe") { + ($stderr_read, $stderr_write) = POE::Pipe::OneWay->new(); + croak "could not make stderr pipes: $!" + unless defined $stderr_read and defined $stderr_write; + } } # Use pipes otherwise. @@ -299,15 +306,17 @@ # If running pty, we delay the slave side creation 'til after # doing the necessary bits to become our own [unix] session. - if ($conduit eq 'pty') { + if ($conduit =~ /^pty(-pipe)?$/) { # Become a new unix session. # Program 19.3, APITUE. W. Richard Stevens built my hot rod. eval 'setsid()' unless $no_setsid; # Open the slave side of the pty. - $stdin_read = $stdout_write = $stderr_write = $stdin_write->slave(); + $stdin_read = $stdout_write = $stdin_write->slave(); croak "could not create slave pty: $!" unless defined $stdin_read; + ## for a simple pty conduit, stderr is wedged into stdout: + $stderr_write = $stdout_write if $conduit eq 'pty'; # Acquire a controlling terminal. Program 19.3, APITUE. if (defined TIOCSCTTY and not defined CIBAUD) { @@ -1195,7 +1204,9 @@ communication to build a pipe between the parent and child processes. If a particular method is preferred, it can be set to "pipe", "socketpair", or "inet". It may also be set to "pty" if the child -process should have its own pseudo tty. +process should have its own pseudo tty. Setting it to "pty-pipe" +gives the child process a stdin and stdout pseudo-tty, but keeps +stderr as a pipe, rather than merging stdout and stderr as with "pty". The reasons to define this parameter would be if you want to use "pty", if the default pipe type doesn't work properly on your This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2006-07-15 07:26:38
|
Revision: 2009 Author: rcaputo Date: 2006-07-15 00:26:33 -0700 (Sat, 15 Jul 2006) ViewCVS: http://svn.sourceforge.net/poe/?rev=2009&view=rev Log Message: ----------- Update POE::Wheel::Run's SYNOPSIS per Mike Baas' feedback. Also fixed a problem where ClosedEvent was not firing without a StderrEvent being defined. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2006-07-04 06:41:42 UTC (rev 2008) +++ trunk/poe/lib/POE/Wheel/Run.pm 2006-07-15 07:26:33 UTC (rev 2009) @@ -507,9 +507,9 @@ close $stdout_write if defined $stdout_write; close $stderr_write if defined $stderr_write; - my $handle_count = 0; - $handle_count++ if defined $stdout_read; - $handle_count++ if defined $stderr_read; + my $active_count = 0; + $active_count++ if $stdout_event and $stdout_read; + $active_count++ if $stderr_event and $stderr_read; my $self = bless [ &POE::Wheel::allocate_wheel_id(), # UNIQUE_ID @@ -518,7 +518,7 @@ $program, # PROGRAM $pid, # CHILD_PID $conduit, # CONDUIT_TYPE - $handle_count, # IS_ACTIVE + $active_count, # IS_ACTIVE $close_on_call, # CLOSE_ON_CALL $stdio_type, # STDIO_TYPE # STDIN @@ -857,6 +857,12 @@ carp "ignoring unknown Run parameter '$name'"; } } + + # Recalculate the active handles count. + my $active_count = 0; + $active_count++ if $self->[EVENT_STDOUT] and $self->[HANDLE_STDOUT]; + $active_count++ if $self->[EVENT_STDERR] and $self->[HANDLE_STDERR]; + $self->[IS_ACTIVE] = $active_count; } #------------------------------------------------------------------------------ @@ -1125,35 +1131,33 @@ $program = [ '/usr/bin/cat', '-' ]; $wheel = POE::Wheel::Run->new( + # Set the program to execute, and optionally some parameters. Program => $program, - ProgramArgs => \@program_args, # Parameters for $program. - Priority => +5, # Adjust priority. May need to be root. - User => getpwnam('nobody'), # Adjust UID. May need to be root. - Group => getgrnam('nobody'), # Adjust GID. May need to be root. - ErrorEvent => 'oops', # Event to emit on errors. - CloseEvent => 'child_closed', # Child closed all output. + ProgramArgs => \@program_args, - StdinEvent => 'stdin', # Event to emit when stdin is flushed to child. - StdoutEvent => 'stdout', # Event to emit with child stdout information. - StderrEvent => 'stderr', # Event to emit with child stderr information. + # Define I/O events to emit. Most are optional. + StdinEvent => 'stdin', # Flushed all data to the child's STDIN. + StdoutEvent => 'stdout', # Received data from the child's STDOUT. + StderrEvent => 'stderr', # Received data from the child's STDERR. + ErrorEvent => 'oops', # An I/O error occurred. + CloseEvent => 'child_closed', # Child closed all output handles. - # Specify different I/O formats. + # Optionally adjust the child process priority, user ID, and/or + # group ID. You may need to be root to do this. + Priority => +5, + User => scalar(getpwnam 'nobody'), + Group => getgrnam('nobody'), + + # Optionally specify different I/O formats. StdinFilter => POE::Filter::Line->new(), # Child accepts input as lines. StdoutFilter => POE::Filter::Stream->new(), # Child output is a stream. StderrFilter => POE::Filter::Line->new(), # Child errors are lines. - # Set StdinFilter and StdoutFilter together. + # Shorthand to set StdinFilter and StdoutFilter together. StdioFilter => POE::Filter::Line->new(), # Or some other filter. - - # Specify different I/O methods. - StdinDriver => POE::Driver::SysRW->new(), # Defaults to SysRW. - StdoutDriver => POE::Driver::SysRW->new(), # Same. - StderrDriver => POE::Driver::SysRW->new(), # Same. - - # Set StdinDriver and StdoutDriver together. - StdioDriver => POE::Driver::SysRW->new(), ); + # Information about the wheel and its process. print "Unique wheel ID is : ", $wheel->ID; print "Wheel's child PID is: ", $wheel->PID; @@ -1161,8 +1165,7 @@ $wheel->put( 'input for the child' ); # Kill the child. - $wheel->kill(); # TERM by default - $wheel->kill(9); + $wheel->kill(9); # TERM by default. =head1 DESCRIPTION This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2006-07-24 22:17:40
|
Revision: 2012 Author: rcaputo Date: 2006-07-24 15:16:22 -0700 (Mon, 24 Jul 2006) ViewCVS: http://svn.sourceforge.net/poe/?rev=2012&view=rev Log Message: ----------- Remove a discussion of StderrEvent's parameters from the constructor argument documentation. Reference the event names documentation from the constructor argument section to EVENTS AND PARAMETERS, later in the document, where these things are documented in more detail. Thanks to Guillermo Roditi for pointing out the problem. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2006-07-23 17:07:36 UTC (rev 2011) +++ trunk/poe/lib/POE/Wheel/Run.pm 2006-07-24 22:16:22 UTC (rev 2012) @@ -1267,6 +1267,9 @@ =item StderrEvent +See L<EVENTS AND PARAMETERS> below for a more detailed description of +these events and their parameters. + C<CloseEvent> contains the name of an event to emit when the child process closes all its output handles. This is a consistent notification that the child will not be sending any more output. It @@ -1275,17 +1278,13 @@ C<ErrorEvent> contains the name of an event to emit if something fails. It is optional and if omitted, the wheel will not notify its -session if any errors occur. The event receives 5 parameters as -follows: ARG0 = the return value of syscall(), ARG1 = errno() - the -numeric value of the error generated, ARG2 = error() - a descriptive -for the given error, ARG3 = the wheel id, and ARG4 = the handle on -which the error occurred (stdout, stderr, etc.) +session if any errors occur. Wheel::Run requires at least one of the following three events: C<StdinEvent> contains the name of an event that Wheel::Run emits -whenever all its output has been flushed to the child process' STDIN -handle. +whenever everything queued by its put() method has been flushed to the +child's STDIN handle. C<StdoutEvent> and C<StderrEvent> contain names of events that Wheel::Run emits whenever the child process writes something to its @@ -1477,8 +1476,9 @@ parameters: C<ARG0> contains the name of the operation that failed. It may be -'read' or 'write' or 'fork' or 'exec' or something. The actual values -aren't yet defined. Note: This is not necessarily a function name. +'read', 'write', 'fork', 'exec' or the name of some other function or +task. The actual values aren't yet defined. Note: This is not +necessarily a function name. C<ARG1> and C<ARG2> hold numeric and string values for C<$!>, respectively. @@ -1511,9 +1511,9 @@ =item StderrEvent StdoutEvent and StderrEvent contain names for events that Wheel::Run -emits whenever the child process makes output. StdoutEvent contains -information the child wrote to its STDOUT handle, and StderrEvent -includes whatever arrived from the child's STDERR handle. +emits whenever the child process generates new output. StdoutEvent +contains information the child wrote to its STDOUT handle, and +StderrEvent includes whatever arrived from the child's STDERR handle. Both of these events come with two parameters. C<ARG0> contains the information that the child wrote. C<ARG1> holds the wheel's unique This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2006-08-19 22:26:40
|
Revision: 2049 Author: rcaputo Date: 2006-08-19 15:26:34 -0700 (Sat, 19 Aug 2006) ViewCVS: http://svn.sourceforge.net/poe/?rev=2049&view=rev Log Message: ----------- Remove tabs. Curse indentation! Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2006-08-19 22:23:54 UTC (rev 2048) +++ trunk/poe/lib/POE/Wheel/Run.pm 2006-08-19 22:26:34 UTC (rev 2049) @@ -507,9 +507,9 @@ close $stdout_write if defined $stdout_write; close $stderr_write if defined $stderr_write; - my $active_count = 0; - $active_count++ if $stdout_event and $stdout_read; - $active_count++ if $stderr_event and $stderr_read; + my $active_count = 0; + $active_count++ if $stdout_event and $stdout_read; + $active_count++ if $stderr_event and $stderr_read; my $self = bless [ &POE::Wheel::allocate_wheel_id(), # UNIQUE_ID @@ -858,11 +858,11 @@ } } - # Recalculate the active handles count. - my $active_count = 0; - $active_count++ if $self->[EVENT_STDOUT] and $self->[HANDLE_STDOUT]; - $active_count++ if $self->[EVENT_STDERR] and $self->[HANDLE_STDERR]; - $self->[IS_ACTIVE] = $active_count; + # Recalculate the active handles count. + my $active_count = 0; + $active_count++ if $self->[EVENT_STDOUT] and $self->[HANDLE_STDOUT]; + $active_count++ if $self->[EVENT_STDERR] and $self->[HANDLE_STDERR]; + $self->[IS_ACTIVE] = $active_count; } #------------------------------------------------------------------------------ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2006-09-01 04:04:18
|
Revision: 2085 http://svn.sourceforge.net/poe/?rev=2085&view=rev Author: rcaputo Date: 2006-08-31 21:04:14 -0700 (Thu, 31 Aug 2006) Log Message: ----------- Explain that read error 0 happens when the child closes one of its standard output handles. Also explain that "$!" eq "" when $! == 0 in Perl. Resolves rt.cpan.org ticket 19054. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2006-09-01 03:31:22 UTC (rev 2084) +++ trunk/poe/lib/POE/Wheel/Run.pm 2006-09-01 04:04:14 UTC (rev 2085) @@ -1491,7 +1491,8 @@ necessarily a function name. C<ARG1> and C<ARG2> hold numeric and string values for C<$!>, -respectively. +respectively. C<"$!"> will eq C<""> for read error 0 (child process +closed STDOUT or STDERR). C<ARG3> contains the wheel's unique ID. @@ -1505,6 +1506,7 @@ sub error_state { my ($operation, $errnum, $errstr, $wheel_id) = @_[ARG0..ARG3]; + $errstr = "remote end closed" if $operation eq "read" and !$errnum; warn "Wheel $wheel_id generated $operation error $errnum: $errstr\n"; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bin...@us...> - 2007-01-14 18:10:01
|
Revision: 2169 http://svn.sourceforge.net/poe/?rev=2169&view=rev Author: bingosnet Date: 2007-01-14 10:09:57 -0800 (Sun, 14 Jan 2007) Log Message: ----------- Documented new POE::Wheel::Run MSWin32 behaviour Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2007-01-14 05:59:10 UTC (rev 2168) +++ trunk/poe/lib/POE/Wheel/Run.pm 2007-01-14 18:09:57 UTC (rev 2169) @@ -1422,6 +1422,11 @@ exec(@$array). This form of exec() doesn't expand shell metacharacters. +On MSWin32, L<Win32::Process> is used to spawn the new process. POE::Wheel::Run +joins C<Program> and C<ProgramArgs> with spaces to form the commandline that +Win32::Process::Create requires. Any spaces will cause items to be wrapped in double +quotes. + If C<Program> holds a code reference, it will be called in the forked child process, and then the child will exit. This allows Wheel::Run to fork off bits of long-running code which can accept STDIN input and This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bin...@us...> - 2007-02-03 07:16:03
|
Revision: 2172 http://svn.sourceforge.net/poe/?rev=2172&view=rev Author: bingosnet Date: 2007-02-02 23:16:01 -0800 (Fri, 02 Feb 2007) Log Message: ----------- Rolled back changes to POE::Wheel::Run Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2007-01-18 19:51:37 UTC (rev 2171) +++ trunk/poe/lib/POE/Wheel/Run.pm 2007-02-03 07:16:01 UTC (rev 2172) @@ -34,13 +34,6 @@ eval { require Win32API::File; }; if ($@) { die "Win32API::File but failed to load:\n$@" } else { Win32API::File->import( qw(FdGetOsFHandle) ); }; - - eval { require Win32::Process; }; - if ($@) { die "Win32::Process but failed to load:\n$@" } - else { Win32::Process->import( qw(INFINITE CREATE_NEW_PROCESS_GROUP) ); }; - - eval { require Win32; }; - if ($@) { die "Win32 but failed to load:\n$@" } } # How else can I get them out?! @@ -110,8 +103,6 @@ sub EVENT_STDERR () { 23 } sub STATE_STDERR () { 24 } -sub MSWIN32_GROUP_PID () { 25 } - # Used to work around a bug in older perl versions. sub CRIMSON_SCOPE_HACK ($) { 0 } @@ -442,10 +433,8 @@ # Tell the parent that the stdio has been set up. close $sem_pipe_read; - unless ( POE::Kernel::RUNNING_IN_HELL and ref($program) ne 'CODE' ) { - print $sem_pipe_write "go\n"; - close $sem_pipe_write; - } + print $sem_pipe_write "go\n"; + close $sem_pipe_write; if (POE::Kernel::RUNNING_IN_HELL) { # The Win32 pseudo fork sets up the std handles in the child @@ -500,65 +489,16 @@ }; exit(0); } - - # RUNNING_IN_HELL use Win32::Process to create a pucker new - # shiny process. It'll inherit our processes handles which is - # neat. - if ( POE::Kernel::RUNNING_IN_HELL ) { - my $exitcode = 0; - # Close any close-on-exec file descriptors. Except STDIN, - # STDOUT, and STDERR, of course. - if ($close_on_call) { - for (0..MAX_OPEN_FDS-1) { - next if fileno(STDIN) == $_; - next if fileno(STDOUT) == $_; - next if fileno(STDERR) == $_; - POSIX::close($_); - } - } - - my ($appname, $cmdline); - - if (ref($program) eq 'ARRAY') { - $appname = $program->[0] =~ /\s/ ? qq{"$program->[0]"} : $program->[0]; - $cmdline = join(' ', map { /\s/ ? qq{"$_"} : $_ } (@$program, @$prog_args) ); - } - else { - $appname = $program =~ /\s/ ? qq{"$program"} : $program; - $cmdline = join(' ', map { /\s/ ? qq{"$_"} : $_ } ($program, @$prog_args) ); - } - - my $w32process; - - unless ( Win32::Process::Create( $w32process, $appname, $cmdline, 1, 0x00000200, '.' ) ) { - print $sem_pipe_write "go\n"; - close $sem_pipe_write; - die Win32::FormatMessage( Win32::GetLastError() ); - } - else { - my $w32pid = $w32process->GetProcessID(); - print $sem_pipe_write "$w32pid\n"; - close $sem_pipe_write; - $w32process->Wait(0xFFFFFFFF); - $w32process->GetExitCode($exitcode); - } - - # In case flushing them wasn't good enough. - close STDOUT if defined fileno(STDOUT); - close STDERR if defined fileno(STDERR); - - exit($exitcode); - } - - if (ref($program) eq 'ARRAY') { - exec(@$program, @$prog_args) - or die "can't exec (@$program) in child pid $$: $!"; - } else { - exec(join(" ", $program, @$prog_args)) - or die "can't exec ($program) in child pid $$: $!"; + if (ref($program) eq 'ARRAY') { + exec(@$program, @$prog_args) + or die "can't exec (@$program) in child pid $$: $!"; + } + else { + exec(join(" ", $program, @$prog_args)) + or die "can't exec ($program) in child pid $$: $!"; + } } - die "insanity check passed"; } @@ -600,13 +540,10 @@ $stderr_driver, # DRIVER_STDERR $stderr_event, # EVENT_STDERR undef, # STATE_STDERR - undef, # MSWIN32_GROUP_PID ], $type; # Wait here while the child sets itself up. - my $chldout = <$sem_pipe_read>; - chomp $chldout; - $self->[MSWIN32_GROUP_PID] = $chldout if POE::Kernel::RUNNING_IN_HELL and $chldout ne 'go'; + <$sem_pipe_read>; close $sem_pipe_read; close $sem_pipe_write; @@ -1185,12 +1122,7 @@ sub kill { my ($self, $signal) = @_; $signal = 'TERM' unless defined $signal; - if ( $self->[MSWIN32_GROUP_PID] ) { - Win32::Process::KillProcess( $self->[MSWIN32_GROUP_PID], 0 ); - } - else { - eval { kill $signal, $self->[CHILD_PID] }; - } + eval { kill $signal, $self->[CHILD_PID] }; } ############################################################################### @@ -1422,11 +1354,6 @@ exec(@$array). This form of exec() doesn't expand shell metacharacters. -On MSWin32, L<Win32::Process> is used to spawn the new process. POE::Wheel::Run -joins C<Program> and C<ProgramArgs> with spaces to form the commandline that -Win32::Process::Create requires. Any spaces will cause items to be wrapped in double -quotes. - If C<Program> holds a code reference, it will be called in the forked child process, and then the child will exit. This allows Wheel::Run to fork off bits of long-running code which can accept STDIN input and This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2007-02-24 20:23:30
|
Revision: 2175 http://svn.sourceforge.net/poe/?rev=2175&view=rev Author: rcaputo Date: 2007-02-24 12:23:30 -0800 (Sat, 24 Feb 2007) Log Message: ----------- Fix a doc bug found by Randal Schwartz. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2007-02-20 23:13:48 UTC (rev 2174) +++ trunk/poe/lib/POE/Wheel/Run.pm 2007-02-24 20:23:30 UTC (rev 2175) @@ -1156,7 +1156,7 @@ # group ID. You may need to be root to do this. Priority => +5, User => scalar(getpwnam 'nobody'), - Group => getgrnam('nobody'), + Group => scalar(getgrnam 'nobody'), # Optionally specify different I/O formats. StdinFilter => POE::Filter::Line->new(), # Child accepts input as lines. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2007-03-21 07:55:16
|
Revision: 2179 http://svn.sourceforge.net/poe/?rev=2179&view=rev Author: rcaputo Date: 2007-03-21 00:55:15 -0700 (Wed, 21 Mar 2007) Log Message: ----------- Eric Busto discovered that POE::Wheel::Run depended on $/ to be the default. This is not always the case, and deviations result in new() hanging forever. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2007-03-18 20:16:17 UTC (rev 2178) +++ trunk/poe/lib/POE/Wheel/Run.pm 2007-03-21 07:55:15 UTC (rev 2179) @@ -543,7 +543,10 @@ ], $type; # Wait here while the child sets itself up. - <$sem_pipe_read>; + { + local $/ = "\n"; + <$sem_pipe_read>; + } close $sem_pipe_read; close $sem_pipe_write; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2008-03-23 01:23:29
|
Revision: 2294 http://poe.svn.sourceforge.net/poe/?rev=2294&view=rev Author: rcaputo Date: 2008-03-22 18:23:36 -0700 (Sat, 22 Mar 2008) Log Message: ----------- Contrary to the docs, IO::Pty's clone_winsize_from() seems to die noisily if the source filehandle isn't a tty. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2008-03-23 01:19:48 UTC (rev 2293) +++ trunk/poe/lib/POE/Wheel/Run.pm 2008-03-23 01:23:36 UTC (rev 2294) @@ -301,7 +301,7 @@ # Set the pty conduit (slave side) window size to our window # size. APITUE 19.4 and 19.5. - $stdin_read->clone_winsize_from(\*STDIN); + eval { $stdin_read->clone_winsize_from(\*STDIN) }; } # Reset all signals in the child process. POE's own handlers are This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bin...@us...> - 2008-04-02 14:08:34
|
Revision: 2308 http://poe.svn.sourceforge.net/poe/?rev=2308&view=rev Author: bingosnet Date: 2008-04-02 07:08:34 -0700 (Wed, 02 Apr 2008) Log Message: ----------- Added setpgrp() to POE::Wheel::Run to change process group of child process, if supported by the OS. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2008-03-31 11:46:07 UTC (rev 2307) +++ trunk/poe/lib/POE/Wheel/Run.pm 2008-04-02 14:08:34 UTC (rev 2308) @@ -204,6 +204,7 @@ my $close_event = delete $params{CloseEvent}; my $no_setsid = delete $params{NoSetSid}; + my $no_setpgrp = delete $params{NoSetpgrp}; # Make sure the user didn't pass in parameters we're not aware of. if (scalar keys %params) { @@ -303,6 +304,9 @@ # size. APITUE 19.4 and 19.5. eval { $stdin_read->clone_winsize_from(\*STDIN) }; } + else { + eval 'setpgrp(0,0)' unless $no_setpgrp; + } # Reset all signals in the child process. POE's own handlers are # silly to keep around in the child process since POE won't be @@ -1284,6 +1288,13 @@ default, setsid() is called to execute the child process in a separate Unix session. +=item NoSetpgrp + +When true, C<NoSetpgrp> disables setprgp() in the child process. By +default, setprgp() is called to change the process group for the child +process, if the OS supports process groups. If the conduit is a pty or +pty-pipe setsid() is used instead, see C<NoSetSid>. + =item Priority C<Priority> contains an offset from the current process's priority. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2008-04-02 16:40:43
|
Revision: 2309 http://poe.svn.sourceforge.net/poe/?rev=2309&view=rev Author: rcaputo Date: 2008-04-02 09:37:14 -0700 (Wed, 02 Apr 2008) Log Message: ----------- Change the name of Setpgrp to SetPgrp to follow the form of SetSid. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2008-04-02 14:08:34 UTC (rev 2308) +++ trunk/poe/lib/POE/Wheel/Run.pm 2008-04-02 16:37:14 UTC (rev 2309) @@ -204,7 +204,7 @@ my $close_event = delete $params{CloseEvent}; my $no_setsid = delete $params{NoSetSid}; - my $no_setpgrp = delete $params{NoSetpgrp}; + my $no_setpgrp = delete $params{NoSetPgrp}; # Make sure the user didn't pass in parameters we're not aware of. if (scalar keys %params) { @@ -1288,9 +1288,9 @@ default, setsid() is called to execute the child process in a separate Unix session. -=item NoSetpgrp +=item NoSetPgrp -When true, C<NoSetpgrp> disables setprgp() in the child process. By +When true, C<NoSetPgrp> disables setprgp() in the child process. By default, setprgp() is called to change the process group for the child process, if the OS supports process groups. If the conduit is a pty or pty-pipe setsid() is used instead, see C<NoSetSid>. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rc...@us...> - 2008-06-26 04:51:08
|
Revision: 2358 http://poe.svn.sourceforge.net/poe/?rev=2358&view=rev Author: rcaputo Date: 2008-06-25 21:51:13 -0700 (Wed, 25 Jun 2008) Log Message: ----------- Minor NAME update. Modified Paths: -------------- trunk/poe/lib/POE/Wheel/Run.pm Modified: trunk/poe/lib/POE/Wheel/Run.pm =================================================================== --- trunk/poe/lib/POE/Wheel/Run.pm 2008-06-20 17:41:54 UTC (rev 2357) +++ trunk/poe/lib/POE/Wheel/Run.pm 2008-06-26 04:51:13 UTC (rev 2358) @@ -1078,14 +1078,13 @@ eval { kill $signal, $self->[CHILD_PID] }; } -############################################################################### 1; __END__ =head1 NAME -POE::Wheel::Run - event driven fork/exec with added value +POE::Wheel::Run - abstract pipe/fork/exec mix-in (also runs subroutines) =head1 SYNOPSIS This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |