| Filename | /2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/5.12.3/IPC/Open2.pm |
| Statements | Executed 11 statements in 238µs |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 12µs | 14µs | IPC::Open2::BEGIN@3 |
| 0 | 0 | 0 | 0s | 0s | IPC::Open2::open2 |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package IPC::Open2; | ||||
| 2 | |||||
| 3 | 3 | 138µs | 2 | 17µs | # spent 14µs (12+2) within IPC::Open2::BEGIN@3 which was called:
# once (12µs+2µs) by Net::SSH::BEGIN@9 at line 3 # spent 14µs making 1 call to IPC::Open2::BEGIN@3
# spent 2µs making 1 call to strict::import |
| 4 | 1 | 400ns | our ($VERSION, @ISA, @EXPORT); | ||
| 5 | |||||
| 6 | 1 | 27µs | require 5.000; | ||
| 7 | 1 | 400ns | require Exporter; | ||
| 8 | |||||
| 9 | 1 | 300ns | $VERSION = 1.03; | ||
| 10 | 1 | 5µs | @ISA = qw(Exporter); | ||
| 11 | 1 | 600ns | @EXPORT = qw(open2); | ||
| 12 | |||||
| 13 | =head1 NAME | ||||
| 14 | |||||
| 15 | IPC::Open2 - open a process for both reading and writing using open2() | ||||
| 16 | |||||
| 17 | =head1 SYNOPSIS | ||||
| 18 | |||||
| 19 | use IPC::Open2; | ||||
| 20 | |||||
| 21 | $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some cmd and args'); | ||||
| 22 | # or without using the shell | ||||
| 23 | $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some', 'cmd', 'and', 'args'); | ||||
| 24 | |||||
| 25 | # or with handle autovivification | ||||
| 26 | my($chld_out, $chld_in); | ||||
| 27 | $pid = open2($chld_out, $chld_in, 'some cmd and args'); | ||||
| 28 | # or without using the shell | ||||
| 29 | $pid = open2($chld_out, $chld_in, 'some', 'cmd', 'and', 'args'); | ||||
| 30 | |||||
| 31 | waitpid( $pid, 0 ); | ||||
| 32 | my $child_exit_status = $? >> 8; | ||||
| 33 | |||||
| 34 | =head1 DESCRIPTION | ||||
| 35 | |||||
| 36 | The open2() function runs the given $cmd and connects $chld_out for | ||||
| 37 | reading and $chld_in for writing. It's what you think should work | ||||
| 38 | when you try | ||||
| 39 | |||||
| 40 | $pid = open(HANDLE, "|cmd args|"); | ||||
| 41 | |||||
| 42 | The write filehandle will have autoflush turned on. | ||||
| 43 | |||||
| 44 | If $chld_out is a string (that is, a bareword filehandle rather than a glob | ||||
| 45 | or a reference) and it begins with C<< >& >>, then the child will send output | ||||
| 46 | directly to that file handle. If $chld_in is a string that begins with | ||||
| 47 | C<< <& >>, then $chld_in will be closed in the parent, and the child will | ||||
| 48 | read from it directly. In both cases, there will be a dup(2) instead of a | ||||
| 49 | pipe(2) made. | ||||
| 50 | |||||
| 51 | If either reader or writer is the null string, this will be replaced | ||||
| 52 | by an autogenerated filehandle. If so, you must pass a valid lvalue | ||||
| 53 | in the parameter slot so it can be overwritten in the caller, or | ||||
| 54 | an exception will be raised. | ||||
| 55 | |||||
| 56 | open2() returns the process ID of the child process. It doesn't return on | ||||
| 57 | failure: it just raises an exception matching C</^open2:/>. However, | ||||
| 58 | C<exec> failures in the child are not detected. You'll have to | ||||
| 59 | trap SIGPIPE yourself. | ||||
| 60 | |||||
| 61 | open2() does not wait for and reap the child process after it exits. | ||||
| 62 | Except for short programs where it's acceptable to let the operating system | ||||
| 63 | take care of this, you need to do this yourself. This is normally as | ||||
| 64 | simple as calling C<waitpid $pid, 0> when you're done with the process. | ||||
| 65 | Failing to do this can result in an accumulation of defunct or "zombie" | ||||
| 66 | processes. See L<perlfunc/waitpid> for more information. | ||||
| 67 | |||||
| 68 | This whole affair is quite dangerous, as you may block forever. It | ||||
| 69 | assumes it's going to talk to something like B<bc>, both writing | ||||
| 70 | to it and reading from it. This is presumably safe because you | ||||
| 71 | "know" that commands like B<bc> will read a line at a time and | ||||
| 72 | output a line at a time. Programs like B<sort> that read their | ||||
| 73 | entire input stream first, however, are quite apt to cause deadlock. | ||||
| 74 | |||||
| 75 | The big problem with this approach is that if you don't have control | ||||
| 76 | over source code being run in the child process, you can't control | ||||
| 77 | what it does with pipe buffering. Thus you can't just open a pipe to | ||||
| 78 | C<cat -v> and continually read and write a line from it. | ||||
| 79 | |||||
| 80 | The IO::Pty and Expect modules from CPAN can help with this, as they | ||||
| 81 | provide a real tty (well, a pseudo-tty, actually), which gets you | ||||
| 82 | back to line buffering in the invoked command again. | ||||
| 83 | |||||
| 84 | =head1 WARNING | ||||
| 85 | |||||
| 86 | The order of arguments differs from that of open3(). | ||||
| 87 | |||||
| 88 | =head1 SEE ALSO | ||||
| 89 | |||||
| 90 | See L<IPC::Open3> for an alternative that handles STDERR as well. This | ||||
| 91 | function is really just a wrapper around open3(). | ||||
| 92 | |||||
| 93 | =cut | ||||
| 94 | |||||
| 95 | # &open2: tom christiansen, <tchrist@convex.com> | ||||
| 96 | # | ||||
| 97 | # usage: $pid = open2('rdr', 'wtr', 'some cmd and args'); | ||||
| 98 | # or $pid = open2('rdr', 'wtr', 'some', 'cmd', 'and', 'args'); | ||||
| 99 | # | ||||
| 100 | # spawn the given $cmd and connect $rdr for | ||||
| 101 | # reading and $wtr for writing. return pid | ||||
| 102 | # of child, or 0 on failure. | ||||
| 103 | # | ||||
| 104 | # WARNING: this is dangerous, as you may block forever | ||||
| 105 | # unless you are very careful. | ||||
| 106 | # | ||||
| 107 | # $wtr is left unbuffered. | ||||
| 108 | # | ||||
| 109 | # abort program if | ||||
| 110 | # rdr or wtr are null | ||||
| 111 | # a system call fails | ||||
| 112 | |||||
| 113 | 1 | 61µs | require IPC::Open3; | ||
| 114 | |||||
| 115 | sub open2 { | ||||
| 116 | local $Carp::CarpLevel = $Carp::CarpLevel + 1; | ||||
| 117 | return IPC::Open3::_open3('open2', scalar caller, | ||||
| 118 | $_[1], $_[0], '>&STDERR', @_[2 .. $#_]); | ||||
| 119 | } | ||||
| 120 | |||||
| 121 | 1 | 6µs | 1 |