Profile of IPC/Open2.pm

← Index
NYTProf Performance Profile «block view•line view•sub view»
For xt/tapper-mcp-scheduler-with-db-longrun.t
Run on Tue May 22 17:18:39 2012
Reported on Tue May 22 17:23:04 2012

Filename | /2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/5.12.3/IPC/Open2.pm
Statements | Executed 11 statements in 238µs

Subroutines
Calls | P | F | Exclusive Time | Inclusive Time | Subroutine
--- | --- | --- | --- | --- | ---
1 | 1 | 1 | 12µs | 14µs | IPC::Open2::::BEGIN@3IPC::Open2::BEGIN@3
0 | 0 | 0 | 0s | 0s | IPC::Open2::::open2IPC::Open2::open2

Call graph for these subroutines as a Graphviz dot language file.

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 use strict; # 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