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 | BEGIN@3 | IPC::Open2::
0 | 0 | 0 | 0s | 0s | open2 | IPC::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 |