nytprof run results of /variantgraph/<ID> and /relation/<ID>/relationships
[scpubgit/stemmatology.git] / stemmaweb / nytprof-runs / relation-uuid-relationships / IPC-Run-pm-733-sub.html
diff --git a/stemmaweb/nytprof-runs/relation-uuid-relationships/IPC-Run-pm-733-sub.html b/stemmaweb/nytprof-runs/relation-uuid-relationships/IPC-Run-pm-733-sub.html
new file mode 100644 (file)
index 0000000..7b268b3
--- /dev/null
@@ -0,0 +1,4706 @@
+    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+    <html xmlns="http://www.w3.org/1999/xhtml">
+<!--
+This file was generated by Devel::NYTProf version 4.06
+-->
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta http-equiv="Content-Language" content="en-us" />
+    <title>Profile of IPC/Run.pm</title>
+<link rel="stylesheet" type="text/css" href="style.css" />
+    <script type="text/javascript" src="js/jquery-min.js"></script> 
+
+    <script type="text/javascript" src="js/jquery-tablesorter-min.js"></script> 
+    <link rel="stylesheet" type="text/css" href="js/style-tablesorter.css" />
+    <script type="text/javascript">
+    // when a column is first clicked on to sort it, use descending order
+    // XXX doesn't seem to work (and not just because the tablesorter formatSortingOrder() is broken)
+    $.tablesorter.defaults.sortInitialOrder = "desc";
+    // add parser through the tablesorter addParser method 
+    $.tablesorter.addParser({
+        id: 'fmt_time',   // name of this parser
+        is: function(s) { 
+            return false; // return false so this parser is not auto detected 
+        }, 
+        format: function(orig) { // format data for normalization 
+            // console.log(orig);
+            val = orig.replace(/ns/,'');
+            if (val != orig) { return val / (1000*1000*1000); } 
+            val = orig.replace(/µs/,''); /* XXX use &micro; ? */
+            if (val != orig) { return val / (1000*1000); } 
+            var val = orig.replace(/ms/,'');
+            if (val != orig) { return val / (1000); }
+            var val = orig.replace(/s/,'');
+            if (val != orig) { return val; }
+            if (orig == '0') { return orig; } 
+            console.log('no match for fmt_time of '.concat(orig));
+            return orig;
+        },
+        type: 'numeric' // set type, either numeric or text 
+    }); 
+    </script> 
+</head>
+
+<body > 
+<div class="header" style="position: relative; overflow-x: hidden; overflow-y: hidden; z-index: 0; ">
+<div class="header_back">
+            <a href="index.html">&larr; Index</a>
+        </div>
+<div class="headerForeground" style="float: left">
+    <span class="siteTitle">NYTProf Performance Profile</span>
+    <span class="siteSubtitle">&emsp;&emsp;<span>&laquo;&emsp;<span class="mode_btn"><a href="IPC-Run-pm-733-block.html">block view</a></span>&emsp;&bull;&emsp;<span class="mode_btn"><a href="IPC-Run-pm-733-line.html">line view</a></span>&emsp;&bull;&emsp;<span class="mode_btn mode_btn_selected">sub view</span>&emsp;&raquo;</span><br />
+            For script/nytprof.pl
+        </span>
+</div>
+<div class="headerForeground" style="float: right; text-align: right">
+    <span class="siteTitle">&nbsp;</span>
+    <span class="siteSubtitle">Run on Thu May 31 16:49:15 2012<br />Reported on Thu May 31 16:50:47 2012</span>
+</div>
+<div style="position: absolute; left: 0px; top: 0%; width: 100%; height: 101%; z-index: -1; background-color: rgb(17, 136, 255); "></div>
+<div style="position: absolute; left: 0px; top: 2%; width: 100%; height: 99%; z-index: -1; background-color: rgb(16, 134, 253); "></div>
+<div style="position: absolute; left: 0px; top: 4%; width: 100%; height: 97%; z-index: -1; background-color: rgb(16, 133, 252); "></div>
+<div style="position: absolute; left: 0px; top: 6%; width: 100%; height: 95%; z-index: -1; background-color: rgb(15, 131, 250); "></div>
+<div style="position: absolute; left: 0px; top: 8%; width: 100%; height: 93%; z-index: -1; background-color: rgb(15, 130, 249); "></div>
+<div style="position: absolute; left: 0px; top: 10%; width: 100%; height: 91%; z-index: -1; background-color: rgb(15, 129, 248); "></div>
+<div style="position: absolute; left: 0px; top: 12%; width: 100%; height: 89%; z-index: -1; background-color: rgb(14, 127, 246); "></div>
+<div style="position: absolute; left: 0px; top: 14%; width: 100%; height: 87%; z-index: -1; background-color: rgb(14, 126, 245); "></div>
+<div style="position: absolute; left: 0px; top: 16%; width: 100%; height: 85%; z-index: -1; background-color: rgb(14, 125, 244); "></div>
+<div style="position: absolute; left: 0px; top: 18%; width: 100%; height: 83%; z-index: -1; background-color: rgb(13, 123, 242); "></div>
+<div style="position: absolute; left: 0px; top: 20%; width: 100%; height: 81%; z-index: -1; background-color: rgb(13, 122, 241); "></div>
+<div style="position: absolute; left: 0px; top: 22%; width: 100%; height: 79%; z-index: -1; background-color: rgb(13, 121, 240); "></div>
+<div style="position: absolute; left: 0px; top: 24%; width: 100%; height: 77%; z-index: -1; background-color: rgb(12, 119, 238); "></div>
+<div style="position: absolute; left: 0px; top: 26%; width: 100%; height: 75%; z-index: -1; background-color: rgb(12, 118, 237); "></div>
+<div style="position: absolute; left: 0px; top: 28%; width: 100%; height: 73%; z-index: -1; background-color: rgb(12, 116, 235); "></div>
+<div style="position: absolute; left: 0px; top: 30%; width: 100%; height: 71%; z-index: -1; background-color: rgb(11, 115, 234); "></div>
+<div style="position: absolute; left: 0px; top: 32%; width: 100%; height: 69%; z-index: -1; background-color: rgb(11, 114, 233); "></div>
+<div style="position: absolute; left: 0px; top: 34%; width: 100%; height: 67%; z-index: -1; background-color: rgb(11, 112, 231); "></div>
+<div style="position: absolute; left: 0px; top: 36%; width: 100%; height: 65%; z-index: -1; background-color: rgb(10, 111, 230); "></div>
+<div style="position: absolute; left: 0px; top: 38%; width: 100%; height: 63%; z-index: -1; background-color: rgb(10, 110, 229); "></div>
+<div style="position: absolute; left: 0px; top: 40%; width: 100%; height: 61%; z-index: -1; background-color: rgb(10, 108, 227); "></div>
+<div style="position: absolute; left: 0px; top: 42%; width: 100%; height: 59%; z-index: -1; background-color: rgb(9, 107, 226); "></div>
+<div style="position: absolute; left: 0px; top: 44%; width: 100%; height: 57%; z-index: -1; background-color: rgb(9, 106, 225); "></div>
+<div style="position: absolute; left: 0px; top: 46%; width: 100%; height: 55%; z-index: -1; background-color: rgb(9, 104, 223); "></div>
+<div style="position: absolute; left: 0px; top: 48%; width: 100%; height: 53%; z-index: -1; background-color: rgb(8, 103, 222); "></div>
+<div style="position: absolute; left: 0px; top: 50%; width: 100%; height: 51%; z-index: -1; background-color: rgb(8, 102, 221); "></div>
+<div style="position: absolute; left: 0px; top: 52%; width: 100%; height: 49%; z-index: -1; background-color: rgb(8, 100, 219); "></div>
+<div style="position: absolute; left: 0px; top: 54%; width: 100%; height: 47%; z-index: -1; background-color: rgb(7, 99, 218); "></div>
+<div style="position: absolute; left: 0px; top: 56%; width: 100%; height: 45%; z-index: -1; background-color: rgb(7, 97, 216); "></div>
+<div style="position: absolute; left: 0px; top: 58%; width: 100%; height: 43%; z-index: -1; background-color: rgb(7, 96, 215); "></div>
+<div style="position: absolute; left: 0px; top: 60%; width: 100%; height: 41%; z-index: -1; background-color: rgb(6, 95, 214); "></div>
+<div style="position: absolute; left: 0px; top: 62%; width: 100%; height: 39%; z-index: -1; background-color: rgb(6, 93, 212); "></div>
+<div style="position: absolute; left: 0px; top: 64%; width: 100%; height: 37%; z-index: -1; background-color: rgb(6, 92, 211); "></div>
+<div style="position: absolute; left: 0px; top: 66%; width: 100%; height: 35%; z-index: -1; background-color: rgb(5, 91, 210); "></div>
+<div style="position: absolute; left: 0px; top: 68%; width: 100%; height: 33%; z-index: -1; background-color: rgb(5, 89, 208); "></div>
+<div style="position: absolute; left: 0px; top: 70%; width: 100%; height: 31%; z-index: -1; background-color: rgb(5, 88, 207); "></div>
+<div style="position: absolute; left: 0px; top: 72%; width: 100%; height: 29%; z-index: -1; background-color: rgb(4, 87, 206); "></div>
+<div style="position: absolute; left: 0px; top: 74%; width: 100%; height: 27%; z-index: -1; background-color: rgb(4, 85, 204); "></div>
+<div style="position: absolute; left: 0px; top: 76%; width: 100%; height: 25%; z-index: -1; background-color: rgb(4, 84, 203); "></div>
+<div style="position: absolute; left: 0px; top: 78%; width: 100%; height: 23%; z-index: -1; background-color: rgb(3, 82, 201); "></div>
+<div style="position: absolute; left: 0px; top: 80%; width: 100%; height: 21%; z-index: -1; background-color: rgb(3, 81, 200); "></div>
+<div style="position: absolute; left: 0px; top: 82%; width: 100%; height: 19%; z-index: -1; background-color: rgb(3, 80, 199); "></div>
+<div style="position: absolute; left: 0px; top: 84%; width: 100%; height: 17%; z-index: -1; background-color: rgb(2, 78, 197); "></div>
+<div style="position: absolute; left: 0px; top: 86%; width: 100%; height: 15%; z-index: -1; background-color: rgb(2, 77, 196); "></div>
+<div style="position: absolute; left: 0px; top: 88%; width: 100%; height: 13%; z-index: -1; background-color: rgb(2, 76, 195); "></div>
+<div style="position: absolute; left: 0px; top: 90%; width: 100%; height: 11%; z-index: -1; background-color: rgb(1, 74, 193); "></div>
+<div style="position: absolute; left: 0px; top: 92%; width: 100%; height: 9%; z-index: -1; background-color: rgb(1, 73, 192); "></div>
+<div style="position: absolute; left: 0px; top: 94%; width: 100%; height: 7%; z-index: -1; background-color: rgb(1, 72, 191); "></div>
+<div style="position: absolute; left: 0px; top: 96%; width: 100%; height: 5%; z-index: -1; background-color: rgb(0, 70, 189); "></div>
+<div style="position: absolute; left: 0px; top: 98%; width: 100%; height: 3%; z-index: -1; background-color: rgb(0, 69, 188); "></div>
+<div style="position: absolute; left: 0px; top: 100%; width: 100%; height: 1%; z-index: -1; background-color: rgb(0, 68, 187); "></div>
+</div>
+
+<div class="body_content"><br />
+<table class="file_summary"><tr><td class="h">Filename</td><td align="left"><a href="file:///Users/edenc/perl5/lib/perl5/IPC/Run.pm">/Users/edenc/perl5/lib/perl5/IPC/Run.pm</a></td></tr>
+<tr><td class="h">Statements</td><td align="left">Executed 65 statements in 12.9ms</td></tr></table>
+        
+        <table id="subs_table" border="1" cellpadding="0" class="tablesorter">
+        <caption>Subroutines</caption>
+        <thead>
+        <tr>
+        <th>Calls</th>
+        <th><span title="Number of Places sub is called from">P</span></th>
+        <th><span title="Number of Files sub is called from">F</span></th>
+        <th>Exclusive<br />Time</th>
+        <th>Inclusive<br />Time</th>
+        <th>Subroutine</th>
+        </tr>
+        </thead>
+    <tbody>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c0"><span title="0.0%">1.15ms</span></td><td class="c0"><span title="0.0%">7.71ms</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1049</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1049">BEGIN@1049</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c0"><span title="0.0%">177&micro;s</span></td><td class="c0"><span title="0.0%">177&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1059</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1059">BEGIN@1059</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c0"><span title="0.0%">44&micro;s</span></td><td class="c0"><span title="0.0%">92&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1063</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1063">BEGIN@1063</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c0"><span title="0.0%">28&micro;s</span></td><td class="c1"><span title="0.0%">51&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1082</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1082">BEGIN@1082</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c0"><span title="0.0%">24&micro;s</span></td><td class="c3"><span title="0.0%">24&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1016</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1016">BEGIN@1016</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c1"><span title="0.0%">17&micro;s</span></td><td class="c3"><span title="0.0%">22&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@2</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2">BEGIN@2</a></span></td></tr>
+<tr><td class="c1">2</td><td class="c1">2</td><td class="c3">1</td><td class="c1"><span title="0.0%">16&micro;s</span></td><td class="c3"><span title="0.0%">16&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::CORE:regcomp</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#IPC__Run__CORE_regcomp">CORE:regcomp</a>&nbsp;(opcode)</span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c1"><span title="0.0%">16&micro;s</span></td><td class="c0"><span title="0.0%">120&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1015</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1015">BEGIN@1015</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c1"><span title="0.0%">15&micro;s</span></td><td class="c1"><span title="0.0%">54&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1061</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1061">BEGIN@1061</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c1"><span title="0.0%">15&micro;s</span></td><td class="c0"><span title="0.0%">242&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1051</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1051">BEGIN@1051</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c2"><span title="0.0%">13&micro;s</span></td><td class="c1"><span title="0.0%">59&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@3615</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3615">BEGIN@3615</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">11&micro;s</span></td><td class="c3"><span title="0.0%">15&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1013</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1013">BEGIN@1013</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">10&micro;s</span></td><td class="c3"><span title="0.0%">27&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1237</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1237">BEGIN@1237</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">10&micro;s</span></td><td class="c3"><span title="0.0%">32&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1445</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1445">BEGIN@1445</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">9&micro;s</span></td><td class="c2"><span title="0.0%">41&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1053</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1053">BEGIN@1053</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">9&micro;s</span></td><td class="c0"><span title="0.0%">240&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1081</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1081">BEGIN@1081</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">8&micro;s</span></td><td class="c3"><span title="0.0%">21&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1050</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1050">BEGIN@1050</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">8&micro;s</span></td><td class="c3"><span title="0.0%">20&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1056</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1056">BEGIN@1056</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">8&micro;s</span></td><td class="c3"><span title="0.0%">10&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1048</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1048">BEGIN@1048</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">8&micro;s</span></td><td class="c3"><span title="0.0%">36&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1054</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1054">BEGIN@1054</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">7&micro;s</span></td><td class="c3"><span title="0.0%">25&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1114</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1114">BEGIN@1114</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">6&micro;s</span></td><td class="c3"><span title="0.0%">36&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1080</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1080">BEGIN@1080</a></span></td></tr>
+<tr><td class="c1">2</td><td class="c1">2</td><td class="c3">1</td><td class="c3"><span title="0.0%">6&micro;s</span></td><td class="c3"><span title="0.0%">6&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::CORE:qr</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#IPC__Run__CORE_qr">CORE:qr</a>&nbsp;(opcode)</span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">4&micro;s</span></td><td class="c3"><span title="0.0%">4&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1014</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1014">BEGIN@1014</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">4&micro;s</span></td><td class="c3"><span title="0.0%">4&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1052</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1052">BEGIN@1052</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">4&micro;s</span></td><td class="c3"><span title="0.0%">4&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::BEGIN@1055</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1055">BEGIN@1055</a></span></td></tr>
+<tr><td class="c3">1</td><td class="c3">1</td><td class="c3">1</td><td class="c3"><span title="0.0%">4&micro;s</span></td><td class="c3"><span title="0.0%">4&micro;s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::CORE:match</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#IPC__Run__CORE_match">CORE:match</a>&nbsp;(opcode)</span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::DESTROY</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1131">DESTROY</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::__ANON__[:2434]</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2403">__ANON__[:2434]</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::__ANON__[:2471]</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2440">__ANON__[:2471]</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::__ANON__[:3655]</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3655">__ANON__[:3655]</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::__ANON__[:3728]</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3708">__ANON__[:3728]</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::__ANON__[:3769]</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3761">__ANON__[:3769]</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::__ANON__[:3804]</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3793">__ANON__[:3804]</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::__ANON__[:3815]</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3805">__ANON__[:3815]</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::__ANON__[:3837]</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3829">__ANON__[:3837]</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_assert_finished</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3505">_assert_finished</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_cleanup</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3144">_cleanup</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_clobber</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2900">_clobber</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_close</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1235">_close</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_debug_fd</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1116">_debug_fd</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_do_kid_and_exit</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2519">_do_kid_and_exit</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_dup</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1245">_dup</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_dup2_gently</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2480">_dup2_gently</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_dup2_rudely</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1256">_dup2_rudely</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_empty</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1232">_empty</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_exec</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1266">_exec</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_open_pipes</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2033">_open_pipes</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_pipe</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1308">_pipe</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_pipe_nb</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1319">_pipe_nb</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_pty</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1341">_pty</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_read</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1354">_read</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_running_kids</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3349">_running_kids</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_search_path</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1145">_search_path</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_select_loop</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2934">_select_loop</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_spawn</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1366">_spawn</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_sysopen</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1291">_sysopen</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::_write</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1411">_write</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::adopt</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2884">adopt</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::binary</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3653">binary</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::close_terminal</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2507">close_terminal</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::finish</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3460">finish</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::full_result</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3578">full_result</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::full_results</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3601">full_results</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::get_more_input</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#4084">get_more_input</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::harness</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1656">harness</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::input_avail</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#4062">input_avail</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::io</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3935">io</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::kill_kill</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1572">kill_kill</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::new_appender</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3757">new_appender</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::new_chunker</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3702">new_chunker</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::new_string_sink</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3826">new_string_sink</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::new_string_source</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3783">new_string_source</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::pump</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3249">pump</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::pump_nb</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3292">pump_nb</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::pumpable</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3319">pumpable</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::reap_nb</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3374">reap_nb</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::result</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3513">result</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::results</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#3546">results</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::run</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1447">run</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::signal</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#1509">signal</a></span></td></tr>
+<tr><td class="c3">0</td><td class="c3">0</td><td class="c3">0</td><td class="c3"><span title="0.0%">0s</span></td><td class="c3"><span title="0.0%">0s</span></td><td class="sub_name"><span style="display: none;">IPC::Run::::start</span>IPC::Run::<a href="IPC-Run-pm-733-sub.html#2731">start</a></span></td></tr>
+</tbody></table>
+                Call graph for these subroutines as a
+                <a href="http://en.wikipedia.org/wiki/Graphviz">Graphviz</a>
+                <a href="Users-edenc-perl5-lib-perl5-IPC-Run-pm.dot">dot language file</a>.
+            
+      <table border="1" cellpadding="0">
+      <thead>
+      <tr><th>Line</th>
+      <th><span title="Number of statements executed">State<br />ments</span></th>
+      <th><span title="Time spend executing statements on the line,
+        excluding time spent executing statements in any called subroutines">Time<br />on line</span></th>
+      <th><span title="Number of subroutines calls">Calls</span></th>
+      <th><span title="Time spent in subroutines called (inclusive)">Time<br />in subs</span></th>
+      <th class="left_indent_header">Code</th>
+      </tr>
+
+      </thead>
+      <tbody>
+    <tr><td class="h"><a name="1"></a>1</td><td></td><td></td><td></td><td></td><td class="s">package IPC::Run;</td></tr>
+<tr><td class="h"><a name="2"></a>2</td><td class="c3">2</td><td class="c0"><span title="Avg 178&micro;s">356&micro;s</span></td><td class="c3">2</td><td class="c3">26&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 22&micro;s (17+5) within IPC::Run::BEGIN@2 which was called:
+#    once (17&micro;s+5&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#2">line 2</a></div></div>use bytes;<div class="calls"><div class="calls_out"># spent    22&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#2">IPC::Run::BEGIN@2</a>
+# spent     5&micro;s making 1 call to <a href="bytes-pm-691-sub.html#7">bytes::import</a></div></div></td></tr>
+<tr><td class="h"><a name="3"></a>3</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4"></a>4</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="5"></a>5</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="6"></a>6</td><td></td><td></td><td></td><td></td><td class="s">=head1 NAME</td></tr>
+<tr><td class="h"><a name="7"></a>7</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="8"></a>8</td><td></td><td></td><td></td><td></td><td class="s">IPC::Run - system() and background procs w/ piping, redirs, ptys (Unix, Win32)</td></tr>
+<tr><td class="h"><a name="9"></a>9</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="10"></a>10</td><td></td><td></td><td></td><td></td><td class="s">=head1 SYNOPSIS</td></tr>
+<tr><td class="h"><a name="11"></a>11</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="12"></a>12</td><td></td><td></td><td></td><td></td><td class="s">   ## First,a command to run:</td></tr>
+<tr><td class="h"><a name="13"></a>13</td><td></td><td></td><td></td><td></td><td class="s">      my @cat = qw( cat );</td></tr>
+<tr><td class="h"><a name="14"></a>14</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="15"></a>15</td><td></td><td></td><td></td><td></td><td class="s">   ## Using run() instead of system():</td></tr>
+<tr><td class="h"><a name="16"></a>16</td><td></td><td></td><td></td><td></td><td class="s">      use IPC::Run qw( run timeout );</td></tr>
+<tr><td class="h"><a name="17"></a>17</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="18"></a>18</td><td></td><td></td><td></td><td></td><td class="s">      run \@cmd, \$in, \$out, \$err, timeout( 10 ) or die &quot;cat: $?&quot;</td></tr>
+<tr><td class="h"><a name="19"></a>19</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="20"></a>20</td><td></td><td></td><td></td><td></td><td class="s">      # Can do I/O to sub refs and filenames, too:</td></tr>
+<tr><td class="h"><a name="21"></a>21</td><td></td><td></td><td></td><td></td><td class="s">      run \@cmd, '&lt;', &quot;in.txt&quot;, \&amp;out, \&amp;err or die &quot;cat: $?&quot;</td></tr>
+<tr><td class="h"><a name="22"></a>22</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, '&lt;', &quot;in.txt&quot;, '&gt;&gt;', &quot;out.txt&quot;, '2&gt;&gt;', &quot;err.txt&quot;;</td></tr>
+<tr><td class="h"><a name="23"></a>23</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="24"></a>24</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="25"></a>25</td><td></td><td></td><td></td><td></td><td class="s">      # Redirecting using psuedo-terminals instad of pipes.</td></tr>
+<tr><td class="h"><a name="26"></a>26</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, '&lt;pty&lt;', \$in,  '&gt;pty&gt;', \$out_and_err;</td></tr>
+<tr><td class="h"><a name="27"></a>27</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="28"></a>28</td><td></td><td></td><td></td><td></td><td class="s">   ## Scripting subprocesses (like Expect):</td></tr>
+<tr><td class="h"><a name="29"></a>29</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="30"></a>30</td><td></td><td></td><td></td><td></td><td class="s">      use IPC::Run qw( start pump finish timeout );</td></tr>
+<tr><td class="h"><a name="31"></a>31</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="32"></a>32</td><td></td><td></td><td></td><td></td><td class="s">      # Incrementally read from / write to scalars. </td></tr>
+<tr><td class="h"><a name="33"></a>33</td><td></td><td></td><td></td><td></td><td class="s">      # $in is drained as it is fed to cat's stdin,</td></tr>
+<tr><td class="h"><a name="34"></a>34</td><td></td><td></td><td></td><td></td><td class="s">      # $out accumulates cat's stdout</td></tr>
+<tr><td class="h"><a name="35"></a>35</td><td></td><td></td><td></td><td></td><td class="s">      # $err accumulates cat's stderr</td></tr>
+<tr><td class="h"><a name="36"></a>36</td><td></td><td></td><td></td><td></td><td class="s">      # $h is for &quot;harness&quot;.</td></tr>
+<tr><td class="h"><a name="37"></a>37</td><td></td><td></td><td></td><td></td><td class="s">      my $h = start \@cat, \$in, \$out, \$err, timeout( 10 );</td></tr>
+<tr><td class="h"><a name="38"></a>38</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="39"></a>39</td><td></td><td></td><td></td><td></td><td class="s">      $in .= &quot;some input\n&quot;;</td></tr>
+<tr><td class="h"><a name="40"></a>40</td><td></td><td></td><td></td><td></td><td class="s">      pump $h until $out =~ /input\n/g;</td></tr>
+<tr><td class="h"><a name="41"></a>41</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="42"></a>42</td><td></td><td></td><td></td><td></td><td class="s">      $in .= &quot;some more input\n&quot;;</td></tr>
+<tr><td class="h"><a name="43"></a>43</td><td></td><td></td><td></td><td></td><td class="s">      pump $h until $out =~ /\G.*more input\n/;</td></tr>
+<tr><td class="h"><a name="44"></a>44</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="45"></a>45</td><td></td><td></td><td></td><td></td><td class="s">      $in .= &quot;some final input\n&quot;;</td></tr>
+<tr><td class="h"><a name="46"></a>46</td><td></td><td></td><td></td><td></td><td class="s">      finish $h or die &quot;cat returned $?&quot;;</td></tr>
+<tr><td class="h"><a name="47"></a>47</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="48"></a>48</td><td></td><td></td><td></td><td></td><td class="s">      warn $err if $err; </td></tr>
+<tr><td class="h"><a name="49"></a>49</td><td></td><td></td><td></td><td></td><td class="s">      print $out;         ## All of cat's output</td></tr>
+<tr><td class="h"><a name="50"></a>50</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="51"></a>51</td><td></td><td></td><td></td><td></td><td class="s">   # Piping between children</td></tr>
+<tr><td class="h"><a name="52"></a>52</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, '|', \@gzip;</td></tr>
+<tr><td class="h"><a name="53"></a>53</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="54"></a>54</td><td></td><td></td><td></td><td></td><td class="s">   # Multiple children simultaneously (run() blocks until all</td></tr>
+<tr><td class="h"><a name="55"></a>55</td><td></td><td></td><td></td><td></td><td class="s">   # children exit, use start() for background execution):</td></tr>
+<tr><td class="h"><a name="56"></a>56</td><td></td><td></td><td></td><td></td><td class="s">      run \@foo1, '&amp;', \@foo2;</td></tr>
+<tr><td class="h"><a name="57"></a>57</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="58"></a>58</td><td></td><td></td><td></td><td></td><td class="s">   # Calling \&amp;set_up_child in the child before it executes the</td></tr>
+<tr><td class="h"><a name="59"></a>59</td><td></td><td></td><td></td><td></td><td class="s">   # command (only works on systems with true fork() &amp; exec())</td></tr>
+<tr><td class="h"><a name="60"></a>60</td><td></td><td></td><td></td><td></td><td class="s">   # exceptions thrown in set_up_child() will be propagated back</td></tr>
+<tr><td class="h"><a name="61"></a>61</td><td></td><td></td><td></td><td></td><td class="s">   # to the parent and thrown from run().</td></tr>
+<tr><td class="h"><a name="62"></a>62</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, \$in, \$out,</td></tr>
+<tr><td class="h"><a name="63"></a>63</td><td></td><td></td><td></td><td></td><td class="s">         init =&gt; \&amp;set_up_child;</td></tr>
+<tr><td class="h"><a name="64"></a>64</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="65"></a>65</td><td></td><td></td><td></td><td></td><td class="s">   # Read from / write to file handles you open and close</td></tr>
+<tr><td class="h"><a name="66"></a>66</td><td></td><td></td><td></td><td></td><td class="s">      open IN,  '&lt;in.txt'  or die $!;</td></tr>
+<tr><td class="h"><a name="67"></a>67</td><td></td><td></td><td></td><td></td><td class="s">      open OUT, '&gt;out.txt' or die $!;</td></tr>
+<tr><td class="h"><a name="68"></a>68</td><td></td><td></td><td></td><td></td><td class="s">      print OUT &quot;preamble\n&quot;;</td></tr>
+<tr><td class="h"><a name="69"></a>69</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, \*IN, \*OUT or die &quot;cat returned $?&quot;;</td></tr>
+<tr><td class="h"><a name="70"></a>70</td><td></td><td></td><td></td><td></td><td class="s">      print OUT &quot;postamble\n&quot;;</td></tr>
+<tr><td class="h"><a name="71"></a>71</td><td></td><td></td><td></td><td></td><td class="s">      close IN;</td></tr>
+<tr><td class="h"><a name="72"></a>72</td><td></td><td></td><td></td><td></td><td class="s">      close OUT;</td></tr>
+<tr><td class="h"><a name="73"></a>73</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="74"></a>74</td><td></td><td></td><td></td><td></td><td class="s">   # Create pipes for you to read / write (like IPC::Open2 &amp; 3).</td></tr>
+<tr><td class="h"><a name="75"></a>75</td><td></td><td></td><td></td><td></td><td class="s">      $h = start</td></tr>
+<tr><td class="h"><a name="76"></a>76</td><td></td><td></td><td></td><td></td><td class="s">         \@cat,</td></tr>
+<tr><td class="h"><a name="77"></a>77</td><td></td><td></td><td></td><td></td><td class="s">            '&lt;pipe', \*IN,</td></tr>
+<tr><td class="h"><a name="78"></a>78</td><td></td><td></td><td></td><td></td><td class="s">            '&gt;pipe', \*OUT,</td></tr>
+<tr><td class="h"><a name="79"></a>79</td><td></td><td></td><td></td><td></td><td class="s">            '2&gt;pipe', \*ERR </td></tr>
+<tr><td class="h"><a name="80"></a>80</td><td></td><td></td><td></td><td></td><td class="s">         or die &quot;cat returned $?&quot;;</td></tr>
+<tr><td class="h"><a name="81"></a>81</td><td></td><td></td><td></td><td></td><td class="s">      print IN &quot;some input\n&quot;;</td></tr>
+<tr><td class="h"><a name="82"></a>82</td><td></td><td></td><td></td><td></td><td class="s">      close IN;</td></tr>
+<tr><td class="h"><a name="83"></a>83</td><td></td><td></td><td></td><td></td><td class="s">      print &lt;OUT&gt;, &lt;ERR&gt;;</td></tr>
+<tr><td class="h"><a name="84"></a>84</td><td></td><td></td><td></td><td></td><td class="s">      finish $h;</td></tr>
+<tr><td class="h"><a name="85"></a>85</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="86"></a>86</td><td></td><td></td><td></td><td></td><td class="s">   # Mixing input and output modes</td></tr>
+<tr><td class="h"><a name="87"></a>87</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, 'in.txt', \&amp;catch_some_out, \*ERR_LOG );</td></tr>
+<tr><td class="h"><a name="88"></a>88</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="89"></a>89</td><td></td><td></td><td></td><td></td><td class="s">   # Other redirection constructs</td></tr>
+<tr><td class="h"><a name="90"></a>90</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, '&gt;&amp;', \$out_and_err;</td></tr>
+<tr><td class="h"><a name="91"></a>91</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, '2&gt;&amp;1';</td></tr>
+<tr><td class="h"><a name="92"></a>92</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, '0&lt;&amp;3';</td></tr>
+<tr><td class="h"><a name="93"></a>93</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, '&lt;&amp;-';</td></tr>
+<tr><td class="h"><a name="94"></a>94</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, '3&lt;', \$in3;</td></tr>
+<tr><td class="h"><a name="95"></a>95</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, '4&gt;', \$out4;</td></tr>
+<tr><td class="h"><a name="96"></a>96</td><td></td><td></td><td></td><td></td><td class="s">      # etc.</td></tr>
+<tr><td class="h"><a name="97"></a>97</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="98"></a>98</td><td></td><td></td><td></td><td></td><td class="s">   # Passing options:</td></tr>
+<tr><td class="h"><a name="99"></a>99</td><td></td><td></td><td></td><td></td><td class="s">      run \@cat, 'in.txt', debug =&gt; 1;</td></tr>
+<tr><td class="h"><a name="100"></a>100</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="101"></a>101</td><td></td><td></td><td></td><td></td><td class="s">   # Call this system's shell, returns TRUE on 0 exit code</td></tr>
+<tr><td class="h"><a name="102"></a>102</td><td></td><td></td><td></td><td></td><td class="s">   # THIS IS THE OPPOSITE SENSE OF system()'s RETURN VALUE</td></tr>
+<tr><td class="h"><a name="103"></a>103</td><td></td><td></td><td></td><td></td><td class="s">      run &quot;cat a b c&quot; or die &quot;cat returned $?&quot;;</td></tr>
+<tr><td class="h"><a name="104"></a>104</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="105"></a>105</td><td></td><td></td><td></td><td></td><td class="s">   # Launch a sub process directly, no shell.  Can't do redirection</td></tr>
+<tr><td class="h"><a name="106"></a>106</td><td></td><td></td><td></td><td></td><td class="s">   # with this form, it's here to behave like system() with an</td></tr>
+<tr><td class="h"><a name="107"></a>107</td><td></td><td></td><td></td><td></td><td class="s">   # inverted result.</td></tr>
+<tr><td class="h"><a name="108"></a>108</td><td></td><td></td><td></td><td></td><td class="s">      $r = run &quot;cat a b c&quot;;</td></tr>
+<tr><td class="h"><a name="109"></a>109</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="110"></a>110</td><td></td><td></td><td></td><td></td><td class="s">   # Read from a file in to a scalar</td></tr>
+<tr><td class="h"><a name="111"></a>111</td><td></td><td></td><td></td><td></td><td class="s">      run io( &quot;filename&quot;, 'r', \$recv );</td></tr>
+<tr><td class="h"><a name="112"></a>112</td><td></td><td></td><td></td><td></td><td class="s">      run io( \*HANDLE,   'r', \$recv );</td></tr>
+<tr><td class="h"><a name="113"></a>113</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="114"></a>114</td><td></td><td></td><td></td><td></td><td class="s">=head1 DESCRIPTION</td></tr>
+<tr><td class="h"><a name="115"></a>115</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="116"></a>116</td><td></td><td></td><td></td><td></td><td class="s">IPC::Run allows you to run and interact with child processes using files, pipes,</td></tr>
+<tr><td class="h"><a name="117"></a>117</td><td></td><td></td><td></td><td></td><td class="s">and pseudo-ttys.  Both system()-style and scripted usages are supported and</td></tr>
+<tr><td class="h"><a name="118"></a>118</td><td></td><td></td><td></td><td></td><td class="s">may be mixed.  Likewise, functional and OO API styles are both supported and</td></tr>
+<tr><td class="h"><a name="119"></a>119</td><td></td><td></td><td></td><td></td><td class="s">may be mixed.</td></tr>
+<tr><td class="h"><a name="120"></a>120</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="121"></a>121</td><td></td><td></td><td></td><td></td><td class="s">Various redirection operators reminiscent of those seen on common Unix and DOS</td></tr>
+<tr><td class="h"><a name="122"></a>122</td><td></td><td></td><td></td><td></td><td class="s">command lines are provided.</td></tr>
+<tr><td class="h"><a name="123"></a>123</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="124"></a>124</td><td></td><td></td><td></td><td></td><td class="s">Before digging in to the details a few LIMITATIONS are important enough</td></tr>
+<tr><td class="h"><a name="125"></a>125</td><td></td><td></td><td></td><td></td><td class="s">to be mentioned right up front:</td></tr>
+<tr><td class="h"><a name="126"></a>126</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="127"></a>127</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="128"></a>128</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="129"></a>129</td><td></td><td></td><td></td><td></td><td class="s">=item Win32 Support</td></tr>
+<tr><td class="h"><a name="130"></a>130</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="131"></a>131</td><td></td><td></td><td></td><td></td><td class="s">Win32 support is working but B&lt;EXPERIMENTAL&gt;, but does pass all relevant tests</td></tr>
+<tr><td class="h"><a name="132"></a>132</td><td></td><td></td><td></td><td></td><td class="s">on NT 4.0.  See L&lt;/Win32 LIMITATIONS&gt;.</td></tr>
+<tr><td class="h"><a name="133"></a>133</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="134"></a>134</td><td></td><td></td><td></td><td></td><td class="s">=item pty Support</td></tr>
+<tr><td class="h"><a name="135"></a>135</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="136"></a>136</td><td></td><td></td><td></td><td></td><td class="s">If you need pty support, IPC::Run should work well enough most of the</td></tr>
+<tr><td class="h"><a name="137"></a>137</td><td></td><td></td><td></td><td></td><td class="s">time, but IO::Pty is being improved, and IPC::Run will be improved to</td></tr>
+<tr><td class="h"><a name="138"></a>138</td><td></td><td></td><td></td><td></td><td class="s">use IO::Pty's new features when it is release.</td></tr>
+<tr><td class="h"><a name="139"></a>139</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="140"></a>140</td><td></td><td></td><td></td><td></td><td class="s">The basic problem is that the pty needs to initialize itself before the</td></tr>
+<tr><td class="h"><a name="141"></a>141</td><td></td><td></td><td></td><td></td><td class="s">parent writes to the master pty, or the data written gets lost.  So</td></tr>
+<tr><td class="h"><a name="142"></a>142</td><td></td><td></td><td></td><td></td><td class="s">IPC::Run does a sleep(1) in the parent after forking to (hopefully) give</td></tr>
+<tr><td class="h"><a name="143"></a>143</td><td></td><td></td><td></td><td></td><td class="s">the child a chance to run.  This is a kludge that works well on non</td></tr>
+<tr><td class="h"><a name="144"></a>144</td><td></td><td></td><td></td><td></td><td class="s">heavily loaded systems :(.</td></tr>
+<tr><td class="h"><a name="145"></a>145</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="146"></a>146</td><td></td><td></td><td></td><td></td><td class="s">ptys are not supported yet under Win32, but will be emulated...</td></tr>
+<tr><td class="h"><a name="147"></a>147</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="148"></a>148</td><td></td><td></td><td></td><td></td><td class="s">=item Debugging Tip</td></tr>
+<tr><td class="h"><a name="149"></a>149</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="150"></a>150</td><td></td><td></td><td></td><td></td><td class="s">You may use the environment variable C&lt;IPCRUNDEBUG&gt; to see what's going on</td></tr>
+<tr><td class="h"><a name="151"></a>151</td><td></td><td></td><td></td><td></td><td class="s">under the hood:</td></tr>
+<tr><td class="h"><a name="152"></a>152</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="153"></a>153</td><td></td><td></td><td></td><td></td><td class="s">   $ IPCRUNDEBUG=basic   myscript     # prints minimal debugging</td></tr>
+<tr><td class="h"><a name="154"></a>154</td><td></td><td></td><td></td><td></td><td class="s">   $ IPCRUNDEBUG=data    myscript     # prints all data reads/writes</td></tr>
+<tr><td class="h"><a name="155"></a>155</td><td></td><td></td><td></td><td></td><td class="s">   $ IPCRUNDEBUG=details myscript     # prints lots of low-level details</td></tr>
+<tr><td class="h"><a name="156"></a>156</td><td></td><td></td><td></td><td></td><td class="s">   $ IPCRUNDEBUG=gory    myscript     # (Win32 only) prints data moving through</td></tr>
+<tr><td class="h"><a name="157"></a>157</td><td></td><td></td><td></td><td></td><td class="s">                                      # the helper processes.</td></tr>
+<tr><td class="h"><a name="158"></a>158</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="159"></a>159</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="160"></a>160</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="161"></a>161</td><td></td><td></td><td></td><td></td><td class="s">We now return you to your regularly scheduled documentation.</td></tr>
+<tr><td class="h"><a name="162"></a>162</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="163"></a>163</td><td></td><td></td><td></td><td></td><td class="s">=head2 Harnesses</td></tr>
+<tr><td class="h"><a name="164"></a>164</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="165"></a>165</td><td></td><td></td><td></td><td></td><td class="s">Child processes and I/O handles are gathered in to a harness, then</td></tr>
+<tr><td class="h"><a name="166"></a>166</td><td></td><td></td><td></td><td></td><td class="s">started and run until the processing is finished or aborted.</td></tr>
+<tr><td class="h"><a name="167"></a>167</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="168"></a>168</td><td></td><td></td><td></td><td></td><td class="s">=head2 run() vs. start(); pump(); finish();</td></tr>
+<tr><td class="h"><a name="169"></a>169</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="170"></a>170</td><td></td><td></td><td></td><td></td><td class="s">There are two modes you can run harnesses in: run() functions as an</td></tr>
+<tr><td class="h"><a name="171"></a>171</td><td></td><td></td><td></td><td></td><td class="s">enhanced system(), and start()/pump()/finish() allow for background</td></tr>
+<tr><td class="h"><a name="172"></a>172</td><td></td><td></td><td></td><td></td><td class="s">processes and scripted interactions with them.</td></tr>
+<tr><td class="h"><a name="173"></a>173</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="174"></a>174</td><td></td><td></td><td></td><td></td><td class="s">When using run(), all data to be sent to the harness is set up in</td></tr>
+<tr><td class="h"><a name="175"></a>175</td><td></td><td></td><td></td><td></td><td class="s">advance (though one can feed subprocesses input from subroutine refs to</td></tr>
+<tr><td class="h"><a name="176"></a>176</td><td></td><td></td><td></td><td></td><td class="s">get around this limitation). The harness is run and all output is</td></tr>
+<tr><td class="h"><a name="177"></a>177</td><td></td><td></td><td></td><td></td><td class="s">collected from it, then any child processes are waited for:</td></tr>
+<tr><td class="h"><a name="178"></a>178</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="179"></a>179</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, \&lt;&lt;IN, \$out;</td></tr>
+<tr><td class="h"><a name="180"></a>180</td><td></td><td></td><td></td><td></td><td class="s">   blah</td></tr>
+<tr><td class="h"><a name="181"></a>181</td><td></td><td></td><td></td><td></td><td class="s">   IN</td></tr>
+<tr><td class="h"><a name="182"></a>182</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="183"></a>183</td><td></td><td></td><td></td><td></td><td class="s">   ## To precompile harnesses and run them later:</td></tr>
+<tr><td class="h"><a name="184"></a>184</td><td></td><td></td><td></td><td></td><td class="s">   my $h = harness \@cmd, \&lt;&lt;IN, \$out;</td></tr>
+<tr><td class="h"><a name="185"></a>185</td><td></td><td></td><td></td><td></td><td class="s">   blah</td></tr>
+<tr><td class="h"><a name="186"></a>186</td><td></td><td></td><td></td><td></td><td class="s">   IN</td></tr>
+<tr><td class="h"><a name="187"></a>187</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="188"></a>188</td><td></td><td></td><td></td><td></td><td class="s">   run $h;</td></tr>
+<tr><td class="h"><a name="189"></a>189</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="190"></a>190</td><td></td><td></td><td></td><td></td><td class="s">The background and scripting API is provided by start(), pump(), and</td></tr>
+<tr><td class="h"><a name="191"></a>191</td><td></td><td></td><td></td><td></td><td class="s">finish(): start() creates a harness if need be (by calling harness())</td></tr>
+<tr><td class="h"><a name="192"></a>192</td><td></td><td></td><td></td><td></td><td class="s">and launches any subprocesses, pump() allows you to poll them for</td></tr>
+<tr><td class="h"><a name="193"></a>193</td><td></td><td></td><td></td><td></td><td class="s">activity, and finish() then monitors the harnessed activities until they</td></tr>
+<tr><td class="h"><a name="194"></a>194</td><td></td><td></td><td></td><td></td><td class="s">complete.</td></tr>
+<tr><td class="h"><a name="195"></a>195</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="196"></a>196</td><td></td><td></td><td></td><td></td><td class="s">   ## Build the harness, open all pipes, and launch the subprocesses</td></tr>
+<tr><td class="h"><a name="197"></a>197</td><td></td><td></td><td></td><td></td><td class="s">   my $h = start \@cat, \$in, \$out;</td></tr>
+<tr><td class="h"><a name="198"></a>198</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;first input\n&quot;;</td></tr>
+<tr><td class="h"><a name="199"></a>199</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="200"></a>200</td><td></td><td></td><td></td><td></td><td class="s">   ## Now do I/O.  start() does no I/O.</td></tr>
+<tr><td class="h"><a name="201"></a>201</td><td></td><td></td><td></td><td></td><td class="s">   pump $h while length $in;  ## Wait for all input to go</td></tr>
+<tr><td class="h"><a name="202"></a>202</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="203"></a>203</td><td></td><td></td><td></td><td></td><td class="s">   ## Now do some more I/O.</td></tr>
+<tr><td class="h"><a name="204"></a>204</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;second input\n&quot;;</td></tr>
+<tr><td class="h"><a name="205"></a>205</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until $out =~ /second input/;</td></tr>
+<tr><td class="h"><a name="206"></a>206</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="207"></a>207</td><td></td><td></td><td></td><td></td><td class="s">   ## Clean up</td></tr>
+<tr><td class="h"><a name="208"></a>208</td><td></td><td></td><td></td><td></td><td class="s">   finish $h or die &quot;cat returned $?&quot;;</td></tr>
+<tr><td class="h"><a name="209"></a>209</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="210"></a>210</td><td></td><td></td><td></td><td></td><td class="s">You can optionally compile the harness with harness() prior to</td></tr>
+<tr><td class="h"><a name="211"></a>211</td><td></td><td></td><td></td><td></td><td class="s">start()ing or run()ing, and you may omit start() between harness() and</td></tr>
+<tr><td class="h"><a name="212"></a>212</td><td></td><td></td><td></td><td></td><td class="s">pump().  You might want to do these things if you compile your harnesses</td></tr>
+<tr><td class="h"><a name="213"></a>213</td><td></td><td></td><td></td><td></td><td class="s">ahead of time.</td></tr>
+<tr><td class="h"><a name="214"></a>214</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="215"></a>215</td><td></td><td></td><td></td><td></td><td class="s">=head2 Using regexps to match output</td></tr>
+<tr><td class="h"><a name="216"></a>216</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="217"></a>217</td><td></td><td></td><td></td><td></td><td class="s">As shown in most of the scripting examples, the read-to-scalar facility</td></tr>
+<tr><td class="h"><a name="218"></a>218</td><td></td><td></td><td></td><td></td><td class="s">for gathering subcommand's output is often used with regular expressions</td></tr>
+<tr><td class="h"><a name="219"></a>219</td><td></td><td></td><td></td><td></td><td class="s">to detect stopping points.  This is because subcommand output often</td></tr>
+<tr><td class="h"><a name="220"></a>220</td><td></td><td></td><td></td><td></td><td class="s">arrives in dribbles and drabs, often only a character or line at a time.</td></tr>
+<tr><td class="h"><a name="221"></a>221</td><td></td><td></td><td></td><td></td><td class="s">This output is input for the main program and piles up in variables like</td></tr>
+<tr><td class="h"><a name="222"></a>222</td><td></td><td></td><td></td><td></td><td class="s">the C&lt;$out&gt; and C&lt;$err&gt; in our examples.</td></tr>
+<tr><td class="h"><a name="223"></a>223</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="224"></a>224</td><td></td><td></td><td></td><td></td><td class="s">Regular expressions can be used to wait for appropriate output in</td></tr>
+<tr><td class="h"><a name="225"></a>225</td><td></td><td></td><td></td><td></td><td class="s">several ways.  The C&lt;cat&gt; example in the previous section demonstrates</td></tr>
+<tr><td class="h"><a name="226"></a>226</td><td></td><td></td><td></td><td></td><td class="s">how to pump() until some string appears in the output.  Here's an</td></tr>
+<tr><td class="h"><a name="227"></a>227</td><td></td><td></td><td></td><td></td><td class="s">example that uses C&lt;smb&gt; to fetch files from a remote server:</td></tr>
+<tr><td class="h"><a name="228"></a>228</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="229"></a>229</td><td></td><td></td><td></td><td></td><td class="s">   $h = harness \@smbclient, \$in, \$out;</td></tr>
+<tr><td class="h"><a name="230"></a>230</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="231"></a>231</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;cd /src\n&quot;;</td></tr>
+<tr><td class="h"><a name="232"></a>232</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;pump until $out =~ /^smb.*&gt; \Z/m;</td></tr>
+<tr><td class="h"><a name="233"></a>233</td><td></td><td></td><td></td><td></td><td class="s">   die &quot;error cding to /src:\n$out&quot; if $out =~ &quot;ERR&quot;;</td></tr>
+<tr><td class="h"><a name="234"></a>234</td><td></td><td></td><td></td><td></td><td class="s">   $out = '';</td></tr>
+<tr><td class="h"><a name="235"></a>235</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="236"></a>236</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;mget *\n&quot;;</td></tr>
+<tr><td class="h"><a name="237"></a>237</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;pump until $out =~ /^smb.*&gt; \Z/m;</td></tr>
+<tr><td class="h"><a name="238"></a>238</td><td></td><td></td><td></td><td></td><td class="s">   die &quot;error retrieving files:\n$out&quot; if $out =~ &quot;ERR&quot;;</td></tr>
+<tr><td class="h"><a name="239"></a>239</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="240"></a>240</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;quit\n&quot;;</td></tr>
+<tr><td class="h"><a name="241"></a>241</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;finish;</td></tr>
+<tr><td class="h"><a name="242"></a>242</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="243"></a>243</td><td></td><td></td><td></td><td></td><td class="s">Notice that we carefully clear $out after the first command/response</td></tr>
+<tr><td class="h"><a name="244"></a>244</td><td></td><td></td><td></td><td></td><td class="s">cycle? That's because IPC::Run does not delete $out when we continue,</td></tr>
+<tr><td class="h"><a name="245"></a>245</td><td></td><td></td><td></td><td></td><td class="s">and we don't want to trip over the old output in the second</td></tr>
+<tr><td class="h"><a name="246"></a>246</td><td></td><td></td><td></td><td></td><td class="s">command/response cycle.</td></tr>
+<tr><td class="h"><a name="247"></a>247</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="248"></a>248</td><td></td><td></td><td></td><td></td><td class="s">Say you want to accumulate all the output in $out and analyze it</td></tr>
+<tr><td class="h"><a name="249"></a>249</td><td></td><td></td><td></td><td></td><td class="s">afterwards.  Perl offers incremental regular expression matching using</td></tr>
+<tr><td class="h"><a name="250"></a>250</td><td></td><td></td><td></td><td></td><td class="s">the C&lt;m//gc&gt; and pattern matching idiom and the C&lt;\G&gt; assertion.</td></tr>
+<tr><td class="h"><a name="251"></a>251</td><td></td><td></td><td></td><td></td><td class="s">IPC::Run is careful not to disturb the current C&lt;pos()&gt; value for</td></tr>
+<tr><td class="h"><a name="252"></a>252</td><td></td><td></td><td></td><td></td><td class="s">scalars it appends data to, so we could modify the above so as not to</td></tr>
+<tr><td class="h"><a name="253"></a>253</td><td></td><td></td><td></td><td></td><td class="s">destroy $out by adding a couple of C&lt;/gc&gt; modifiers.  The C&lt;/g&gt; keeps us</td></tr>
+<tr><td class="h"><a name="254"></a>254</td><td></td><td></td><td></td><td></td><td class="s">from tripping over the previous prompt and the C&lt;/c&gt; keeps us from</td></tr>
+<tr><td class="h"><a name="255"></a>255</td><td></td><td></td><td></td><td></td><td class="s">resetting the prior match position if the expected prompt doesn't</td></tr>
+<tr><td class="h"><a name="256"></a>256</td><td></td><td></td><td></td><td></td><td class="s">materialize immediately:</td></tr>
+<tr><td class="h"><a name="257"></a>257</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="258"></a>258</td><td></td><td></td><td></td><td></td><td class="s">   $h = harness \@smbclient, \$in, \$out;</td></tr>
+<tr><td class="h"><a name="259"></a>259</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="260"></a>260</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;cd /src\n&quot;;</td></tr>
+<tr><td class="h"><a name="261"></a>261</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;pump until $out =~ /^smb.*&gt; \Z/mgc;</td></tr>
+<tr><td class="h"><a name="262"></a>262</td><td></td><td></td><td></td><td></td><td class="s">   die &quot;error cding to /src:\n$out&quot; if $out =~ &quot;ERR&quot;;</td></tr>
+<tr><td class="h"><a name="263"></a>263</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="264"></a>264</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;mget *\n&quot;;</td></tr>
+<tr><td class="h"><a name="265"></a>265</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;pump until $out =~ /^smb.*&gt; \Z/mgc;</td></tr>
+<tr><td class="h"><a name="266"></a>266</td><td></td><td></td><td></td><td></td><td class="s">   die &quot;error retrieving files:\n$out&quot; if $out =~ &quot;ERR&quot;;</td></tr>
+<tr><td class="h"><a name="267"></a>267</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="268"></a>268</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;quit\n&quot;;</td></tr>
+<tr><td class="h"><a name="269"></a>269</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;finish;</td></tr>
+<tr><td class="h"><a name="270"></a>270</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="271"></a>271</td><td></td><td></td><td></td><td></td><td class="s">   analyze( $out );</td></tr>
+<tr><td class="h"><a name="272"></a>272</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="273"></a>273</td><td></td><td></td><td></td><td></td><td class="s">When using this technique, you may want to preallocate $out to have</td></tr>
+<tr><td class="h"><a name="274"></a>274</td><td></td><td></td><td></td><td></td><td class="s">plenty of memory or you may find that the act of growing $out each time</td></tr>
+<tr><td class="h"><a name="275"></a>275</td><td></td><td></td><td></td><td></td><td class="s">new input arrives causes an C&lt;O(length($out)^2)&gt; slowdown as $out grows.</td></tr>
+<tr><td class="h"><a name="276"></a>276</td><td></td><td></td><td></td><td></td><td class="s">Say we expect no more than 10,000 characters of input at the most.  To</td></tr>
+<tr><td class="h"><a name="277"></a>277</td><td></td><td></td><td></td><td></td><td class="s">preallocate memory to $out, do something like:</td></tr>
+<tr><td class="h"><a name="278"></a>278</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="279"></a>279</td><td></td><td></td><td></td><td></td><td class="s">   my $out = &quot;x&quot; x 10_000;</td></tr>
+<tr><td class="h"><a name="280"></a>280</td><td></td><td></td><td></td><td></td><td class="s">   $out = &quot;&quot;;</td></tr>
+<tr><td class="h"><a name="281"></a>281</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="282"></a>282</td><td></td><td></td><td></td><td></td><td class="s">C&lt;perl&gt; will allocate at least 10,000 characters' worth of space, then</td></tr>
+<tr><td class="h"><a name="283"></a>283</td><td></td><td></td><td></td><td></td><td class="s">mark the $out as having 0 length without freeing all that yummy RAM.</td></tr>
+<tr><td class="h"><a name="284"></a>284</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="285"></a>285</td><td></td><td></td><td></td><td></td><td class="s">=head2 Timeouts and Timers</td></tr>
+<tr><td class="h"><a name="286"></a>286</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="287"></a>287</td><td></td><td></td><td></td><td></td><td class="s">More than likely, you don't want your subprocesses to run forever, and</td></tr>
+<tr><td class="h"><a name="288"></a>288</td><td></td><td></td><td></td><td></td><td class="s">sometimes it's nice to know that they're going a little slowly.</td></tr>
+<tr><td class="h"><a name="289"></a>289</td><td></td><td></td><td></td><td></td><td class="s">Timeouts throw exceptions after a some time has elapsed, timers merely</td></tr>
+<tr><td class="h"><a name="290"></a>290</td><td></td><td></td><td></td><td></td><td class="s">cause pump() to return after some time has elapsed.  Neither is</td></tr>
+<tr><td class="h"><a name="291"></a>291</td><td></td><td></td><td></td><td></td><td class="s">reset/restarted automatically.</td></tr>
+<tr><td class="h"><a name="292"></a>292</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="293"></a>293</td><td></td><td></td><td></td><td></td><td class="s">Timeout objects are created by calling timeout( $interval ) and passing</td></tr>
+<tr><td class="h"><a name="294"></a>294</td><td></td><td></td><td></td><td></td><td class="s">the result to run(), start() or harness().  The timeout period starts</td></tr>
+<tr><td class="h"><a name="295"></a>295</td><td></td><td></td><td></td><td></td><td class="s">ticking just after all the child processes have been fork()ed or</td></tr>
+<tr><td class="h"><a name="296"></a>296</td><td></td><td></td><td></td><td></td><td class="s">spawn()ed, and are polled for expiration in run(), pump() and finish().</td></tr>
+<tr><td class="h"><a name="297"></a>297</td><td></td><td></td><td></td><td></td><td class="s">If/when they expire, an exception is thrown.  This is typically useful</td></tr>
+<tr><td class="h"><a name="298"></a>298</td><td></td><td></td><td></td><td></td><td class="s">to keep a subprocess from taking too long.</td></tr>
+<tr><td class="h"><a name="299"></a>299</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="300"></a>300</td><td></td><td></td><td></td><td></td><td class="s">If a timeout occurs in run(), all child processes will be terminated and</td></tr>
+<tr><td class="h"><a name="301"></a>301</td><td></td><td></td><td></td><td></td><td class="s">all file/pipe/ptty descriptors opened by run() will be closed.  File</td></tr>
+<tr><td class="h"><a name="302"></a>302</td><td></td><td></td><td></td><td></td><td class="s">descriptors opened by the parent process and passed in to run() are not</td></tr>
+<tr><td class="h"><a name="303"></a>303</td><td></td><td></td><td></td><td></td><td class="s">closed in this event.</td></tr>
+<tr><td class="h"><a name="304"></a>304</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="305"></a>305</td><td></td><td></td><td></td><td></td><td class="s">If a timeout occurs in pump(), pump_nb(), or finish(), it's up to you to</td></tr>
+<tr><td class="h"><a name="306"></a>306</td><td></td><td></td><td></td><td></td><td class="s">decide whether to kill_kill() all the children or to implement some more</td></tr>
+<tr><td class="h"><a name="307"></a>307</td><td></td><td></td><td></td><td></td><td class="s">graceful fallback.  No I/O will be closed in pump(), pump_nb() or</td></tr>
+<tr><td class="h"><a name="308"></a>308</td><td></td><td></td><td></td><td></td><td class="s">finish() by such an exception (though I/O is often closed down in those</td></tr>
+<tr><td class="h"><a name="309"></a>309</td><td></td><td></td><td></td><td></td><td class="s">routines during the natural course of events).</td></tr>
+<tr><td class="h"><a name="310"></a>310</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="311"></a>311</td><td></td><td></td><td></td><td></td><td class="s">Often an exception is too harsh.  timer( $interval ) creates timer</td></tr>
+<tr><td class="h"><a name="312"></a>312</td><td></td><td></td><td></td><td></td><td class="s">objects that merely prevent pump() from blocking forever.  This can be</td></tr>
+<tr><td class="h"><a name="313"></a>313</td><td></td><td></td><td></td><td></td><td class="s">useful for detecting stalled I/O or printing a soothing message or &quot;.&quot;</td></tr>
+<tr><td class="h"><a name="314"></a>314</td><td></td><td></td><td></td><td></td><td class="s">to pacify an anxious user.</td></tr>
+<tr><td class="h"><a name="315"></a>315</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="316"></a>316</td><td></td><td></td><td></td><td></td><td class="s">Timeouts and timers can both be restarted at any time using the timer's</td></tr>
+<tr><td class="h"><a name="317"></a>317</td><td></td><td></td><td></td><td></td><td class="s">start() method (this is not the start() that launches subprocesses).  To</td></tr>
+<tr><td class="h"><a name="318"></a>318</td><td></td><td></td><td></td><td></td><td class="s">restart a timer, you need to keep a reference to the timer:</td></tr>
+<tr><td class="h"><a name="319"></a>319</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="320"></a>320</td><td></td><td></td><td></td><td></td><td class="s">   ## Start with a nice long timeout to let smbclient connect.  If</td></tr>
+<tr><td class="h"><a name="321"></a>321</td><td></td><td></td><td></td><td></td><td class="s">   ## pump or finish take too long, an exception will be thrown.</td></tr>
+<tr><td class="h"><a name="322"></a>322</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="323"></a>323</td><td></td><td></td><td></td><td></td><td class="s"> my $h;</td></tr>
+<tr><td class="h"><a name="324"></a>324</td><td></td><td></td><td></td><td></td><td class="s"> eval {</td></tr>
+<tr><td class="h"><a name="325"></a>325</td><td></td><td></td><td></td><td></td><td class="s">   $h = harness \@smbclient, \$in, \$out, \$err, ( my $t = timeout 30 );</td></tr>
+<tr><td class="h"><a name="326"></a>326</td><td></td><td></td><td></td><td></td><td class="s">   sleep 11;  # No effect: timer not running yet</td></tr>
+<tr><td class="h"><a name="327"></a>327</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="328"></a>328</td><td></td><td></td><td></td><td></td><td class="s">   start $h;</td></tr>
+<tr><td class="h"><a name="329"></a>329</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;cd /src\n&quot;;</td></tr>
+<tr><td class="h"><a name="330"></a>330</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until ! length $in;</td></tr>
+<tr><td class="h"><a name="331"></a>331</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="332"></a>332</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;ls\n&quot;;</td></tr>
+<tr><td class="h"><a name="333"></a>333</td><td></td><td></td><td></td><td></td><td class="s">   ## Now use a short timeout, since this should be faster</td></tr>
+<tr><td class="h"><a name="334"></a>334</td><td></td><td></td><td></td><td></td><td class="s">   $t-&gt;start( 5 );</td></tr>
+<tr><td class="h"><a name="335"></a>335</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until ! length $in;</td></tr>
+<tr><td class="h"><a name="336"></a>336</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="337"></a>337</td><td></td><td></td><td></td><td></td><td class="s">   $t-&gt;start( 10 );  ## Give smbclient a little while to shut down.</td></tr>
+<tr><td class="h"><a name="338"></a>338</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;finish;</td></tr>
+<tr><td class="h"><a name="339"></a>339</td><td></td><td></td><td></td><td></td><td class="s"> };</td></tr>
+<tr><td class="h"><a name="340"></a>340</td><td></td><td></td><td></td><td></td><td class="s"> if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="341"></a>341</td><td></td><td></td><td></td><td></td><td class="s">   my $x = $@;    ## Preserve $@ in case another exception occurs</td></tr>
+<tr><td class="h"><a name="342"></a>342</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;kill_kill; ## kill it gently, then brutally if need be, or just</td></tr>
+<tr><td class="h"><a name="343"></a>343</td><td></td><td></td><td></td><td></td><td class="s">                   ## brutally on Win32.</td></tr>
+<tr><td class="h"><a name="344"></a>344</td><td></td><td></td><td></td><td></td><td class="s">   die $x;</td></tr>
+<tr><td class="h"><a name="345"></a>345</td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
+<tr><td class="h"><a name="346"></a>346</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="347"></a>347</td><td></td><td></td><td></td><td></td><td class="s">Timeouts and timers are I&lt;not&gt; checked once the subprocesses are shut</td></tr>
+<tr><td class="h"><a name="348"></a>348</td><td></td><td></td><td></td><td></td><td class="s">down; they will not expire in the interval between the last valid</td></tr>
+<tr><td class="h"><a name="349"></a>349</td><td></td><td></td><td></td><td></td><td class="s">process and when IPC::Run scoops up the processes' result codes, for</td></tr>
+<tr><td class="h"><a name="350"></a>350</td><td></td><td></td><td></td><td></td><td class="s">instance.</td></tr>
+<tr><td class="h"><a name="351"></a>351</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="352"></a>352</td><td></td><td></td><td></td><td></td><td class="s">=head2 Spawning synchronization, child exception propagation</td></tr>
+<tr><td class="h"><a name="353"></a>353</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="354"></a>354</td><td></td><td></td><td></td><td></td><td class="s">start() pauses the parent until the child executes the command or CODE</td></tr>
+<tr><td class="h"><a name="355"></a>355</td><td></td><td></td><td></td><td></td><td class="s">reference and propagates any exceptions thrown (including exec()</td></tr>
+<tr><td class="h"><a name="356"></a>356</td><td></td><td></td><td></td><td></td><td class="s">failure) back to the parent.  This has several pleasant effects: any</td></tr>
+<tr><td class="h"><a name="357"></a>357</td><td></td><td></td><td></td><td></td><td class="s">exceptions thrown in the child, including exec() failure, come flying</td></tr>
+<tr><td class="h"><a name="358"></a>358</td><td></td><td></td><td></td><td></td><td class="s">out of start() or run() as though they had ocurred in the parent.</td></tr>
+<tr><td class="h"><a name="359"></a>359</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="360"></a>360</td><td></td><td></td><td></td><td></td><td class="s">This includes exceptions your code thrown from init subs.  In this</td></tr>
+<tr><td class="h"><a name="361"></a>361</td><td></td><td></td><td></td><td></td><td class="s">example:</td></tr>
+<tr><td class="h"><a name="362"></a>362</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="363"></a>363</td><td></td><td></td><td></td><td></td><td class="s">   eval {</td></tr>
+<tr><td class="h"><a name="364"></a>364</td><td></td><td></td><td></td><td></td><td class="s">      run \@cmd, init =&gt; sub { die &quot;blast it! foiled again!&quot; };</td></tr>
+<tr><td class="h"><a name="365"></a>365</td><td></td><td></td><td></td><td></td><td class="s">   };</td></tr>
+<tr><td class="h"><a name="366"></a>366</td><td></td><td></td><td></td><td></td><td class="s">   print $@;</td></tr>
+<tr><td class="h"><a name="367"></a>367</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="368"></a>368</td><td></td><td></td><td></td><td></td><td class="s">the exception &quot;blast it! foiled again&quot; will be thrown from the child</td></tr>
+<tr><td class="h"><a name="369"></a>369</td><td></td><td></td><td></td><td></td><td class="s">process (preventing the exec()) and printed by the parent.</td></tr>
+<tr><td class="h"><a name="370"></a>370</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="371"></a>371</td><td></td><td></td><td></td><td></td><td class="s">In situations like</td></tr>
+<tr><td class="h"><a name="372"></a>372</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="373"></a>373</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd1, &quot;|&quot;, \@cmd2, &quot;|&quot;, \@cmd3;</td></tr>
+<tr><td class="h"><a name="374"></a>374</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="375"></a>375</td><td></td><td></td><td></td><td></td><td class="s">@cmd1 will be initted and exec()ed before @cmd2, and @cmd2 before @cmd3.</td></tr>
+<tr><td class="h"><a name="376"></a>376</td><td></td><td></td><td></td><td></td><td class="s">This can save time and prevent oddball errors emitted by later commands</td></tr>
+<tr><td class="h"><a name="377"></a>377</td><td></td><td></td><td></td><td></td><td class="s">when earlier commands fail to execute.  Note that IPC::Run doesn't start</td></tr>
+<tr><td class="h"><a name="378"></a>378</td><td></td><td></td><td></td><td></td><td class="s">any commands unless it can find the executables referenced by all</td></tr>
+<tr><td class="h"><a name="379"></a>379</td><td></td><td></td><td></td><td></td><td class="s">commands.  These executables must pass both the C&lt;-f&gt; and C&lt;-x&gt; tests</td></tr>
+<tr><td class="h"><a name="380"></a>380</td><td></td><td></td><td></td><td></td><td class="s">described in L&lt;perlfunc&gt;.</td></tr>
+<tr><td class="h"><a name="381"></a>381</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="382"></a>382</td><td></td><td></td><td></td><td></td><td class="s">Another nice effect is that init() subs can take their time doing things</td></tr>
+<tr><td class="h"><a name="383"></a>383</td><td></td><td></td><td></td><td></td><td class="s">and there will be no problems caused by a parent continuing to execute</td></tr>
+<tr><td class="h"><a name="384"></a>384</td><td></td><td></td><td></td><td></td><td class="s">before a child's init() routine is complete.  Say the init() routine</td></tr>
+<tr><td class="h"><a name="385"></a>385</td><td></td><td></td><td></td><td></td><td class="s">needs to open a socket or a temp file that the parent wants to connect</td></tr>
+<tr><td class="h"><a name="386"></a>386</td><td></td><td></td><td></td><td></td><td class="s">to; without this synchronization, the parent will need to implement a</td></tr>
+<tr><td class="h"><a name="387"></a>387</td><td></td><td></td><td></td><td></td><td class="s">retry loop to wait for the child to run, since often, the parent gets a</td></tr>
+<tr><td class="h"><a name="388"></a>388</td><td></td><td></td><td></td><td></td><td class="s">lot of things done before the child's first timeslice is allocated.</td></tr>
+<tr><td class="h"><a name="389"></a>389</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="390"></a>390</td><td></td><td></td><td></td><td></td><td class="s">This is also quite necessary for pseudo-tty initialization, which needs</td></tr>
+<tr><td class="h"><a name="391"></a>391</td><td></td><td></td><td></td><td></td><td class="s">to take place before the parent writes to the child via pty.  Writes</td></tr>
+<tr><td class="h"><a name="392"></a>392</td><td></td><td></td><td></td><td></td><td class="s">that occur before the pty is set up can get lost.</td></tr>
+<tr><td class="h"><a name="393"></a>393</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="394"></a>394</td><td></td><td></td><td></td><td></td><td class="s">A final, minor, nicety is that debugging output from the child will be</td></tr>
+<tr><td class="h"><a name="395"></a>395</td><td></td><td></td><td></td><td></td><td class="s">emitted before the parent continues on, making for much clearer debugging</td></tr>
+<tr><td class="h"><a name="396"></a>396</td><td></td><td></td><td></td><td></td><td class="s">output in complex situations.</td></tr>
+<tr><td class="h"><a name="397"></a>397</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="398"></a>398</td><td></td><td></td><td></td><td></td><td class="s">The only drawback I can conceive of is that the parent can't continue to</td></tr>
+<tr><td class="h"><a name="399"></a>399</td><td></td><td></td><td></td><td></td><td class="s">operate while the child is being initted.  If this ever becomes a</td></tr>
+<tr><td class="h"><a name="400"></a>400</td><td></td><td></td><td></td><td></td><td class="s">problem in the field, we can implement an option to avoid this behavior,</td></tr>
+<tr><td class="h"><a name="401"></a>401</td><td></td><td></td><td></td><td></td><td class="s">but I don't expect it to.</td></tr>
+<tr><td class="h"><a name="402"></a>402</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="403"></a>403</td><td></td><td></td><td></td><td></td><td class="s">B&lt;Win32&gt;: executing CODE references isn't supported on Win32, see</td></tr>
+<tr><td class="h"><a name="404"></a>404</td><td></td><td></td><td></td><td></td><td class="s">L&lt;/Win32 LIMITATIONS&gt; for details.</td></tr>
+<tr><td class="h"><a name="405"></a>405</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="406"></a>406</td><td></td><td></td><td></td><td></td><td class="s">=head2 Syntax</td></tr>
+<tr><td class="h"><a name="407"></a>407</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="408"></a>408</td><td></td><td></td><td></td><td></td><td class="s">run(), start(), and harness() can all take a harness specification</td></tr>
+<tr><td class="h"><a name="409"></a>409</td><td></td><td></td><td></td><td></td><td class="s">as input.  A harness specification is either a single string to be passed</td></tr>
+<tr><td class="h"><a name="410"></a>410</td><td></td><td></td><td></td><td></td><td class="s">to the systems' shell:</td></tr>
+<tr><td class="h"><a name="411"></a>411</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="412"></a>412</td><td></td><td></td><td></td><td></td><td class="s">   run &quot;echo 'hi there'&quot;;</td></tr>
+<tr><td class="h"><a name="413"></a>413</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="414"></a>414</td><td></td><td></td><td></td><td></td><td class="s">or a list of commands, io operations, and/or timers/timeouts to execute.</td></tr>
+<tr><td class="h"><a name="415"></a>415</td><td></td><td></td><td></td><td></td><td class="s">Consecutive commands must be separated by a pipe operator '|' or an '&amp;'.</td></tr>
+<tr><td class="h"><a name="416"></a>416</td><td></td><td></td><td></td><td></td><td class="s">External commands are passed in as array references, and, on systems</td></tr>
+<tr><td class="h"><a name="417"></a>417</td><td></td><td></td><td></td><td></td><td class="s">supporting fork(), Perl code may be passed in as subs:</td></tr>
+<tr><td class="h"><a name="418"></a>418</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="419"></a>419</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd;</td></tr>
+<tr><td class="h"><a name="420"></a>420</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd1, '|', \@cmd2;</td></tr>
+<tr><td class="h"><a name="421"></a>421</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd1, '&amp;', \@cmd2;</td></tr>
+<tr><td class="h"><a name="422"></a>422</td><td></td><td></td><td></td><td></td><td class="s">   run \&amp;sub1;</td></tr>
+<tr><td class="h"><a name="423"></a>423</td><td></td><td></td><td></td><td></td><td class="s">   run \&amp;sub1, '|', \&amp;sub2;</td></tr>
+<tr><td class="h"><a name="424"></a>424</td><td></td><td></td><td></td><td></td><td class="s">   run \&amp;sub1, '&amp;', \&amp;sub2;</td></tr>
+<tr><td class="h"><a name="425"></a>425</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="426"></a>426</td><td></td><td></td><td></td><td></td><td class="s">'|' pipes the stdout of \@cmd1 the stdin of \@cmd2, just like a</td></tr>
+<tr><td class="h"><a name="427"></a>427</td><td></td><td></td><td></td><td></td><td class="s">shell pipe.  '&amp;' does not.  Child processes to the right of a '&amp;'</td></tr>
+<tr><td class="h"><a name="428"></a>428</td><td></td><td></td><td></td><td></td><td class="s">will have their stdin closed unless it's redirected-to.</td></tr>
+<tr><td class="h"><a name="429"></a>429</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="430"></a>430</td><td></td><td></td><td></td><td></td><td class="s">L&lt;IPC::Run::IO&gt; objects may be passed in as well, whether or not</td></tr>
+<tr><td class="h"><a name="431"></a>431</td><td></td><td></td><td></td><td></td><td class="s">child processes are also specified:</td></tr>
+<tr><td class="h"><a name="432"></a>432</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="433"></a>433</td><td></td><td></td><td></td><td></td><td class="s">   run io( &quot;infile&quot;, &quot;&gt;&quot;, \$in ), io( &quot;outfile&quot;, &quot;&lt;&quot;, \$in );</td></tr>
+<tr><td class="h"><a name="434"></a>434</td><td></td><td></td><td></td><td></td><td class="s">      </td></tr>
+<tr><td class="h"><a name="435"></a>435</td><td></td><td></td><td></td><td></td><td class="s">as can L&lt;IPC::Run::Timer&gt; objects:</td></tr>
+<tr><td class="h"><a name="436"></a>436</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="437"></a>437</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, io( &quot;outfile&quot;, &quot;&lt;&quot;, \$in ), timeout( 10 );</td></tr>
+<tr><td class="h"><a name="438"></a>438</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="439"></a>439</td><td></td><td></td><td></td><td></td><td class="s">Commands may be followed by scalar, sub, or i/o handle references for</td></tr>
+<tr><td class="h"><a name="440"></a>440</td><td></td><td></td><td></td><td></td><td class="s">redirecting</td></tr>
+<tr><td class="h"><a name="441"></a>441</td><td></td><td></td><td></td><td></td><td class="s">child process input &amp; output:</td></tr>
+<tr><td class="h"><a name="442"></a>442</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="443"></a>443</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd,  \undef,            \$out;</td></tr>
+<tr><td class="h"><a name="444"></a>444</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd,  \$in,              \$out;</td></tr>
+<tr><td class="h"><a name="445"></a>445</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd1, \&amp;in, '|', \@cmd2, \*OUT;</td></tr>
+<tr><td class="h"><a name="446"></a>446</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd1, \*IN, '|', \@cmd2, \&amp;out;</td></tr>
+<tr><td class="h"><a name="447"></a>447</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="448"></a>448</td><td></td><td></td><td></td><td></td><td class="s">This is known as succinct redirection syntax, since run(), start()</td></tr>
+<tr><td class="h"><a name="449"></a>449</td><td></td><td></td><td></td><td></td><td class="s">and harness(), figure out which file descriptor to redirect and how.</td></tr>
+<tr><td class="h"><a name="450"></a>450</td><td></td><td></td><td></td><td></td><td class="s">File descriptor 0 is presumed to be an input for</td></tr>
+<tr><td class="h"><a name="451"></a>451</td><td></td><td></td><td></td><td></td><td class="s">the child process, all others are outputs.  The assumed file</td></tr>
+<tr><td class="h"><a name="452"></a>452</td><td></td><td></td><td></td><td></td><td class="s">descriptor always starts at 0, unless the command is being piped to,</td></tr>
+<tr><td class="h"><a name="453"></a>453</td><td></td><td></td><td></td><td></td><td class="s">in which case it starts at 1.</td></tr>
+<tr><td class="h"><a name="454"></a>454</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="455"></a>455</td><td></td><td></td><td></td><td></td><td class="s">To be explicit about your redirects, or if you need to do more complex</td></tr>
+<tr><td class="h"><a name="456"></a>456</td><td></td><td></td><td></td><td></td><td class="s">things, there's also a redirection operator syntax:</td></tr>
+<tr><td class="h"><a name="457"></a>457</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="458"></a>458</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, '&lt;', \undef, '&gt;',  \$out;</td></tr>
+<tr><td class="h"><a name="459"></a>459</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, '&lt;', \undef, '&gt;&amp;', \$out_and_err;</td></tr>
+<tr><td class="h"><a name="460"></a>460</td><td></td><td></td><td></td><td></td><td class="s">   run(</td></tr>
+<tr><td class="h"><a name="461"></a>461</td><td></td><td></td><td></td><td></td><td class="s">      \@cmd1,</td></tr>
+<tr><td class="h"><a name="462"></a>462</td><td></td><td></td><td></td><td></td><td class="s">         '&lt;', \$in,</td></tr>
+<tr><td class="h"><a name="463"></a>463</td><td></td><td></td><td></td><td></td><td class="s">      '|', \@cmd2,</td></tr>
+<tr><td class="h"><a name="464"></a>464</td><td></td><td></td><td></td><td></td><td class="s">         \$out</td></tr>
+<tr><td class="h"><a name="465"></a>465</td><td></td><td></td><td></td><td></td><td class="s">   );</td></tr>
+<tr><td class="h"><a name="466"></a>466</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="467"></a>467</td><td></td><td></td><td></td><td></td><td class="s">Operator syntax is required if you need to do something other than simple</td></tr>
+<tr><td class="h"><a name="468"></a>468</td><td></td><td></td><td></td><td></td><td class="s">redirection to/from scalars or subs, like duping or closing file descriptors</td></tr>
+<tr><td class="h"><a name="469"></a>469</td><td></td><td></td><td></td><td></td><td class="s">or redirecting to/from a named file.  The operators are covered in detail</td></tr>
+<tr><td class="h"><a name="470"></a>470</td><td></td><td></td><td></td><td></td><td class="s">below.</td></tr>
+<tr><td class="h"><a name="471"></a>471</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="472"></a>472</td><td></td><td></td><td></td><td></td><td class="s">After each \@cmd (or \&amp;foo), parsing begins in succinct mode and toggles to</td></tr>
+<tr><td class="h"><a name="473"></a>473</td><td></td><td></td><td></td><td></td><td class="s">operator syntax mode when an operator (ie plain scalar, not a ref) is seen.</td></tr>
+<tr><td class="h"><a name="474"></a>474</td><td></td><td></td><td></td><td></td><td class="s">Once in</td></tr>
+<tr><td class="h"><a name="475"></a>475</td><td></td><td></td><td></td><td></td><td class="s">operator syntax mode, parsing only reverts to succinct mode when a '|' or</td></tr>
+<tr><td class="h"><a name="476"></a>476</td><td></td><td></td><td></td><td></td><td class="s">'&amp;' is seen.</td></tr>
+<tr><td class="h"><a name="477"></a>477</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="478"></a>478</td><td></td><td></td><td></td><td></td><td class="s">In succinct mode, each parameter after the \@cmd specifies what to</td></tr>
+<tr><td class="h"><a name="479"></a>479</td><td></td><td></td><td></td><td></td><td class="s">do with the next highest file descriptor. These File descriptor start</td></tr>
+<tr><td class="h"><a name="480"></a>480</td><td></td><td></td><td></td><td></td><td class="s">with 0 (stdin) unless stdin is being piped to (C&lt;'|', \@cmd&gt;), in which</td></tr>
+<tr><td class="h"><a name="481"></a>481</td><td></td><td></td><td></td><td></td><td class="s">case they start with 1 (stdout).  Currently, being on the left of</td></tr>
+<tr><td class="h"><a name="482"></a>482</td><td></td><td></td><td></td><td></td><td class="s">a pipe (C&lt;\@cmd, \$out, \$err, '|'&gt;) does I&lt;not&gt; cause stdout to be</td></tr>
+<tr><td class="h"><a name="483"></a>483</td><td></td><td></td><td></td><td></td><td class="s">skipped, though this may change since it's not as DWIMerly as it</td></tr>
+<tr><td class="h"><a name="484"></a>484</td><td></td><td></td><td></td><td></td><td class="s">could be.  Only stdin is assumed to be an</td></tr>
+<tr><td class="h"><a name="485"></a>485</td><td></td><td></td><td></td><td></td><td class="s">input in succinct mode, all others are assumed to be outputs.</td></tr>
+<tr><td class="h"><a name="486"></a>486</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="487"></a>487</td><td></td><td></td><td></td><td></td><td class="s">If no piping or redirection is specified for a child, it will inherit</td></tr>
+<tr><td class="h"><a name="488"></a>488</td><td></td><td></td><td></td><td></td><td class="s">the parent's open file handles as dictated by your system's</td></tr>
+<tr><td class="h"><a name="489"></a>489</td><td></td><td></td><td></td><td></td><td class="s">close-on-exec behavior and the $^F flag, except that processes after a</td></tr>
+<tr><td class="h"><a name="490"></a>490</td><td></td><td></td><td></td><td></td><td class="s">'&amp;' will not inherit the parent's stdin. Also note that $^F does not</td></tr>
+<tr><td class="h"><a name="491"></a>491</td><td></td><td></td><td></td><td></td><td class="s">affect file desciptors obtained via POSIX, since it only applies to</td></tr>
+<tr><td class="h"><a name="492"></a>492</td><td></td><td></td><td></td><td></td><td class="s">full-fledged Perl file handles.  Such processes will have their stdin</td></tr>
+<tr><td class="h"><a name="493"></a>493</td><td></td><td></td><td></td><td></td><td class="s">closed unless it has been redirected-to.</td></tr>
+<tr><td class="h"><a name="494"></a>494</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="495"></a>495</td><td></td><td></td><td></td><td></td><td class="s">If you want to close a child processes stdin, you may do any of:</td></tr>
+<tr><td class="h"><a name="496"></a>496</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="497"></a>497</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, \undef;</td></tr>
+<tr><td class="h"><a name="498"></a>498</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, \&quot;&quot;;</td></tr>
+<tr><td class="h"><a name="499"></a>499</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, '&lt;&amp;-';</td></tr>
+<tr><td class="h"><a name="500"></a>500</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, '0&lt;&amp;-';</td></tr>
+<tr><td class="h"><a name="501"></a>501</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="502"></a>502</td><td></td><td></td><td></td><td></td><td class="s">Redirection is done by placing redirection specifications immediately </td></tr>
+<tr><td class="h"><a name="503"></a>503</td><td></td><td></td><td></td><td></td><td class="s">after a command or child subroutine:</td></tr>
+<tr><td class="h"><a name="504"></a>504</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="505"></a>505</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd1,      \$in, '|', \@cmd2,      \$out;</td></tr>
+<tr><td class="h"><a name="506"></a>506</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd1, '&lt;', \$in, '|', \@cmd2, '&gt;', \$out;</td></tr>
+<tr><td class="h"><a name="507"></a>507</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="508"></a>508</td><td></td><td></td><td></td><td></td><td class="s">If you omit the redirection operators, descriptors are counted</td></tr>
+<tr><td class="h"><a name="509"></a>509</td><td></td><td></td><td></td><td></td><td class="s">starting at 0.  Descriptor 0 is assumed to be input, all others</td></tr>
+<tr><td class="h"><a name="510"></a>510</td><td></td><td></td><td></td><td></td><td class="s">are outputs.  A leading '|' consumes descriptor 0, so this</td></tr>
+<tr><td class="h"><a name="511"></a>511</td><td></td><td></td><td></td><td></td><td class="s">works as expected.</td></tr>
+<tr><td class="h"><a name="512"></a>512</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="513"></a>513</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd1, \$in, '|', \@cmd2, \$out;</td></tr>
+<tr><td class="h"><a name="514"></a>514</td><td></td><td></td><td></td><td></td><td class="s">   </td></tr>
+<tr><td class="h"><a name="515"></a>515</td><td></td><td></td><td></td><td></td><td class="s">The parameter following a redirection operator can be a scalar ref,</td></tr>
+<tr><td class="h"><a name="516"></a>516</td><td></td><td></td><td></td><td></td><td class="s">a subroutine ref, a file name, an open filehandle, or a closed</td></tr>
+<tr><td class="h"><a name="517"></a>517</td><td></td><td></td><td></td><td></td><td class="s">filehandle.</td></tr>
+<tr><td class="h"><a name="518"></a>518</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="519"></a>519</td><td></td><td></td><td></td><td></td><td class="s">If it's a scalar ref, the child reads input from or sends output to</td></tr>
+<tr><td class="h"><a name="520"></a>520</td><td></td><td></td><td></td><td></td><td class="s">that variable:</td></tr>
+<tr><td class="h"><a name="521"></a>521</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="522"></a>522</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;Hello World.\n&quot;;</td></tr>
+<tr><td class="h"><a name="523"></a>523</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, \$in, \$out;</td></tr>
+<tr><td class="h"><a name="524"></a>524</td><td></td><td></td><td></td><td></td><td class="s">   print $out;</td></tr>
+<tr><td class="h"><a name="525"></a>525</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="526"></a>526</td><td></td><td></td><td></td><td></td><td class="s">Scalars used in incremental (start()/pump()/finish()) applications are treated</td></tr>
+<tr><td class="h"><a name="527"></a>527</td><td></td><td></td><td></td><td></td><td class="s">as queues: input is removed from input scalers, resulting in them dwindling</td></tr>
+<tr><td class="h"><a name="528"></a>528</td><td></td><td></td><td></td><td></td><td class="s">to '', and output is appended to output scalars.  This is not true of </td></tr>
+<tr><td class="h"><a name="529"></a>529</td><td></td><td></td><td></td><td></td><td class="s">harnesses run() in batch mode.</td></tr>
+<tr><td class="h"><a name="530"></a>530</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="531"></a>531</td><td></td><td></td><td></td><td></td><td class="s">It's usually wise to append new input to be sent to the child to the input</td></tr>
+<tr><td class="h"><a name="532"></a>532</td><td></td><td></td><td></td><td></td><td class="s">queue, and you'll often want to zap output queues to '' before pumping.</td></tr>
+<tr><td class="h"><a name="533"></a>533</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="534"></a>534</td><td></td><td></td><td></td><td></td><td class="s">   $h = start \@cat, \$in;</td></tr>
+<tr><td class="h"><a name="535"></a>535</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;line 1\n&quot;;</td></tr>
+<tr><td class="h"><a name="536"></a>536</td><td></td><td></td><td></td><td></td><td class="s">   pump $h;</td></tr>
+<tr><td class="h"><a name="537"></a>537</td><td></td><td></td><td></td><td></td><td class="s">   $in .= &quot;line 2\n&quot;;</td></tr>
+<tr><td class="h"><a name="538"></a>538</td><td></td><td></td><td></td><td></td><td class="s">   pump $h;</td></tr>
+<tr><td class="h"><a name="539"></a>539</td><td></td><td></td><td></td><td></td><td class="s">   $in .= &quot;line 3\n&quot;;</td></tr>
+<tr><td class="h"><a name="540"></a>540</td><td></td><td></td><td></td><td></td><td class="s">   finish $h;</td></tr>
+<tr><td class="h"><a name="541"></a>541</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="542"></a>542</td><td></td><td></td><td></td><td></td><td class="s">The final call to finish() must be there: it allows the child process(es)</td></tr>
+<tr><td class="h"><a name="543"></a>543</td><td></td><td></td><td></td><td></td><td class="s">to run to completion and waits for their exit values.</td></tr>
+<tr><td class="h"><a name="544"></a>544</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="545"></a>545</td><td></td><td></td><td></td><td></td><td class="s">=head1 OBSTINATE CHILDREN</td></tr>
+<tr><td class="h"><a name="546"></a>546</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="547"></a>547</td><td></td><td></td><td></td><td></td><td class="s">Interactive applications are usually optimized for human use.  This</td></tr>
+<tr><td class="h"><a name="548"></a>548</td><td></td><td></td><td></td><td></td><td class="s">can help or hinder trying to interact with them through modules like</td></tr>
+<tr><td class="h"><a name="549"></a>549</td><td></td><td></td><td></td><td></td><td class="s">IPC::Run.  Frequently, programs alter their behavior when they detect</td></tr>
+<tr><td class="h"><a name="550"></a>550</td><td></td><td></td><td></td><td></td><td class="s">that stdin, stdout, or stderr are not connected to a tty, assuming that</td></tr>
+<tr><td class="h"><a name="551"></a>551</td><td></td><td></td><td></td><td></td><td class="s">they are being run in batch mode.  Whether this helps or hurts depends</td></tr>
+<tr><td class="h"><a name="552"></a>552</td><td></td><td></td><td></td><td></td><td class="s">on which optimizations change.  And there's often no way of telling</td></tr>
+<tr><td class="h"><a name="553"></a>553</td><td></td><td></td><td></td><td></td><td class="s">what a program does in these areas other than trial and error and,</td></tr>
+<tr><td class="h"><a name="554"></a>554</td><td></td><td></td><td></td><td></td><td class="s">occasionally, reading the source.  This includes different versions</td></tr>
+<tr><td class="h"><a name="555"></a>555</td><td></td><td></td><td></td><td></td><td class="s">and implementations of the same program.</td></tr>
+<tr><td class="h"><a name="556"></a>556</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="557"></a>557</td><td></td><td></td><td></td><td></td><td class="s">All hope is not lost, however.  Most programs behave in reasonably</td></tr>
+<tr><td class="h"><a name="558"></a>558</td><td></td><td></td><td></td><td></td><td class="s">tractable manners, once you figure out what it's trying to do.</td></tr>
+<tr><td class="h"><a name="559"></a>559</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="560"></a>560</td><td></td><td></td><td></td><td></td><td class="s">Here are some of the issues you might need to be aware of.</td></tr>
+<tr><td class="h"><a name="561"></a>561</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="562"></a>562</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="563"></a>563</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="564"></a>564</td><td></td><td></td><td></td><td></td><td class="s">=item *</td></tr>
+<tr><td class="h"><a name="565"></a>565</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="566"></a>566</td><td></td><td></td><td></td><td></td><td class="s">fflush()ing stdout and stderr</td></tr>
+<tr><td class="h"><a name="567"></a>567</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="568"></a>568</td><td></td><td></td><td></td><td></td><td class="s">This lets the user see stdout and stderr immediately.  Many programs</td></tr>
+<tr><td class="h"><a name="569"></a>569</td><td></td><td></td><td></td><td></td><td class="s">undo this optimization if stdout is not a tty, making them harder to</td></tr>
+<tr><td class="h"><a name="570"></a>570</td><td></td><td></td><td></td><td></td><td class="s">manage by things like IPC::Run.</td></tr>
+<tr><td class="h"><a name="571"></a>571</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="572"></a>572</td><td></td><td></td><td></td><td></td><td class="s">Many programs decline to fflush stdout or stderr if they do not</td></tr>
+<tr><td class="h"><a name="573"></a>573</td><td></td><td></td><td></td><td></td><td class="s">detect a tty there.  Some ftp commands do this, for instance.</td></tr>
+<tr><td class="h"><a name="574"></a>574</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="575"></a>575</td><td></td><td></td><td></td><td></td><td class="s">If this happens to you, look for a way to force interactive behavior,</td></tr>
+<tr><td class="h"><a name="576"></a>576</td><td></td><td></td><td></td><td></td><td class="s">like a command line switch or command.  If you can't, you will</td></tr>
+<tr><td class="h"><a name="577"></a>577</td><td></td><td></td><td></td><td></td><td class="s">need to use a pseudo terminal ('&lt;pty&lt;' and '&gt;pty&gt;').</td></tr>
+<tr><td class="h"><a name="578"></a>578</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="579"></a>579</td><td></td><td></td><td></td><td></td><td class="s">=item *</td></tr>
+<tr><td class="h"><a name="580"></a>580</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="581"></a>581</td><td></td><td></td><td></td><td></td><td class="s">false prompts</td></tr>
+<tr><td class="h"><a name="582"></a>582</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="583"></a>583</td><td></td><td></td><td></td><td></td><td class="s">Interactive programs generally do not guarantee that output from user</td></tr>
+<tr><td class="h"><a name="584"></a>584</td><td></td><td></td><td></td><td></td><td class="s">commands won't contain a prompt string.  For example, your shell prompt</td></tr>
+<tr><td class="h"><a name="585"></a>585</td><td></td><td></td><td></td><td></td><td class="s">might be a '$', and a file named '$' might be the only file in a directory</td></tr>
+<tr><td class="h"><a name="586"></a>586</td><td></td><td></td><td></td><td></td><td class="s">listing.</td></tr>
+<tr><td class="h"><a name="587"></a>587</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="588"></a>588</td><td></td><td></td><td></td><td></td><td class="s">This can make it hard to guarantee that your output parser won't be fooled</td></tr>
+<tr><td class="h"><a name="589"></a>589</td><td></td><td></td><td></td><td></td><td class="s">into early termination of results.</td></tr>
+<tr><td class="h"><a name="590"></a>590</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="591"></a>591</td><td></td><td></td><td></td><td></td><td class="s">To help work around this, you can see if the program can alter it's </td></tr>
+<tr><td class="h"><a name="592"></a>592</td><td></td><td></td><td></td><td></td><td class="s">prompt, and use something you feel is never going to occur in actual</td></tr>
+<tr><td class="h"><a name="593"></a>593</td><td></td><td></td><td></td><td></td><td class="s">practice.</td></tr>
+<tr><td class="h"><a name="594"></a>594</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="595"></a>595</td><td></td><td></td><td></td><td></td><td class="s">You should also look for your prompt to be the only thing on a line:</td></tr>
+<tr><td class="h"><a name="596"></a>596</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="597"></a>597</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until $out =~ /^&lt;SILLYPROMPT&gt;\s?\z/m;</td></tr>
+<tr><td class="h"><a name="598"></a>598</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="599"></a>599</td><td></td><td></td><td></td><td></td><td class="s">(use C&lt;(?!\n)\Z&gt; in place of C&lt;\z&gt; on older perls).</td></tr>
+<tr><td class="h"><a name="600"></a>600</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="601"></a>601</td><td></td><td></td><td></td><td></td><td class="s">You can also take the approach that IPC::ChildSafe takes and emit a</td></tr>
+<tr><td class="h"><a name="602"></a>602</td><td></td><td></td><td></td><td></td><td class="s">command with known output after each 'real' command you issue, then</td></tr>
+<tr><td class="h"><a name="603"></a>603</td><td></td><td></td><td></td><td></td><td class="s">look for this known output.  See new_appender() and new_chunker() for</td></tr>
+<tr><td class="h"><a name="604"></a>604</td><td></td><td></td><td></td><td></td><td class="s">filters that can help with this task.</td></tr>
+<tr><td class="h"><a name="605"></a>605</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="606"></a>606</td><td></td><td></td><td></td><td></td><td class="s">If it's not convenient or possibly to alter a prompt or use a known</td></tr>
+<tr><td class="h"><a name="607"></a>607</td><td></td><td></td><td></td><td></td><td class="s">command/response pair, you might need to autodetect the prompt in case</td></tr>
+<tr><td class="h"><a name="608"></a>608</td><td></td><td></td><td></td><td></td><td class="s">the local version of the child program is different then the one</td></tr>
+<tr><td class="h"><a name="609"></a>609</td><td></td><td></td><td></td><td></td><td class="s">you tested with, or if the user has control over the look &amp; feel of</td></tr>
+<tr><td class="h"><a name="610"></a>610</td><td></td><td></td><td></td><td></td><td class="s">the prompt.</td></tr>
+<tr><td class="h"><a name="611"></a>611</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="612"></a>612</td><td></td><td></td><td></td><td></td><td class="s">=item *</td></tr>
+<tr><td class="h"><a name="613"></a>613</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="614"></a>614</td><td></td><td></td><td></td><td></td><td class="s">Refusing to accept input unless stdin is a tty.</td></tr>
+<tr><td class="h"><a name="615"></a>615</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="616"></a>616</td><td></td><td></td><td></td><td></td><td class="s">Some programs, for security reasons, will only accept certain types</td></tr>
+<tr><td class="h"><a name="617"></a>617</td><td></td><td></td><td></td><td></td><td class="s">of input from a tty.  su, notable, will not prompt for a password unless</td></tr>
+<tr><td class="h"><a name="618"></a>618</td><td></td><td></td><td></td><td></td><td class="s">it's connected to a tty.</td></tr>
+<tr><td class="h"><a name="619"></a>619</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="620"></a>620</td><td></td><td></td><td></td><td></td><td class="s">If this is your situation, use a pseudo terminal ('&lt;pty&lt;' and '&gt;pty&gt;').</td></tr>
+<tr><td class="h"><a name="621"></a>621</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="622"></a>622</td><td></td><td></td><td></td><td></td><td class="s">=item *</td></tr>
+<tr><td class="h"><a name="623"></a>623</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="624"></a>624</td><td></td><td></td><td></td><td></td><td class="s">Not prompting unless connected to a tty.</td></tr>
+<tr><td class="h"><a name="625"></a>625</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="626"></a>626</td><td></td><td></td><td></td><td></td><td class="s">Some programs don't prompt unless stdin or stdout is a tty.  See if you can</td></tr>
+<tr><td class="h"><a name="627"></a>627</td><td></td><td></td><td></td><td></td><td class="s">turn prompting back on.  If not, see if you can come up with a command that</td></tr>
+<tr><td class="h"><a name="628"></a>628</td><td></td><td></td><td></td><td></td><td class="s">you can issue after every real command and look for it's output, as</td></tr>
+<tr><td class="h"><a name="629"></a>629</td><td></td><td></td><td></td><td></td><td class="s">IPC::ChildSafe does.   There are two filters included with IPC::Run that</td></tr>
+<tr><td class="h"><a name="630"></a>630</td><td></td><td></td><td></td><td></td><td class="s">can help with doing this: appender and chunker (see new_appender() and</td></tr>
+<tr><td class="h"><a name="631"></a>631</td><td></td><td></td><td></td><td></td><td class="s">new_chunker()).</td></tr>
+<tr><td class="h"><a name="632"></a>632</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="633"></a>633</td><td></td><td></td><td></td><td></td><td class="s">=item *</td></tr>
+<tr><td class="h"><a name="634"></a>634</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="635"></a>635</td><td></td><td></td><td></td><td></td><td class="s">Different output format when not connected to a tty.</td></tr>
+<tr><td class="h"><a name="636"></a>636</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="637"></a>637</td><td></td><td></td><td></td><td></td><td class="s">Some commands alter their formats to ease machine parsability when they</td></tr>
+<tr><td class="h"><a name="638"></a>638</td><td></td><td></td><td></td><td></td><td class="s">aren't connected to a pipe.  This is actually good, but can be surprising.</td></tr>
+<tr><td class="h"><a name="639"></a>639</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="640"></a>640</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="641"></a>641</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="642"></a>642</td><td></td><td></td><td></td><td></td><td class="s">=head1 PSEUDO TERMINALS</td></tr>
+<tr><td class="h"><a name="643"></a>643</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="644"></a>644</td><td></td><td></td><td></td><td></td><td class="s">On systems providing pseudo terminals under /dev, IPC::Run can use IO::Pty</td></tr>
+<tr><td class="h"><a name="645"></a>645</td><td></td><td></td><td></td><td></td><td class="s">(available on CPAN) to provide a terminal environment to subprocesses.</td></tr>
+<tr><td class="h"><a name="646"></a>646</td><td></td><td></td><td></td><td></td><td class="s">This is necessary when the subprocess really wants to think it's connected</td></tr>
+<tr><td class="h"><a name="647"></a>647</td><td></td><td></td><td></td><td></td><td class="s">to a real terminal.</td></tr>
+<tr><td class="h"><a name="648"></a>648</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="649"></a>649</td><td></td><td></td><td></td><td></td><td class="s">=head2 CAVEATS</td></tr>
+<tr><td class="h"><a name="650"></a>650</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="651"></a>651</td><td></td><td></td><td></td><td></td><td class="s">Psuedo-terminals are not pipes, though they are similar.  Here are some</td></tr>
+<tr><td class="h"><a name="652"></a>652</td><td></td><td></td><td></td><td></td><td class="s">differences to watch out for.</td></tr>
+<tr><td class="h"><a name="653"></a>653</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="654"></a>654</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="655"></a>655</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="656"></a>656</td><td></td><td></td><td></td><td></td><td class="s">=item Echoing</td></tr>
+<tr><td class="h"><a name="657"></a>657</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="658"></a>658</td><td></td><td></td><td></td><td></td><td class="s">Sending to stdin will cause an echo on stdout, which occurs before each</td></tr>
+<tr><td class="h"><a name="659"></a>659</td><td></td><td></td><td></td><td></td><td class="s">line is passed to the child program.  There is currently no way to</td></tr>
+<tr><td class="h"><a name="660"></a>660</td><td></td><td></td><td></td><td></td><td class="s">disable this, although the child process can and should disable it for</td></tr>
+<tr><td class="h"><a name="661"></a>661</td><td></td><td></td><td></td><td></td><td class="s">things like passwords.</td></tr>
+<tr><td class="h"><a name="662"></a>662</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="663"></a>663</td><td></td><td></td><td></td><td></td><td class="s">=item Shutdown</td></tr>
+<tr><td class="h"><a name="664"></a>664</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="665"></a>665</td><td></td><td></td><td></td><td></td><td class="s">IPC::Run cannot close a pty until all output has been collected.  This</td></tr>
+<tr><td class="h"><a name="666"></a>666</td><td></td><td></td><td></td><td></td><td class="s">means that it is not possible to send an EOF to stdin by half-closing</td></tr>
+<tr><td class="h"><a name="667"></a>667</td><td></td><td></td><td></td><td></td><td class="s">the pty, as we can when using a pipe to stdin.</td></tr>
+<tr><td class="h"><a name="668"></a>668</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="669"></a>669</td><td></td><td></td><td></td><td></td><td class="s">This means that you need to send the child process an exit command or</td></tr>
+<tr><td class="h"><a name="670"></a>670</td><td></td><td></td><td></td><td></td><td class="s">signal, or run() / finish() will time out.  Be careful not to expect a</td></tr>
+<tr><td class="h"><a name="671"></a>671</td><td></td><td></td><td></td><td></td><td class="s">prompt after sending the exit command.</td></tr>
+<tr><td class="h"><a name="672"></a>672</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="673"></a>673</td><td></td><td></td><td></td><td></td><td class="s">=item Command line editing</td></tr>
+<tr><td class="h"><a name="674"></a>674</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="675"></a>675</td><td></td><td></td><td></td><td></td><td class="s">Some subprocesses, notable shells that depend on the user's prompt</td></tr>
+<tr><td class="h"><a name="676"></a>676</td><td></td><td></td><td></td><td></td><td class="s">settings, will reissue the prompt plus the command line input so far</td></tr>
+<tr><td class="h"><a name="677"></a>677</td><td></td><td></td><td></td><td></td><td class="s">once for each character.</td></tr>
+<tr><td class="h"><a name="678"></a>678</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="679"></a>679</td><td></td><td></td><td></td><td></td><td class="s">=item '&gt;pty&gt;' means '&amp;&gt;pty&gt;', not '1&gt;pty&gt;'</td></tr>
+<tr><td class="h"><a name="680"></a>680</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="681"></a>681</td><td></td><td></td><td></td><td></td><td class="s">The pseudo terminal redirects both stdout and stderr unless you specify</td></tr>
+<tr><td class="h"><a name="682"></a>682</td><td></td><td></td><td></td><td></td><td class="s">a file descriptor.  If you want to grab stderr separately, do this:</td></tr>
+<tr><td class="h"><a name="683"></a>683</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="684"></a>684</td><td></td><td></td><td></td><td></td><td class="s">   start \@cmd, '&lt;pty&lt;', \$in, '&gt;pty&gt;', \$out, '2&gt;', \$err;</td></tr>
+<tr><td class="h"><a name="685"></a>685</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="686"></a>686</td><td></td><td></td><td></td><td></td><td class="s">=item stdin, stdout, and stderr not inherited</td></tr>
+<tr><td class="h"><a name="687"></a>687</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="688"></a>688</td><td></td><td></td><td></td><td></td><td class="s">Child processes harnessed to a pseudo terminal have their stdin, stdout,</td></tr>
+<tr><td class="h"><a name="689"></a>689</td><td></td><td></td><td></td><td></td><td class="s">and stderr completely closed before any redirection operators take</td></tr>
+<tr><td class="h"><a name="690"></a>690</td><td></td><td></td><td></td><td></td><td class="s">effect.  This casts of the bonds of the controlling terminal.  This is</td></tr>
+<tr><td class="h"><a name="691"></a>691</td><td></td><td></td><td></td><td></td><td class="s">not done when using pipes.</td></tr>
+<tr><td class="h"><a name="692"></a>692</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="693"></a>693</td><td></td><td></td><td></td><td></td><td class="s">Right now, this affects all children in a harness that has a pty in use,</td></tr>
+<tr><td class="h"><a name="694"></a>694</td><td></td><td></td><td></td><td></td><td class="s">even if that pty would not affect a particular child.  That's a bug and</td></tr>
+<tr><td class="h"><a name="695"></a>695</td><td></td><td></td><td></td><td></td><td class="s">will be fixed.  Until it is, it's best not to mix-and-match children.</td></tr>
+<tr><td class="h"><a name="696"></a>696</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="697"></a>697</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="698"></a>698</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="699"></a>699</td><td></td><td></td><td></td><td></td><td class="s">=head2 Redirection Operators</td></tr>
+<tr><td class="h"><a name="700"></a>700</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="701"></a>701</td><td></td><td></td><td></td><td></td><td class="s">   Operator       SHNP   Description</td></tr>
+<tr><td class="h"><a name="702"></a>702</td><td></td><td></td><td></td><td></td><td class="s">   ========       ====   ===========</td></tr>
+<tr><td class="h"><a name="703"></a>703</td><td></td><td></td><td></td><td></td><td class="s">   &lt;, N&lt;          SHN    Redirects input to a child's fd N (0 assumed)</td></tr>
+<tr><td class="h"><a name="704"></a>704</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="705"></a>705</td><td></td><td></td><td></td><td></td><td class="s">   &gt;, N&gt;          SHN    Redirects output from a child's fd N (1 assumed)</td></tr>
+<tr><td class="h"><a name="706"></a>706</td><td></td><td></td><td></td><td></td><td class="s">   &gt;&gt;, N&gt;&gt;        SHN    Like '&gt;', but appends to scalars or named files</td></tr>
+<tr><td class="h"><a name="707"></a>707</td><td></td><td></td><td></td><td></td><td class="s">   &gt;&amp;, &amp;&gt;         SHN    Redirects stdout &amp; stderr from a child process</td></tr>
+<tr><td class="h"><a name="708"></a>708</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="709"></a>709</td><td></td><td></td><td></td><td></td><td class="s">   &lt;pty, N&lt;pty    S      Like '&lt;', but uses a pseudo-tty instead of a pipe</td></tr>
+<tr><td class="h"><a name="710"></a>710</td><td></td><td></td><td></td><td></td><td class="s">   &gt;pty, N&gt;pty    S      Like '&gt;', but uses a pseudo-tty instead of a pipe</td></tr>
+<tr><td class="h"><a name="711"></a>711</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="712"></a>712</td><td></td><td></td><td></td><td></td><td class="s">   N&lt;&amp;M                  Dups input fd N to input fd M</td></tr>
+<tr><td class="h"><a name="713"></a>713</td><td></td><td></td><td></td><td></td><td class="s">   M&gt;&amp;N                  Dups output fd N to input fd M</td></tr>
+<tr><td class="h"><a name="714"></a>714</td><td></td><td></td><td></td><td></td><td class="s">   N&lt;&amp;-                  Closes fd N</td></tr>
+<tr><td class="h"><a name="715"></a>715</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="716"></a>716</td><td></td><td></td><td></td><td></td><td class="s">   &lt;pipe, N&lt;pipe     P   Pipe opens H for caller to read, write, close.</td></tr>
+<tr><td class="h"><a name="717"></a>717</td><td></td><td></td><td></td><td></td><td class="s">   &gt;pipe, N&gt;pipe     P   Pipe opens H for caller to read, write, close.</td></tr>
+<tr><td class="h"><a name="718"></a>718</td><td></td><td></td><td></td><td></td><td class="s">                      </td></tr>
+<tr><td class="h"><a name="719"></a>719</td><td></td><td></td><td></td><td></td><td class="s">'N' and 'M' are placeholders for integer file descriptor numbers.  The</td></tr>
+<tr><td class="h"><a name="720"></a>720</td><td></td><td></td><td></td><td></td><td class="s">terms 'input' and 'output' are from the child process's perspective.</td></tr>
+<tr><td class="h"><a name="721"></a>721</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="722"></a>722</td><td></td><td></td><td></td><td></td><td class="s">The SHNP field indicates what parameters an operator can take:</td></tr>
+<tr><td class="h"><a name="723"></a>723</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="724"></a>724</td><td></td><td></td><td></td><td></td><td class="s">   S: \$scalar or \&amp;function references.  Filters may be used with</td></tr>
+<tr><td class="h"><a name="725"></a>725</td><td></td><td></td><td></td><td></td><td class="s">      these operators (and only these).</td></tr>
+<tr><td class="h"><a name="726"></a>726</td><td></td><td></td><td></td><td></td><td class="s">   H: \*HANDLE or IO::Handle for caller to open, and close</td></tr>
+<tr><td class="h"><a name="727"></a>727</td><td></td><td></td><td></td><td></td><td class="s">   N: &quot;file name&quot;.</td></tr>
+<tr><td class="h"><a name="728"></a>728</td><td></td><td></td><td></td><td></td><td class="s">   P: \*HANDLE opened by IPC::Run as the parent end of a pipe, but read</td></tr>
+<tr><td class="h"><a name="729"></a>729</td><td></td><td></td><td></td><td></td><td class="s">      and written to and closed by the caller (like IPC::Open3).</td></tr>
+<tr><td class="h"><a name="730"></a>730</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="731"></a>731</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="732"></a>732</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="733"></a>733</td><td></td><td></td><td></td><td></td><td class="s">=item Redirecting input: [n]&lt;, [n]&lt;pipe</td></tr>
+<tr><td class="h"><a name="734"></a>734</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="735"></a>735</td><td></td><td></td><td></td><td></td><td class="s">You can input the child reads on file descriptor number n to come from a</td></tr>
+<tr><td class="h"><a name="736"></a>736</td><td></td><td></td><td></td><td></td><td class="s">scalar variable, subroutine, file handle, or a named file.  If stdin</td></tr>
+<tr><td class="h"><a name="737"></a>737</td><td></td><td></td><td></td><td></td><td class="s">is not redirected, the parent's stdin is inherited.</td></tr>
+<tr><td class="h"><a name="738"></a>738</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="739"></a>739</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, \undef          ## Closes child's stdin immediately</td></tr>
+<tr><td class="h"><a name="740"></a>740</td><td></td><td></td><td></td><td></td><td class="s">      or die &quot;cat returned $?&quot;; </td></tr>
+<tr><td class="h"><a name="741"></a>741</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="742"></a>742</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, \$in;</td></tr>
+<tr><td class="h"><a name="743"></a>743</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="744"></a>744</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, \&lt;&lt;TOHERE;</td></tr>
+<tr><td class="h"><a name="745"></a>745</td><td></td><td></td><td></td><td></td><td class="s">   blah</td></tr>
+<tr><td class="h"><a name="746"></a>746</td><td></td><td></td><td></td><td></td><td class="s">   TOHERE</td></tr>
+<tr><td class="h"><a name="747"></a>747</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="748"></a>748</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, \&amp;input;       ## Calls &amp;input, feeding data returned</td></tr>
+<tr><td class="h"><a name="749"></a>749</td><td></td><td></td><td></td><td></td><td class="s">                              ## to child's.  Closes child's stdin</td></tr>
+<tr><td class="h"><a name="750"></a>750</td><td></td><td></td><td></td><td></td><td class="s">                              ## when undef is returned.</td></tr>
+<tr><td class="h"><a name="751"></a>751</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="752"></a>752</td><td></td><td></td><td></td><td></td><td class="s">Redirecting from named files requires you to use the input</td></tr>
+<tr><td class="h"><a name="753"></a>753</td><td></td><td></td><td></td><td></td><td class="s">redirection operator:</td></tr>
+<tr><td class="h"><a name="754"></a>754</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="755"></a>755</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, '&lt;.profile';</td></tr>
+<tr><td class="h"><a name="756"></a>756</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, '&lt;', '.profile';</td></tr>
+<tr><td class="h"><a name="757"></a>757</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="758"></a>758</td><td></td><td></td><td></td><td></td><td class="s">   open IN, &quot;&lt;foo&quot;;</td></tr>
+<tr><td class="h"><a name="759"></a>759</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, \*IN;</td></tr>
+<tr><td class="h"><a name="760"></a>760</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, *IN{IO};</td></tr>
+<tr><td class="h"><a name="761"></a>761</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="762"></a>762</td><td></td><td></td><td></td><td></td><td class="s">The form used second example here is the safest,</td></tr>
+<tr><td class="h"><a name="763"></a>763</td><td></td><td></td><td></td><td></td><td class="s">since filenames like &quot;0&quot; and &quot;&amp;more\n&quot; won't confuse &amp;run:</td></tr>
+<tr><td class="h"><a name="764"></a>764</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="765"></a>765</td><td></td><td></td><td></td><td></td><td class="s">You can't do either of</td></tr>
+<tr><td class="h"><a name="766"></a>766</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="767"></a>767</td><td></td><td></td><td></td><td></td><td class="s">   run \@a, *IN;      ## INVALID</td></tr>
+<tr><td class="h"><a name="768"></a>768</td><td></td><td></td><td></td><td></td><td class="s">   run \@a, '&lt;', *IN; ## BUGGY: Reads file named like &quot;*main::A&quot;</td></tr>
+<tr><td class="h"><a name="769"></a>769</td><td></td><td></td><td></td><td></td><td class="s">   </td></tr>
+<tr><td class="h"><a name="770"></a>770</td><td></td><td></td><td></td><td></td><td class="s">because perl passes a scalar containing a string that</td></tr>
+<tr><td class="h"><a name="771"></a>771</td><td></td><td></td><td></td><td></td><td class="s">looks like &quot;*main::A&quot; to &amp;run, and &amp;run can't tell the difference</td></tr>
+<tr><td class="h"><a name="772"></a>772</td><td></td><td></td><td></td><td></td><td class="s">between that and a redirection operator or a file name.  &amp;run guarantees</td></tr>
+<tr><td class="h"><a name="773"></a>773</td><td></td><td></td><td></td><td></td><td class="s">that any scalar you pass after a redirection operator is a file name.</td></tr>
+<tr><td class="h"><a name="774"></a>774</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="775"></a>775</td><td></td><td></td><td></td><td></td><td class="s">If your child process will take input from file descriptors other</td></tr>
+<tr><td class="h"><a name="776"></a>776</td><td></td><td></td><td></td><td></td><td class="s">than 0 (stdin), you can use a redirection operator with any of the</td></tr>
+<tr><td class="h"><a name="777"></a>777</td><td></td><td></td><td></td><td></td><td class="s">valid input forms (scalar ref, sub ref, etc.):</td></tr>
+<tr><td class="h"><a name="778"></a>778</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="779"></a>779</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, '3&lt;', \$in3;</td></tr>
+<tr><td class="h"><a name="780"></a>780</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="781"></a>781</td><td></td><td></td><td></td><td></td><td class="s">When redirecting input from a scalar ref, the scalar ref is</td></tr>
+<tr><td class="h"><a name="782"></a>782</td><td></td><td></td><td></td><td></td><td class="s">used as a queue.  This allows you to use &amp;harness and pump() to</td></tr>
+<tr><td class="h"><a name="783"></a>783</td><td></td><td></td><td></td><td></td><td class="s">feed incremental bits of input to a coprocess.  See L&lt;/Coprocesses&gt;</td></tr>
+<tr><td class="h"><a name="784"></a>784</td><td></td><td></td><td></td><td></td><td class="s">below for more information.</td></tr>
+<tr><td class="h"><a name="785"></a>785</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="786"></a>786</td><td></td><td></td><td></td><td></td><td class="s">The &lt;pipe operator opens the write half of a pipe on the filehandle</td></tr>
+<tr><td class="h"><a name="787"></a>787</td><td></td><td></td><td></td><td></td><td class="s">glob reference it takes as an argument:</td></tr>
+<tr><td class="h"><a name="788"></a>788</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="789"></a>789</td><td></td><td></td><td></td><td></td><td class="s">   $h = start \@cat, '&lt;pipe', \*IN;</td></tr>
+<tr><td class="h"><a name="790"></a>790</td><td></td><td></td><td></td><td></td><td class="s">   print IN &quot;hello world\n&quot;;</td></tr>
+<tr><td class="h"><a name="791"></a>791</td><td></td><td></td><td></td><td></td><td class="s">   pump $h;</td></tr>
+<tr><td class="h"><a name="792"></a>792</td><td></td><td></td><td></td><td></td><td class="s">   close IN;</td></tr>
+<tr><td class="h"><a name="793"></a>793</td><td></td><td></td><td></td><td></td><td class="s">   finish $h;</td></tr>
+<tr><td class="h"><a name="794"></a>794</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="795"></a>795</td><td></td><td></td><td></td><td></td><td class="s">Unlike the other '&lt;' operators, IPC::Run does nothing further with</td></tr>
+<tr><td class="h"><a name="796"></a>796</td><td></td><td></td><td></td><td></td><td class="s">it: you are responsible for it.  The previous example is functionally</td></tr>
+<tr><td class="h"><a name="797"></a>797</td><td></td><td></td><td></td><td></td><td class="s">equivalent to:</td></tr>
+<tr><td class="h"><a name="798"></a>798</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="799"></a>799</td><td></td><td></td><td></td><td></td><td class="s">   pipe( \*R, \*IN ) or die $!;</td></tr>
+<tr><td class="h"><a name="800"></a>800</td><td></td><td></td><td></td><td></td><td class="s">   $h = start \@cat, '&lt;', \*IN;</td></tr>
+<tr><td class="h"><a name="801"></a>801</td><td></td><td></td><td></td><td></td><td class="s">   print IN &quot;hello world\n&quot;;</td></tr>
+<tr><td class="h"><a name="802"></a>802</td><td></td><td></td><td></td><td></td><td class="s">   pump $h;</td></tr>
+<tr><td class="h"><a name="803"></a>803</td><td></td><td></td><td></td><td></td><td class="s">   close IN;</td></tr>
+<tr><td class="h"><a name="804"></a>804</td><td></td><td></td><td></td><td></td><td class="s">   finish $h;</td></tr>
+<tr><td class="h"><a name="805"></a>805</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="806"></a>806</td><td></td><td></td><td></td><td></td><td class="s">This is like the behavior of IPC::Open2 and IPC::Open3.</td></tr>
+<tr><td class="h"><a name="807"></a>807</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="808"></a>808</td><td></td><td></td><td></td><td></td><td class="s">B&lt;Win32&gt;: The handle returned is actually a socket handle, so you can</td></tr>
+<tr><td class="h"><a name="809"></a>809</td><td></td><td></td><td></td><td></td><td class="s">use select() on it.</td></tr>
+<tr><td class="h"><a name="810"></a>810</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="811"></a>811</td><td></td><td></td><td></td><td></td><td class="s">=item Redirecting output: [n]&gt;, [n]&gt;&gt;, [n]&gt;&amp;[m], [n]&gt;pipe</td></tr>
+<tr><td class="h"><a name="812"></a>812</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="813"></a>813</td><td></td><td></td><td></td><td></td><td class="s">You can redirect any output the child emits</td></tr>
+<tr><td class="h"><a name="814"></a>814</td><td></td><td></td><td></td><td></td><td class="s">to a scalar variable, subroutine, file handle, or file name.  You</td></tr>
+<tr><td class="h"><a name="815"></a>815</td><td></td><td></td><td></td><td></td><td class="s">can have &amp;run truncate or append to named files or scalars.  If</td></tr>
+<tr><td class="h"><a name="816"></a>816</td><td></td><td></td><td></td><td></td><td class="s">you are redirecting stdin as well, or if the command is on the</td></tr>
+<tr><td class="h"><a name="817"></a>817</td><td></td><td></td><td></td><td></td><td class="s">receiving end of a pipeline ('|'), you can omit the redirection</td></tr>
+<tr><td class="h"><a name="818"></a>818</td><td></td><td></td><td></td><td></td><td class="s">operator:</td></tr>
+<tr><td class="h"><a name="819"></a>819</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="820"></a>820</td><td></td><td></td><td></td><td></td><td class="s">   @ls = ( 'ls' );</td></tr>
+<tr><td class="h"><a name="821"></a>821</td><td></td><td></td><td></td><td></td><td class="s">   run \@ls, \undef, \$out</td></tr>
+<tr><td class="h"><a name="822"></a>822</td><td></td><td></td><td></td><td></td><td class="s">      or die &quot;ls returned $?&quot;; </td></tr>
+<tr><td class="h"><a name="823"></a>823</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="824"></a>824</td><td></td><td></td><td></td><td></td><td class="s">   run \@ls, \undef, \&amp;out;  ## Calls &amp;out each time some output</td></tr>
+<tr><td class="h"><a name="825"></a>825</td><td></td><td></td><td></td><td></td><td class="s">                              ## is received from the child's </td></tr>
+<tr><td class="h"><a name="826"></a>826</td><td></td><td></td><td></td><td></td><td class="s">                              ## when undef is returned.</td></tr>
+<tr><td class="h"><a name="827"></a>827</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="828"></a>828</td><td></td><td></td><td></td><td></td><td class="s">   run \@ls, \undef, '2&gt;ls.err';</td></tr>
+<tr><td class="h"><a name="829"></a>829</td><td></td><td></td><td></td><td></td><td class="s">   run \@ls, '2&gt;', 'ls.err';</td></tr>
+<tr><td class="h"><a name="830"></a>830</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="831"></a>831</td><td></td><td></td><td></td><td></td><td class="s">The two parameter form guarantees that the filename</td></tr>
+<tr><td class="h"><a name="832"></a>832</td><td></td><td></td><td></td><td></td><td class="s">will not be interpreted as a redirection operator:</td></tr>
+<tr><td class="h"><a name="833"></a>833</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="834"></a>834</td><td></td><td></td><td></td><td></td><td class="s">   run \@ls, '&gt;', &quot;&amp;more&quot;;</td></tr>
+<tr><td class="h"><a name="835"></a>835</td><td></td><td></td><td></td><td></td><td class="s">   run \@ls, '2&gt;', &quot;&gt;foo\n&quot;;</td></tr>
+<tr><td class="h"><a name="836"></a>836</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="837"></a>837</td><td></td><td></td><td></td><td></td><td class="s">You can pass file handles you've opened for writing:</td></tr>
+<tr><td class="h"><a name="838"></a>838</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="839"></a>839</td><td></td><td></td><td></td><td></td><td class="s">   open( *OUT, &quot;&gt;out.txt&quot; );</td></tr>
+<tr><td class="h"><a name="840"></a>840</td><td></td><td></td><td></td><td></td><td class="s">   open( *ERR, &quot;&gt;err.txt&quot; );</td></tr>
+<tr><td class="h"><a name="841"></a>841</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, \*OUT, \*ERR;</td></tr>
+<tr><td class="h"><a name="842"></a>842</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="843"></a>843</td><td></td><td></td><td></td><td></td><td class="s">Passing a scalar reference and a code reference requires a little</td></tr>
+<tr><td class="h"><a name="844"></a>844</td><td></td><td></td><td></td><td></td><td class="s">more work, but allows you to capture all of the output in a scalar</td></tr>
+<tr><td class="h"><a name="845"></a>845</td><td></td><td></td><td></td><td></td><td class="s">or each piece of output by a callback:</td></tr>
+<tr><td class="h"><a name="846"></a>846</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="847"></a>847</td><td></td><td></td><td></td><td></td><td class="s">These two do the same things:</td></tr>
+<tr><td class="h"><a name="848"></a>848</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="849"></a>849</td><td></td><td></td><td></td><td></td><td class="s">   run( [ 'ls' ], '2&gt;', sub { $err_out .= $_[0] } );</td></tr>
+<tr><td class="h"><a name="850"></a>850</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="851"></a>851</td><td></td><td></td><td></td><td></td><td class="s">does the same basic thing as:</td></tr>
+<tr><td class="h"><a name="852"></a>852</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="853"></a>853</td><td></td><td></td><td></td><td></td><td class="s">   run( [ 'ls' ], '2&gt;', \$err_out );</td></tr>
+<tr><td class="h"><a name="854"></a>854</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="855"></a>855</td><td></td><td></td><td></td><td></td><td class="s">The subroutine will be called each time some data is read from the child.</td></tr>
+<tr><td class="h"><a name="856"></a>856</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="857"></a>857</td><td></td><td></td><td></td><td></td><td class="s">The &gt;pipe operator is different in concept than the other '&gt;' operators,</td></tr>
+<tr><td class="h"><a name="858"></a>858</td><td></td><td></td><td></td><td></td><td class="s">although it's syntax is similar:</td></tr>
+<tr><td class="h"><a name="859"></a>859</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="860"></a>860</td><td></td><td></td><td></td><td></td><td class="s">   $h = start \@cat, $in, '&gt;pipe', \*OUT, '2&gt;pipe', \*ERR;</td></tr>
+<tr><td class="h"><a name="861"></a>861</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;hello world\n&quot;;</td></tr>
+<tr><td class="h"><a name="862"></a>862</td><td></td><td></td><td></td><td></td><td class="s">   finish $h;</td></tr>
+<tr><td class="h"><a name="863"></a>863</td><td></td><td></td><td></td><td></td><td class="s">   print &lt;OUT&gt;;</td></tr>
+<tr><td class="h"><a name="864"></a>864</td><td></td><td></td><td></td><td></td><td class="s">   print &lt;ERR&gt;;</td></tr>
+<tr><td class="h"><a name="865"></a>865</td><td></td><td></td><td></td><td></td><td class="s">   close OUT;</td></tr>
+<tr><td class="h"><a name="866"></a>866</td><td></td><td></td><td></td><td></td><td class="s">   close ERR;</td></tr>
+<tr><td class="h"><a name="867"></a>867</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="868"></a>868</td><td></td><td></td><td></td><td></td><td class="s">causes two pipe to be created, with one end attached to cat's stdout</td></tr>
+<tr><td class="h"><a name="869"></a>869</td><td></td><td></td><td></td><td></td><td class="s">and stderr, respectively, and the other left open on OUT and ERR, so</td></tr>
+<tr><td class="h"><a name="870"></a>870</td><td></td><td></td><td></td><td></td><td class="s">that the script can manually</td></tr>
+<tr><td class="h"><a name="871"></a>871</td><td></td><td></td><td></td><td></td><td class="s">read(), select(), etc. on them.  This is like</td></tr>
+<tr><td class="h"><a name="872"></a>872</td><td></td><td></td><td></td><td></td><td class="s">the behavior of IPC::Open2 and IPC::Open3.</td></tr>
+<tr><td class="h"><a name="873"></a>873</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="874"></a>874</td><td></td><td></td><td></td><td></td><td class="s">B&lt;Win32&gt;: The handle returned is actually a socket handle, so you can</td></tr>
+<tr><td class="h"><a name="875"></a>875</td><td></td><td></td><td></td><td></td><td class="s">use select() on it.</td></tr>
+<tr><td class="h"><a name="876"></a>876</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="877"></a>877</td><td></td><td></td><td></td><td></td><td class="s">=item Duplicating output descriptors: &gt;&amp;m, n&gt;&amp;m</td></tr>
+<tr><td class="h"><a name="878"></a>878</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="879"></a>879</td><td></td><td></td><td></td><td></td><td class="s">This duplicates output descriptor number n (default is 1 if n is omitted)</td></tr>
+<tr><td class="h"><a name="880"></a>880</td><td></td><td></td><td></td><td></td><td class="s">from descriptor number m.</td></tr>
+<tr><td class="h"><a name="881"></a>881</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="882"></a>882</td><td></td><td></td><td></td><td></td><td class="s">=item Duplicating input descriptors: &lt;&amp;m, n&lt;&amp;m</td></tr>
+<tr><td class="h"><a name="883"></a>883</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="884"></a>884</td><td></td><td></td><td></td><td></td><td class="s">This duplicates input descriptor number n (default is 0 if n is omitted)</td></tr>
+<tr><td class="h"><a name="885"></a>885</td><td></td><td></td><td></td><td></td><td class="s">from descriptor number m</td></tr>
+<tr><td class="h"><a name="886"></a>886</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="887"></a>887</td><td></td><td></td><td></td><td></td><td class="s">=item Closing descriptors: &lt;&amp;-, 3&lt;&amp;-</td></tr>
+<tr><td class="h"><a name="888"></a>888</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="889"></a>889</td><td></td><td></td><td></td><td></td><td class="s">This closes descriptor number n (default is 0 if n is omitted).  The</td></tr>
+<tr><td class="h"><a name="890"></a>890</td><td></td><td></td><td></td><td></td><td class="s">following commands are equivalent:</td></tr>
+<tr><td class="h"><a name="891"></a>891</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="892"></a>892</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, \undef;</td></tr>
+<tr><td class="h"><a name="893"></a>893</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, '&lt;&amp;-';</td></tr>
+<tr><td class="h"><a name="894"></a>894</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, '&lt;in.txt', '&lt;&amp;-';</td></tr>
+<tr><td class="h"><a name="895"></a>895</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="896"></a>896</td><td></td><td></td><td></td><td></td><td class="s">Doing</td></tr>
+<tr><td class="h"><a name="897"></a>897</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="898"></a>898</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, \$in, '&lt;&amp;-';    ## SIGPIPE recipe.</td></tr>
+<tr><td class="h"><a name="899"></a>899</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="900"></a>900</td><td></td><td></td><td></td><td></td><td class="s">is dangerous: the parent will get a SIGPIPE if $in is not empty.</td></tr>
+<tr><td class="h"><a name="901"></a>901</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="902"></a>902</td><td></td><td></td><td></td><td></td><td class="s">=item Redirecting both stdout and stderr: &amp;&gt;, &gt;&amp;, &amp;&gt;pipe, &gt;pipe&amp;</td></tr>
+<tr><td class="h"><a name="903"></a>903</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="904"></a>904</td><td></td><td></td><td></td><td></td><td class="s">The following pairs of commands are equivalent:</td></tr>
+<tr><td class="h"><a name="905"></a>905</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="906"></a>906</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, '&gt;&amp;', \$out;       run \@cmd, '&gt;', \$out,     '2&gt;&amp;1';</td></tr>
+<tr><td class="h"><a name="907"></a>907</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, '&gt;&amp;', 'out.txt';   run \@cmd, '&gt;', 'out.txt', '2&gt;&amp;1';</td></tr>
+<tr><td class="h"><a name="908"></a>908</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="909"></a>909</td><td></td><td></td><td></td><td></td><td class="s">etc.</td></tr>
+<tr><td class="h"><a name="910"></a>910</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="911"></a>911</td><td></td><td></td><td></td><td></td><td class="s">File descriptor numbers are not permitted to the left or the right of</td></tr>
+<tr><td class="h"><a name="912"></a>912</td><td></td><td></td><td></td><td></td><td class="s">these operators, and the '&amp;' may occur on either end of the operator.</td></tr>
+<tr><td class="h"><a name="913"></a>913</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="914"></a>914</td><td></td><td></td><td></td><td></td><td class="s">The '&amp;&gt;pipe' and '&gt;pipe&amp;' variants behave like the '&gt;pipe' operator, except</td></tr>
+<tr><td class="h"><a name="915"></a>915</td><td></td><td></td><td></td><td></td><td class="s">that both stdout and stderr write to the created pipe.</td></tr>
+<tr><td class="h"><a name="916"></a>916</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="917"></a>917</td><td></td><td></td><td></td><td></td><td class="s">=item Redirection Filters</td></tr>
+<tr><td class="h"><a name="918"></a>918</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="919"></a>919</td><td></td><td></td><td></td><td></td><td class="s">Both input redirections and output redirections that use scalars or</td></tr>
+<tr><td class="h"><a name="920"></a>920</td><td></td><td></td><td></td><td></td><td class="s">subs as endpoints may have an arbitrary number of filter subs placed</td></tr>
+<tr><td class="h"><a name="921"></a>921</td><td></td><td></td><td></td><td></td><td class="s">between them and the child process.  This is useful if you want to</td></tr>
+<tr><td class="h"><a name="922"></a>922</td><td></td><td></td><td></td><td></td><td class="s">receive output in chunks, or if you want to massage each chunk of</td></tr>
+<tr><td class="h"><a name="923"></a>923</td><td></td><td></td><td></td><td></td><td class="s">data sent to the child.  To use this feature, you must use operator</td></tr>
+<tr><td class="h"><a name="924"></a>924</td><td></td><td></td><td></td><td></td><td class="s">syntax:</td></tr>
+<tr><td class="h"><a name="925"></a>925</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="926"></a>926</td><td></td><td></td><td></td><td></td><td class="s">   run(</td></tr>
+<tr><td class="h"><a name="927"></a>927</td><td></td><td></td><td></td><td></td><td class="s">      \@cmd</td></tr>
+<tr><td class="h"><a name="928"></a>928</td><td></td><td></td><td></td><td></td><td class="s">         '&lt;', \&amp;in_filter_2, \&amp;in_filter_1, $in,</td></tr>
+<tr><td class="h"><a name="929"></a>929</td><td></td><td></td><td></td><td></td><td class="s">         '&gt;', \&amp;out_filter_1, \&amp;in_filter_2, $out,</td></tr>
+<tr><td class="h"><a name="930"></a>930</td><td></td><td></td><td></td><td></td><td class="s">   );</td></tr>
+<tr><td class="h"><a name="931"></a>931</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="932"></a>932</td><td></td><td></td><td></td><td></td><td class="s">This capability is not provided for IO handles or named files.</td></tr>
+<tr><td class="h"><a name="933"></a>933</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="934"></a>934</td><td></td><td></td><td></td><td></td><td class="s">Two filters are provided by IPC::Run: appender and chunker.  Because</td></tr>
+<tr><td class="h"><a name="935"></a>935</td><td></td><td></td><td></td><td></td><td class="s">these may take an argument, you need to use the constructor functions</td></tr>
+<tr><td class="h"><a name="936"></a>936</td><td></td><td></td><td></td><td></td><td class="s">new_appender() and new_chunker() rather than using \&amp; syntax:</td></tr>
+<tr><td class="h"><a name="937"></a>937</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="938"></a>938</td><td></td><td></td><td></td><td></td><td class="s">   run(</td></tr>
+<tr><td class="h"><a name="939"></a>939</td><td></td><td></td><td></td><td></td><td class="s">      \@cmd</td></tr>
+<tr><td class="h"><a name="940"></a>940</td><td></td><td></td><td></td><td></td><td class="s">         '&lt;', new_appender( &quot;\n&quot; ), $in,</td></tr>
+<tr><td class="h"><a name="941"></a>941</td><td></td><td></td><td></td><td></td><td class="s">         '&gt;', new_chunker, $out,</td></tr>
+<tr><td class="h"><a name="942"></a>942</td><td></td><td></td><td></td><td></td><td class="s">   );</td></tr>
+<tr><td class="h"><a name="943"></a>943</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="944"></a>944</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="945"></a>945</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="946"></a>946</td><td></td><td></td><td></td><td></td><td class="s">=head2 Just doing I/O</td></tr>
+<tr><td class="h"><a name="947"></a>947</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="948"></a>948</td><td></td><td></td><td></td><td></td><td class="s">If you just want to do I/O to a handle or file you open yourself, you</td></tr>
+<tr><td class="h"><a name="949"></a>949</td><td></td><td></td><td></td><td></td><td class="s">may specify a filehandle or filename instead of a command in the harness</td></tr>
+<tr><td class="h"><a name="950"></a>950</td><td></td><td></td><td></td><td></td><td class="s">specification:</td></tr>
+<tr><td class="h"><a name="951"></a>951</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="952"></a>952</td><td></td><td></td><td></td><td></td><td class="s">   run io( &quot;filename&quot;, '&gt;', \$recv );</td></tr>
+<tr><td class="h"><a name="953"></a>953</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="954"></a>954</td><td></td><td></td><td></td><td></td><td class="s">   $h = start io( $io, '&gt;', \$recv );</td></tr>
+<tr><td class="h"><a name="955"></a>955</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="956"></a>956</td><td></td><td></td><td></td><td></td><td class="s">   $h = harness \@cmd, '&amp;', io( &quot;file&quot;, '&lt;', \$send );</td></tr>
+<tr><td class="h"><a name="957"></a>957</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="958"></a>958</td><td></td><td></td><td></td><td></td><td class="s">=head2 Options</td></tr>
+<tr><td class="h"><a name="959"></a>959</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="960"></a>960</td><td></td><td></td><td></td><td></td><td class="s">Options are passed in as name/value pairs:</td></tr>
+<tr><td class="h"><a name="961"></a>961</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="962"></a>962</td><td></td><td></td><td></td><td></td><td class="s">   run \@cat, \$in, debug =&gt; 1;</td></tr>
+<tr><td class="h"><a name="963"></a>963</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="964"></a>964</td><td></td><td></td><td></td><td></td><td class="s">If you pass the debug option, you may want to pass it in first, so you</td></tr>
+<tr><td class="h"><a name="965"></a>965</td><td></td><td></td><td></td><td></td><td class="s">can see what parsing is going on:</td></tr>
+<tr><td class="h"><a name="966"></a>966</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="967"></a>967</td><td></td><td></td><td></td><td></td><td class="s">   run debug =&gt; 1, \@cat, \$in;</td></tr>
+<tr><td class="h"><a name="968"></a>968</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="969"></a>969</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="970"></a>970</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="971"></a>971</td><td></td><td></td><td></td><td></td><td class="s">=item debug</td></tr>
+<tr><td class="h"><a name="972"></a>972</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="973"></a>973</td><td></td><td></td><td></td><td></td><td class="s">Enables debugging output in parent and child.  Debugging info is emitted</td></tr>
+<tr><td class="h"><a name="974"></a>974</td><td></td><td></td><td></td><td></td><td class="s">to the STDERR that was present when IPC::Run was first C&lt;use()&gt;ed (it's</td></tr>
+<tr><td class="h"><a name="975"></a>975</td><td></td><td></td><td></td><td></td><td class="s">C&lt;dup()&gt;ed out of the way so that it can be redirected in children without</td></tr>
+<tr><td class="h"><a name="976"></a>976</td><td></td><td></td><td></td><td></td><td class="s">having debugging output emitted on it).</td></tr>
+<tr><td class="h"><a name="977"></a>977</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="978"></a>978</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="979"></a>979</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="980"></a>980</td><td></td><td></td><td></td><td></td><td class="s">=head1 RETURN VALUES</td></tr>
+<tr><td class="h"><a name="981"></a>981</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="982"></a>982</td><td></td><td></td><td></td><td></td><td class="s">harness() and start() return a reference to an IPC::Run harness.  This is</td></tr>
+<tr><td class="h"><a name="983"></a>983</td><td></td><td></td><td></td><td></td><td class="s">blessed in to the IPC::Run package, so you may make later calls to</td></tr>
+<tr><td class="h"><a name="984"></a>984</td><td></td><td></td><td></td><td></td><td class="s">functions as members if you like:</td></tr>
+<tr><td class="h"><a name="985"></a>985</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="986"></a>986</td><td></td><td></td><td></td><td></td><td class="s">   $h = harness( ... );</td></tr>
+<tr><td class="h"><a name="987"></a>987</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;start;</td></tr>
+<tr><td class="h"><a name="988"></a>988</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;pump;</td></tr>
+<tr><td class="h"><a name="989"></a>989</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;finish;</td></tr>
+<tr><td class="h"><a name="990"></a>990</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="991"></a>991</td><td></td><td></td><td></td><td></td><td class="s">   $h = start( .... );</td></tr>
+<tr><td class="h"><a name="992"></a>992</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;pump;</td></tr>
+<tr><td class="h"><a name="993"></a>993</td><td></td><td></td><td></td><td></td><td class="s">   ...</td></tr>
+<tr><td class="h"><a name="994"></a>994</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="995"></a>995</td><td></td><td></td><td></td><td></td><td class="s">Of course, using method call syntax lets you deal with any IPC::Run</td></tr>
+<tr><td class="h"><a name="996"></a>996</td><td></td><td></td><td></td><td></td><td class="s">subclasses that might crop up, but don't hold your breath waiting for</td></tr>
+<tr><td class="h"><a name="997"></a>997</td><td></td><td></td><td></td><td></td><td class="s">any.</td></tr>
+<tr><td class="h"><a name="998"></a>998</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="999"></a>999</td><td></td><td></td><td></td><td></td><td class="s">run() and finish() return TRUE when all subcommands exit with a 0 result</td></tr>
+<tr><td class="h"><a name="1000"></a>1000</td><td></td><td></td><td></td><td></td><td class="s">code.  B&lt;This is the opposite of perl's system() command&gt;.</td></tr>
+<tr><td class="h"><a name="1001"></a>1001</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1002"></a>1002</td><td></td><td></td><td></td><td></td><td class="s">All routines raise exceptions (via die()) when error conditions are</td></tr>
+<tr><td class="h"><a name="1003"></a>1003</td><td></td><td></td><td></td><td></td><td class="s">recognized.  A non-zero command result is not treated as an error</td></tr>
+<tr><td class="h"><a name="1004"></a>1004</td><td></td><td></td><td></td><td></td><td class="s">condition, since some commands are tests whose results are reported </td></tr>
+<tr><td class="h"><a name="1005"></a>1005</td><td></td><td></td><td></td><td></td><td class="s">in their exit codes.</td></tr>
+<tr><td class="h"><a name="1006"></a>1006</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1007"></a>1007</td><td></td><td></td><td></td><td></td><td class="s">=head1 ROUTINES</td></tr>
+<tr><td class="h"><a name="1008"></a>1008</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1009"></a>1009</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="1010"></a>1010</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1011"></a>1011</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="1012"></a>1012</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1013"></a>1013</td><td class="c3">2</td><td class="c3"><span title="Avg 11&micro;s">23&micro;s</span></td><td class="c3">2</td><td class="c3">19&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 15&micro;s (11+4) within IPC::Run::BEGIN@1013 which was called:
+#    once (11&micro;s+4&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1013">line 1013</a></div></div>use strict;<div class="calls"><div class="calls_out"># spent    15&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1013">IPC::Run::BEGIN@1013</a>
+# spent     4&micro;s making 1 call to <a href="strict-pm-3-sub.html#34">strict::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1014"></a>1014</td><td class="c3">2</td><td class="c3"><span title="Avg 12&micro;s">24&micro;s</span></td><td class="c3">1</td><td class="c3">4&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 4&micro;s within IPC::Run::BEGIN@1014 which was called:
+#    once (4&micro;s+0s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1014">line 1014</a></div></div>use Exporter ();<div class="calls"><div class="calls_out"># spent     4&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1014">IPC::Run::BEGIN@1014</a></div></div></td></tr>
+<tr><td class="h"><a name="1015"></a>1015</td><td class="c3">2</td><td class="c0"><span title="Avg 71&micro;s">142&micro;s</span></td><td class="c3">2</td><td class="c0">223&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 120&micro;s (16+103) within IPC::Run::BEGIN@1015 which was called:
+#    once (16&micro;s+103&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1015">line 1015</a></div></div>use vars qw{$VERSION @ISA @FILTER_IMP @FILTERS @API @EXPORT_OK %EXPORT_TAGS};<div class="calls"><div class="calls_out"># spent   120&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1015">IPC::Run::BEGIN@1015</a>
+# spent   103&micro;s making 1 call to <a href="vars-pm-6-sub.html#10">vars::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1016"></a>1016</td><td></td><td></td><td></td><td></td><td class="s"><div class="calls"><div class="calls_in"># spent 24&micro;s within IPC::Run::BEGIN@1016 which was called:
+#    once (24&micro;s+0s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1046">line 1046</a></div></div>BEGIN {</td></tr>
+<tr><td class="h"><a name="1017"></a>1017</td><td class="c0">7</td><td class="c3"><span title="Avg 3&micro;s">23&micro;s</span></td><td></td><td></td><td class="s">        $VERSION = '0.91';</td></tr>
+<tr><td class="h"><a name="1018"></a>1018</td><td></td><td></td><td></td><td></td><td class="s">        @ISA     = qw{ Exporter };</td></tr>
+<tr><td class="h"><a name="1019"></a>1019</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1020"></a>1020</td><td></td><td></td><td></td><td></td><td class="s">        ## We use @EXPORT for the end user's convenience: there's only one function</td></tr>
+<tr><td class="h"><a name="1021"></a>1021</td><td></td><td></td><td></td><td></td><td class="s">        ## exported, it's homonymous with the module, it's an unusual name, and</td></tr>
+<tr><td class="h"><a name="1022"></a>1022</td><td></td><td></td><td></td><td></td><td class="s">        ## it can be suppressed by &quot;use IPC::Run ();&quot;.</td></tr>
+<tr><td class="h"><a name="1023"></a>1023</td><td></td><td></td><td></td><td></td><td class="s">        @FILTER_IMP = qw( input_avail get_more_input );</td></tr>
+<tr><td class="h"><a name="1024"></a>1024</td><td></td><td></td><td></td><td></td><td class="s">        @FILTERS    = qw(</td></tr>
+<tr><td class="h"><a name="1025"></a>1025</td><td></td><td></td><td></td><td></td><td class="s">                new_appender</td></tr>
+<tr><td class="h"><a name="1026"></a>1026</td><td></td><td></td><td></td><td></td><td class="s">                new_chunker</td></tr>
+<tr><td class="h"><a name="1027"></a>1027</td><td></td><td></td><td></td><td></td><td class="s">                new_string_source</td></tr>
+<tr><td class="h"><a name="1028"></a>1028</td><td></td><td></td><td></td><td></td><td class="s">                new_string_sink</td></tr>
+<tr><td class="h"><a name="1029"></a>1029</td><td></td><td></td><td></td><td></td><td class="s">        );</td></tr>
+<tr><td class="h"><a name="1030"></a>1030</td><td></td><td></td><td></td><td></td><td class="s">        @API        = qw(</td></tr>
+<tr><td class="h"><a name="1031"></a>1031</td><td></td><td></td><td></td><td></td><td class="s">                run</td></tr>
+<tr><td class="h"><a name="1032"></a>1032</td><td></td><td></td><td></td><td></td><td class="s">                harness start pump pumpable finish</td></tr>
+<tr><td class="h"><a name="1033"></a>1033</td><td></td><td></td><td></td><td></td><td class="s">                signal kill_kill reap_nb</td></tr>
+<tr><td class="h"><a name="1034"></a>1034</td><td></td><td></td><td></td><td></td><td class="s">                io timer timeout</td></tr>
+<tr><td class="h"><a name="1035"></a>1035</td><td></td><td></td><td></td><td></td><td class="s">                close_terminal</td></tr>
+<tr><td class="h"><a name="1036"></a>1036</td><td></td><td></td><td></td><td></td><td class="s">                binary</td></tr>
+<tr><td class="h"><a name="1037"></a>1037</td><td></td><td></td><td></td><td></td><td class="s">        );</td></tr>
+<tr><td class="h"><a name="1038"></a>1038</td><td></td><td></td><td></td><td></td><td class="s">        @EXPORT_OK = ( @API, @FILTER_IMP, @FILTERS, qw( Win32_MODE ) );</td></tr>
+<tr><td class="h"><a name="1039"></a>1039</td><td></td><td></td><td></td><td></td><td class="s">        %EXPORT_TAGS = (</td></tr>
+<tr><td class="h"><a name="1040"></a>1040</td><td></td><td></td><td></td><td></td><td class="s">                'filter_imp' =&gt; \@FILTER_IMP,</td></tr>
+<tr><td class="h"><a name="1041"></a>1041</td><td></td><td></td><td></td><td></td><td class="s">                'all'        =&gt; \@EXPORT_OK,</td></tr>
+<tr><td class="h"><a name="1042"></a>1042</td><td></td><td></td><td></td><td></td><td class="s">                'filters'    =&gt; \@FILTERS,</td></tr>
+<tr><td class="h"><a name="1043"></a>1043</td><td></td><td></td><td></td><td></td><td class="s">                'api'        =&gt; \@API,</td></tr>
+<tr><td class="h"><a name="1044"></a>1044</td><td></td><td></td><td></td><td></td><td class="s">        );</td></tr>
+<tr><td class="h"><a name="1045"></a>1045</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1046"></a>1046</td><td class="c3">1</td><td class="c2"><span title="Avg 37&micro;s">37&micro;s</span></td><td class="c3">1</td><td class="c3">24&micro;s</td><td class="s">}<div class="calls"><div class="calls_out"># spent    24&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1016">IPC::Run::BEGIN@1016</a></div></div></td></tr>
+<tr><td class="h"><a name="1047"></a>1047</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1048"></a>1048</td><td class="c3">2</td><td class="c3"><span title="Avg 11&micro;s">21&micro;s</span></td><td class="c3">2</td><td class="c3">13&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 10&micro;s (8+3) within IPC::Run::BEGIN@1048 which was called:
+#    once (8&micro;s+3&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1048">line 1048</a></div></div>use strict;<div class="calls"><div class="calls_out"># spent    10&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1048">IPC::Run::BEGIN@1048</a>
+# spent     3&micro;s making 1 call to <a href="strict-pm-3-sub.html#34">strict::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1049"></a>1049</td><td class="c3">2</td><td class="c0"><span title="Avg 65&micro;s">130&micro;s</span></td><td class="c3">2</td><td class="c0">7.76ms</td><td class="s"><div class="calls"><div class="calls_in"># spent 7.71ms (1.15+6.56) within IPC::Run::BEGIN@1049 which was called:
+#    once (1.15ms+6.56ms) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1049">line 1049</a></div></div>use IPC::Run::Debug;<div class="calls"><div class="calls_out"># spent  7.71ms making 1 call to <a href="IPC-Run-pm-733-sub.html#1049">IPC::Run::BEGIN@1049</a>
+# spent    53&micro;s making 1 call to <a href="Exporter-pm-8-sub.html#28">Exporter::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1050"></a>1050</td><td class="c3">2</td><td class="c3"><span title="Avg 11&micro;s">22&micro;s</span></td><td class="c3">2</td><td class="c3">34&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 21&micro;s (8+13) within IPC::Run::BEGIN@1050 which was called:
+#    once (8&micro;s+13&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1050">line 1050</a></div></div>use Exporter;<div class="calls"><div class="calls_out"># spent    21&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1050">IPC::Run::BEGIN@1050</a>
+# spent    13&micro;s making 1 call to <a href="Exporter-pm-8-sub.html#28">Exporter::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1051"></a>1051</td><td class="c3">2</td><td class="c3"><span title="Avg 12&micro;s">23&micro;s</span></td><td class="c3">2</td><td class="c0">469&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 242&micro;s (15+227) within IPC::Run::BEGIN@1051 which was called:
+#    once (15&micro;s+227&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1051">line 1051</a></div></div>use Fcntl;<div class="calls"><div class="calls_out"># spent   242&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1051">IPC::Run::BEGIN@1051</a>
+# spent   227&micro;s making 1 call to <a href="Exporter-pm-8-sub.html#28">Exporter::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1052"></a>1052</td><td class="c3">2</td><td class="c3"><span title="Avg 10&micro;s">20&micro;s</span></td><td class="c3">1</td><td class="c3">4&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 4&micro;s within IPC::Run::BEGIN@1052 which was called:
+#    once (4&micro;s+0s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1052">line 1052</a></div></div>use POSIX ();<div class="calls"><div class="calls_out"># spent     4&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1052">IPC::Run::BEGIN@1052</a></div></div></td></tr>
+<tr><td class="h"><a name="1053"></a>1053</td><td class="c3">2</td><td class="c3"><span title="Avg 12&micro;s">23&micro;s</span></td><td class="c3">2</td><td class="c2">72&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 41&micro;s (9+31) within IPC::Run::BEGIN@1053 which was called:
+#    once (9&micro;s+31&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1053">line 1053</a></div></div>use Symbol;<div class="calls"><div class="calls_out"># spent    41&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1053">IPC::Run::BEGIN@1053</a>
+# spent    31&micro;s making 1 call to <a href="Exporter-pm-8-sub.html#28">Exporter::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1054"></a>1054</td><td class="c3">2</td><td class="c3"><span title="Avg 10&micro;s">21&micro;s</span></td><td class="c3">2</td><td class="c2">65&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 36&micro;s (8+29) within IPC::Run::BEGIN@1054 which was called:
+#    once (8&micro;s+29&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1054">line 1054</a></div></div>use Carp;<div class="calls"><div class="calls_out"># spent    36&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1054">IPC::Run::BEGIN@1054</a>
+# spent    29&micro;s making 1 call to <a href="Exporter-pm-8-sub.html#28">Exporter::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1055"></a>1055</td><td class="c3">2</td><td class="c3"><span title="Avg 9&micro;s">18&micro;s</span></td><td class="c3">1</td><td class="c3">4&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 4&micro;s within IPC::Run::BEGIN@1055 which was called:
+#    once (4&micro;s+0s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1055">line 1055</a></div></div>use File::Spec ();<div class="calls"><div class="calls_out"># spent     4&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1055">IPC::Run::BEGIN@1055</a></div></div></td></tr>
+<tr><td class="h"><a name="1056"></a>1056</td><td class="c3">2</td><td class="c3"><span title="Avg 15&micro;s">31&micro;s</span></td><td class="c3">2</td><td class="c3">32&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 20&micro;s (8+12) within IPC::Run::BEGIN@1056 which was called:
+#    once (8&micro;s+12&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1056">line 1056</a></div></div>use IO::Handle;<div class="calls"><div class="calls_out"># spent    20&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1056">IPC::Run::BEGIN@1056</a>
+# spent    12&micro;s making 1 call to <a href="Exporter-pm-8-sub.html#28">Exporter::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1057"></a>1057</td><td class="c3">1</td><td class="c0"><span title="Avg 114&micro;s">114&micro;s</span></td><td></td><td></td><td class="s">require IPC::Run::IO;</td></tr>
+<tr><td class="h"><a name="1058"></a>1058</td><td class="c3">1</td><td class="c0"><span title="Avg 141&micro;s">141&micro;s</span></td><td></td><td></td><td class="s">require IPC::Run::Timer;</td></tr>
+<tr><td class="h"><a name="1059"></a>1059</td><td class="c3">2</td><td class="c0"><span title="Avg 102&micro;s">204&micro;s</span></td><td class="c3">1</td><td class="c0">177&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 177&micro;s within IPC::Run::BEGIN@1059 which was called:
+#    once (177&micro;s+0s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1059">line 1059</a></div></div>use UNIVERSAL ();<div class="calls"><div class="calls_out"># spent   177&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1059">IPC::Run::BEGIN@1059</a></div></div></td></tr>
+<tr><td class="h"><a name="1060"></a>1060</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1061"></a>1061</td><td class="c3">2</td><td class="c0"><span title="Avg 34&micro;s">69&micro;s</span></td><td class="c1">3</td><td class="c1">94&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 54&micro;s (15+39) within IPC::Run::BEGIN@1061 which was called:
+#    once (15&micro;s+39&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1061">line 1061</a></div></div>use constant Win32_MODE =&gt; $^O =~ /os2|Win32/i;<div class="calls"><div class="calls_out"># spent    54&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1061">IPC::Run::BEGIN@1061</a>
+# spent    36&micro;s making 1 call to <a href="constant-pm-28-sub.html#42">constant::import</a>
+# spent     4&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#IPC__Run__CORE_match">IPC::Run::CORE:match</a></div></div></td></tr>
+<tr><td class="h"><a name="1062"></a>1062</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1063"></a>1063</td><td></td><td></td><td></td><td></td><td class="s"><div class="calls"><div class="calls_in"># spent 92&micro;s (44+49) within IPC::Run::BEGIN@1063 which was called:
+#    once (44&micro;s+49&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1071">line 1071</a></div></div>BEGIN {</td></tr>
+<tr><td class="h"><a name="1064"></a>1064</td><td class="c3">2</td><td class="c3"><span title="Avg 15&micro;s">30&micro;s</span></td><td class="c3">1</td><td class="c3">1&micro;s</td><td class="s">   if ( Win32_MODE ) {<div class="calls"><div class="calls_out">   # spent     1&micro;s making 1 call to <a href="constant-pm-28-sub.html#142">constant::__ANON__[constant.pm:142]</a></div></div></td></tr>
+<tr><td class="h"><a name="1065"></a>1065</td><td></td><td></td><td></td><td></td><td class="s">      eval &quot;use IPC::Run::Win32Helper; 1;&quot;</td></tr>
+<tr><td class="h"><a name="1066"></a>1066</td><td></td><td></td><td></td><td></td><td class="s">         or ( $@ &amp;&amp; die ) or die &quot;$!&quot;;</td></tr>
+<tr><td class="h"><a name="1067"></a>1067</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1068"></a>1068</td><td></td><td></td><td></td><td></td><td class="s">   else {</td></tr>
+<tr><td class="h"><a name="1069"></a>1069</td><td></td><td></td><td></td><td></td><td class="s">      eval &quot;use File::Basename; 1;&quot; or die $!;<div class="calls"><div class="calls_out">      # spent    21&micro;s executing statements in <a href="(eval 481)[IPC-Run-pm-1069]-739-line.html">string eval</a><br />      # includes 14&micro;s spent executing 1 call to 1 sub defined therein.</div></div></td></tr>
+<tr><td class="h"><a name="1070"></a>1070</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1071"></a>1071</td><td class="c3">1</td><td class="c2"><span title="Avg 40&micro;s">40&micro;s</span></td><td class="c3">1</td><td class="c1">92&micro;s</td><td class="s">}<div class="calls"><div class="calls_out"># spent    92&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1063">IPC::Run::BEGIN@1063</a></div></div></td></tr>
+<tr><td class="h"><a name="1072"></a>1072</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1073"></a>1073</td><td></td><td></td><td></td><td></td><td class="s">sub input_avail();</td></tr>
+<tr><td class="h"><a name="1074"></a>1074</td><td></td><td></td><td></td><td></td><td class="s">sub get_more_input();</td></tr>
+<tr><td class="h"><a name="1075"></a>1075</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1076"></a>1076</td><td></td><td></td><td></td><td></td><td class="s">###############################################################################</td></tr>
+<tr><td class="h"><a name="1077"></a>1077</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1078"></a>1078</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1079"></a>1079</td><td></td><td></td><td></td><td></td><td class="s">## Error constants, not too locale-dependant</td></tr>
+<tr><td class="h"><a name="1080"></a>1080</td><td class="c3">2</td><td class="c3"><span title="Avg 12&micro;s">24&micro;s</span></td><td class="c3">2</td><td class="c2">65&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 36&micro;s (6+29) within IPC::Run::BEGIN@1080 which was called:
+#    once (6&micro;s+29&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1080">line 1080</a></div></div>use vars  qw( $_EIO $_EAGAIN );<div class="calls"><div class="calls_out"># spent    36&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1080">IPC::Run::BEGIN@1080</a>
+# spent    29&micro;s making 1 call to <a href="vars-pm-6-sub.html#10">vars::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1081"></a>1081</td><td class="c3">2</td><td class="c0"><span title="Avg 36&micro;s">71&micro;s</span></td><td class="c3">2</td><td class="c0">471&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 240&micro;s (9+231) within IPC::Run::BEGIN@1081 which was called:
+#    once (9&micro;s+231&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1081">line 1081</a></div></div>use Errno qw(   EIO   EAGAIN );<div class="calls"><div class="calls_out"># spent   240&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1081">IPC::Run::BEGIN@1081</a>
+# spent   231&micro;s making 1 call to <a href="Exporter-pm-8-sub.html#28">Exporter::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1082"></a>1082</td><td></td><td></td><td></td><td></td><td class="s"><div class="calls"><div class="calls_in"># spent 51&micro;s (28+23) within IPC::Run::BEGIN@1082 which was called:
+#    once (28&micro;s+23&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1086">line 1086</a></div></div>BEGIN {</td></tr>
+<tr><td class="h"><a name="1083"></a>1083</td><td class="c0">5</td><td class="c2"><span title="Avg 9&micro;s">43&micro;s</span></td><td></td><td></td><td class="s">  local $!;</td></tr>
+<tr><td class="h"><a name="1084"></a>1084</td><td></td><td></td><td class="c3">2</td><td class="c3">15&micro;s</td><td class="s">  $! = EIO;    $_EIO    = qr/^$!/;<div class="calls"><div class="calls_out">  # spent    10&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#IPC__Run__CORE_regcomp">IPC::Run::CORE:regcomp</a>
+  # spent     5&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#IPC__Run__CORE_qr">IPC::Run::CORE:qr</a></div></div></td></tr>
+<tr><td class="h"><a name="1085"></a>1085</td><td></td><td></td><td class="c3">2</td><td class="c3">8&micro;s</td><td class="s">  $! = EAGAIN; $_EAGAIN = qr/^$!/;<div class="calls"><div class="calls_out">  # spent     7&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#IPC__Run__CORE_regcomp">IPC::Run::CORE:regcomp</a>
+  # spent     1&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#IPC__Run__CORE_qr">IPC::Run::CORE:qr</a></div></div></td></tr>
+<tr><td class="h"><a name="1086"></a>1086</td><td class="c3">1</td><td class="c0"><span title="Avg 83&micro;s">83&micro;s</span></td><td class="c3">1</td><td class="c3">51&micro;s</td><td class="s">}<div class="calls"><div class="calls_out"># spent    51&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1082">IPC::Run::BEGIN@1082</a></div></div></td></tr>
+<tr><td class="h"><a name="1087"></a>1087</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1088"></a>1088</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1089"></a>1089</td><td></td><td></td><td></td><td></td><td class="s">## State machine states, set in $self-&gt;{STATE}</td></tr>
+<tr><td class="h"><a name="1090"></a>1090</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1091"></a>1091</td><td></td><td></td><td></td><td></td><td class="s">## These must be in ascending order numerically</td></tr>
+<tr><td class="h"><a name="1092"></a>1092</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1093"></a>1093</td><td></td><td></td><td></td><td></td><td class="s">sub _newed()    {0}</td></tr>
+<tr><td class="h"><a name="1094"></a>1094</td><td></td><td></td><td></td><td></td><td class="s">sub _harnessed(){1}</td></tr>
+<tr><td class="h"><a name="1095"></a>1095</td><td></td><td></td><td></td><td></td><td class="s">sub _finished() {2}   ## _finished behave almost exactly like _harnessed</td></tr>
+<tr><td class="h"><a name="1096"></a>1096</td><td></td><td></td><td></td><td></td><td class="s">sub _started()  {3}</td></tr>
+<tr><td class="h"><a name="1097"></a>1097</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1098"></a>1098</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1099"></a>1099</td><td></td><td></td><td></td><td></td><td class="s">## Which fds have been opened in the parent.  This may have extra fds, since</td></tr>
+<tr><td class="h"><a name="1100"></a>1100</td><td></td><td></td><td></td><td></td><td class="s">## we aren't all that rigorous about closing these off, but that's ok.  This</td></tr>
+<tr><td class="h"><a name="1101"></a>1101</td><td></td><td></td><td></td><td></td><td class="s">## is used on Unixish OSs to close all fds in the child that aren't needed</td></tr>
+<tr><td class="h"><a name="1102"></a>1102</td><td></td><td></td><td></td><td></td><td class="s">## by that particular child.</td></tr>
+<tr><td class="h"><a name="1103"></a>1103</td><td class="c3">1</td><td class="c3"><span title="Avg 200ns">200ns</span></td><td></td><td></td><td class="s">my %fds;</td></tr>
+<tr><td class="h"><a name="1104"></a>1104</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1105"></a>1105</td><td></td><td></td><td></td><td></td><td class="s">## There's a bit of hackery going on here.</td></tr>
+<tr><td class="h"><a name="1106"></a>1106</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1107"></a>1107</td><td></td><td></td><td></td><td></td><td class="s">## We want to have any code anywhere be able to emit</td></tr>
+<tr><td class="h"><a name="1108"></a>1108</td><td></td><td></td><td></td><td></td><td class="s">## debugging statements without knowing what harness the code is</td></tr>
+<tr><td class="h"><a name="1109"></a>1109</td><td></td><td></td><td></td><td></td><td class="s">## being called in/from, since we'd need to pass a harness around to</td></tr>
+<tr><td class="h"><a name="1110"></a>1110</td><td></td><td></td><td></td><td></td><td class="s">## everything.</td></tr>
+<tr><td class="h"><a name="1111"></a>1111</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1112"></a>1112</td><td></td><td></td><td></td><td></td><td class="s">## Thus, $cur_self was born.</td></tr>
+<tr><td class="h"><a name="1113"></a>1113</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1114"></a>1114</td><td class="c3">2</td><td class="c0"><span title="Avg 372&micro;s">744&micro;s</span></td><td class="c3">2</td><td class="c3">43&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 25&micro;s (7+18) within IPC::Run::BEGIN@1114 which was called:
+#    once (7&micro;s+18&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1114">line 1114</a></div></div>use vars qw( $cur_self );<div class="calls"><div class="calls_out"># spent    25&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1114">IPC::Run::BEGIN@1114</a>
+# spent    18&micro;s making 1 call to <a href="vars-pm-6-sub.html#10">vars::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1115"></a>1115</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1116"></a>1116</td><td></td><td></td><td></td><td></td><td class="s">sub _debug_fd {</td></tr>
+<tr><td class="h"><a name="1117"></a>1117</td><td></td><td></td><td></td><td></td><td class="s">   return fileno STDERR unless defined $cur_self;</td></tr>
+<tr><td class="h"><a name="1118"></a>1118</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1119"></a>1119</td><td></td><td></td><td></td><td></td><td class="s">   if ( _debugging &amp;&amp; ! defined $cur_self-&gt;{DEBUG_FD} ) {</td></tr>
+<tr><td class="h"><a name="1120"></a>1120</td><td></td><td></td><td></td><td></td><td class="s">      my $fd = select STDERR; $| = 1; select $fd;</td></tr>
+<tr><td class="h"><a name="1121"></a>1121</td><td></td><td></td><td></td><td></td><td class="s">      $cur_self-&gt;{DEBUG_FD} = POSIX::dup fileno STDERR;</td></tr>
+<tr><td class="h"><a name="1122"></a>1122</td><td></td><td></td><td></td><td></td><td class="s">      _debug( &quot;debugging fd is $cur_self-&gt;{DEBUG_FD}\n&quot; )</td></tr>
+<tr><td class="h"><a name="1123"></a>1123</td><td></td><td></td><td></td><td></td><td class="s">         if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1124"></a>1124</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1125"></a>1125</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1126"></a>1126</td><td></td><td></td><td></td><td></td><td class="s">   return fileno STDERR unless defined $cur_self-&gt;{DEBUG_FD};</td></tr>
+<tr><td class="h"><a name="1127"></a>1127</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1128"></a>1128</td><td></td><td></td><td></td><td></td><td class="s">   return $cur_self-&gt;{DEBUG_FD}</td></tr>
+<tr><td class="h"><a name="1129"></a>1129</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1130"></a>1130</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1131"></a>1131</td><td></td><td></td><td></td><td></td><td class="s">sub DESTROY {</td></tr>
+<tr><td class="h"><a name="1132"></a>1132</td><td></td><td></td><td></td><td></td><td class="s">   ## We absolutely do not want to do anything else here.  We are likely</td></tr>
+<tr><td class="h"><a name="1133"></a>1133</td><td></td><td></td><td></td><td></td><td class="s">   ## to be in a child process and we don't want to do things like kill_kill</td></tr>
+<tr><td class="h"><a name="1134"></a>1134</td><td></td><td></td><td></td><td></td><td class="s">   ## ourself or cause other destruction.</td></tr>
+<tr><td class="h"><a name="1135"></a>1135</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="1136"></a>1136</td><td></td><td></td><td></td><td></td><td class="s">   POSIX::close $self-&gt;{DEBUG_FD} if defined $self-&gt;{DEBUG_FD};</td></tr>
+<tr><td class="h"><a name="1137"></a>1137</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{DEBUG_FD} = undef;</td></tr>
+<tr><td class="h"><a name="1138"></a>1138</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1139"></a>1139</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1140"></a>1140</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1141"></a>1141</td><td></td><td></td><td></td><td></td><td class="s">## Support routines (NOT METHODS)</td></tr>
+<tr><td class="h"><a name="1142"></a>1142</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1143"></a>1143</td><td class="c3">1</td><td class="c3"><span title="Avg 200ns">200ns</span></td><td></td><td></td><td class="s">my %cmd_cache;</td></tr>
+<tr><td class="h"><a name="1144"></a>1144</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1145"></a>1145</td><td></td><td></td><td></td><td></td><td class="s">sub _search_path {</td></tr>
+<tr><td class="h"><a name="1146"></a>1146</td><td></td><td></td><td></td><td></td><td class="s">   my ( $cmd_name ) = @_;</td></tr>
+<tr><td class="h"><a name="1147"></a>1147</td><td></td><td></td><td></td><td></td><td class="s">   if ( File::Spec-&gt;file_name_is_absolute( $cmd_name ) &amp;&amp; -x $cmd_name) {</td></tr>
+<tr><td class="h"><a name="1148"></a>1148</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;'&quot;, $cmd_name, &quot;' is absolute&quot;</td></tr>
+<tr><td class="h"><a name="1149"></a>1149</td><td></td><td></td><td></td><td></td><td class="s">         if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1150"></a>1150</td><td></td><td></td><td></td><td></td><td class="s">      return $cmd_name;</td></tr>
+<tr><td class="h"><a name="1151"></a>1151</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1152"></a>1152</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1153"></a>1153</td><td></td><td></td><td></td><td></td><td class="s">   my $dirsep =</td></tr>
+<tr><td class="h"><a name="1154"></a>1154</td><td></td><td></td><td></td><td></td><td class="s">      ( Win32_MODE</td></tr>
+<tr><td class="h"><a name="1155"></a>1155</td><td></td><td></td><td></td><td></td><td class="s">         ? '[/\\\\]'</td></tr>
+<tr><td class="h"><a name="1156"></a>1156</td><td></td><td></td><td></td><td></td><td class="s">      : $^O =~ /MacOS/</td></tr>
+<tr><td class="h"><a name="1157"></a>1157</td><td></td><td></td><td></td><td></td><td class="s">         ? ':'</td></tr>
+<tr><td class="h"><a name="1158"></a>1158</td><td></td><td></td><td></td><td></td><td class="s">      : $^O =~ /VMS/</td></tr>
+<tr><td class="h"><a name="1159"></a>1159</td><td></td><td></td><td></td><td></td><td class="s">         ? '[\[\]]'</td></tr>
+<tr><td class="h"><a name="1160"></a>1160</td><td></td><td></td><td></td><td></td><td class="s">      : '/'</td></tr>
+<tr><td class="h"><a name="1161"></a>1161</td><td></td><td></td><td></td><td></td><td class="s">      );</td></tr>
+<tr><td class="h"><a name="1162"></a>1162</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1163"></a>1163</td><td></td><td></td><td></td><td></td><td class="s">   if ( Win32_MODE</td></tr>
+<tr><td class="h"><a name="1164"></a>1164</td><td></td><td></td><td></td><td></td><td class="s">      &amp;&amp; ( $cmd_name =~ /$dirsep/ )</td></tr>
+<tr><td class="h"><a name="1165"></a>1165</td><td></td><td></td><td></td><td></td><td class="s">#      &amp;&amp; ( $cmd_name !~ /\..+$/ )  ## Only run if cmd_name has no extension?</td></tr>
+<tr><td class="h"><a name="1166"></a>1166</td><td></td><td></td><td></td><td></td><td class="s">      &amp;&amp; ( $cmd_name !~ m!\.[^\\/\.]+$! )</td></tr>
+<tr><td class="h"><a name="1167"></a>1167</td><td></td><td></td><td></td><td></td><td class="s">    ) {</td></tr>
+<tr><td class="h"><a name="1168"></a>1168</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1169"></a>1169</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;no extension(.exe), checking ENV{PATHEXT}&quot;  if _debugging;</td></tr>
+<tr><td class="h"><a name="1170"></a>1170</td><td></td><td></td><td></td><td></td><td class="s">      for ( split /;/, $ENV{PATHEXT} || &quot;.COM;.BAT;.EXE&quot; ) {</td></tr>
+<tr><td class="h"><a name="1171"></a>1171</td><td></td><td></td><td></td><td></td><td class="s">         my $name = &quot;$cmd_name$_&quot;;</td></tr>
+<tr><td class="h"><a name="1172"></a>1172</td><td></td><td></td><td></td><td></td><td class="s">         $cmd_name = $name, last if -f $name &amp;&amp; -x _;</td></tr>
+<tr><td class="h"><a name="1173"></a>1173</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="1174"></a>1174</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;cmd_name is now '$cmd_name'&quot;  if _debugging;</td></tr>
+<tr><td class="h"><a name="1175"></a>1175</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1176"></a>1176</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1177"></a>1177</td><td></td><td></td><td></td><td></td><td class="s">   if ( $cmd_name =~ /($dirsep)/ ) {</td></tr>
+<tr><td class="h"><a name="1178"></a>1178</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;'$cmd_name' contains '$1'&quot;  if _debugging;</td></tr>
+<tr><td class="h"><a name="1179"></a>1179</td><td></td><td></td><td></td><td></td><td class="s">      croak &quot;file not found: $cmd_name&quot;    unless -e $cmd_name;</td></tr>
+<tr><td class="h"><a name="1180"></a>1180</td><td></td><td></td><td></td><td></td><td class="s">      croak &quot;not a file: $cmd_name&quot;        unless -f $cmd_name;</td></tr>
+<tr><td class="h"><a name="1181"></a>1181</td><td></td><td></td><td></td><td></td><td class="s">      croak &quot;permission denied: $cmd_name&quot; unless -x $cmd_name;</td></tr>
+<tr><td class="h"><a name="1182"></a>1182</td><td></td><td></td><td></td><td></td><td class="s">      return $cmd_name;</td></tr>
+<tr><td class="h"><a name="1183"></a>1183</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1184"></a>1184</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1185"></a>1185</td><td></td><td></td><td></td><td></td><td class="s">   if ( exists $cmd_cache{$cmd_name} ) {</td></tr>
+<tr><td class="h"><a name="1186"></a>1186</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;'$cmd_name' found in cache: '$cmd_cache{$cmd_name}'&quot;</td></tr>
+<tr><td class="h"><a name="1187"></a>1187</td><td></td><td></td><td></td><td></td><td class="s">         if _debugging;</td></tr>
+<tr><td class="h"><a name="1188"></a>1188</td><td></td><td></td><td></td><td></td><td class="s">      return $cmd_cache{$cmd_name} if -x $cmd_cache{$cmd_name};</td></tr>
+<tr><td class="h"><a name="1189"></a>1189</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;'$cmd_cache{$cmd_name}' no longer executable, searching...&quot;</td></tr>
+<tr><td class="h"><a name="1190"></a>1190</td><td></td><td></td><td></td><td></td><td class="s">         if _debugging;</td></tr>
+<tr><td class="h"><a name="1191"></a>1191</td><td></td><td></td><td></td><td></td><td class="s">      delete $cmd_cache{$cmd_name};</td></tr>
+<tr><td class="h"><a name="1192"></a>1192</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1193"></a>1193</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1194"></a>1194</td><td></td><td></td><td></td><td></td><td class="s">   my @searched_in;</td></tr>
+<tr><td class="h"><a name="1195"></a>1195</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1196"></a>1196</td><td></td><td></td><td></td><td></td><td class="s">   ## This next bit is Unix/Win32 specific, unfortunately.</td></tr>
+<tr><td class="h"><a name="1197"></a>1197</td><td></td><td></td><td></td><td></td><td class="s">   ## There's been some conversation about extending File::Spec to provide</td></tr>
+<tr><td class="h"><a name="1198"></a>1198</td><td></td><td></td><td></td><td></td><td class="s">   ## a universal interface to PATH, but I haven't seen it yet.</td></tr>
+<tr><td class="h"><a name="1199"></a>1199</td><td></td><td></td><td></td><td></td><td class="s">      my $re = Win32_MODE ? qr/;/ : qr/:/;</td></tr>
+<tr><td class="h"><a name="1200"></a>1200</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1201"></a>1201</td><td></td><td></td><td></td><td></td><td class="s">LOOP:</td></tr>
+<tr><td class="h"><a name="1202"></a>1202</td><td></td><td></td><td></td><td></td><td class="s">   for ( split( $re, $ENV{PATH} || '', -1 ) ) {</td></tr>
+<tr><td class="h"><a name="1203"></a>1203</td><td></td><td></td><td></td><td></td><td class="s">      $_ = &quot;.&quot; unless length $_;</td></tr>
+<tr><td class="h"><a name="1204"></a>1204</td><td></td><td></td><td></td><td></td><td class="s">      push @searched_in, $_;</td></tr>
+<tr><td class="h"><a name="1205"></a>1205</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1206"></a>1206</td><td></td><td></td><td></td><td></td><td class="s">      my $prospect = File::Spec-&gt;catfile( $_, $cmd_name );</td></tr>
+<tr><td class="h"><a name="1207"></a>1207</td><td></td><td></td><td></td><td></td><td class="s">      my @prospects;</td></tr>
+<tr><td class="h"><a name="1208"></a>1208</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1209"></a>1209</td><td></td><td></td><td></td><td></td><td class="s">      @prospects =</td></tr>
+<tr><td class="h"><a name="1210"></a>1210</td><td></td><td></td><td></td><td></td><td class="s">         ( Win32_MODE &amp;&amp; ! ( -f $prospect &amp;&amp; -x _ ) )</td></tr>
+<tr><td class="h"><a name="1211"></a>1211</td><td></td><td></td><td></td><td></td><td class="s">            ? map &quot;$prospect$_&quot;, split /;/, $ENV{PATHEXT} || &quot;.COM;.BAT;.EXE&quot;</td></tr>
+<tr><td class="h"><a name="1212"></a>1212</td><td></td><td></td><td></td><td></td><td class="s">            : ( $prospect );</td></tr>
+<tr><td class="h"><a name="1213"></a>1213</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1214"></a>1214</td><td></td><td></td><td></td><td></td><td class="s">      for my $found ( @prospects ) {</td></tr>
+<tr><td class="h"><a name="1215"></a>1215</td><td></td><td></td><td></td><td></td><td class="s">         if ( -f $found &amp;&amp; -x _ ) {</td></tr>
+<tr><td class="h"><a name="1216"></a>1216</td><td></td><td></td><td></td><td></td><td class="s">            $cmd_cache{$cmd_name} = $found;</td></tr>
+<tr><td class="h"><a name="1217"></a>1217</td><td></td><td></td><td></td><td></td><td class="s">            last LOOP;</td></tr>
+<tr><td class="h"><a name="1218"></a>1218</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1219"></a>1219</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="1220"></a>1220</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1221"></a>1221</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1222"></a>1222</td><td></td><td></td><td></td><td></td><td class="s">   if ( exists $cmd_cache{$cmd_name} ) {</td></tr>
+<tr><td class="h"><a name="1223"></a>1223</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;'&quot;, $cmd_name, &quot;' added to cache: '&quot;, $cmd_cache{$cmd_name}, &quot;'&quot;</td></tr>
+<tr><td class="h"><a name="1224"></a>1224</td><td></td><td></td><td></td><td></td><td class="s">         if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1225"></a>1225</td><td></td><td></td><td></td><td></td><td class="s">      return $cmd_cache{$cmd_name};</td></tr>
+<tr><td class="h"><a name="1226"></a>1226</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1227"></a>1227</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1228"></a>1228</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;Command '$cmd_name' not found in &quot; . join( &quot;, &quot;, @searched_in );</td></tr>
+<tr><td class="h"><a name="1229"></a>1229</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1230"></a>1230</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1231"></a>1231</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1232"></a>1232</td><td></td><td></td><td></td><td></td><td class="s">sub _empty($) { ! ( defined $_[0] &amp;&amp; length $_[0] ) }</td></tr>
+<tr><td class="h"><a name="1233"></a>1233</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1234"></a>1234</td><td></td><td></td><td></td><td></td><td class="s">## 'safe' versions of otherwise fun things to do. See also IPC::Run::Win32Helper.</td></tr>
+<tr><td class="h"><a name="1235"></a>1235</td><td></td><td></td><td></td><td></td><td class="s">sub _close {</td></tr>
+<tr><td class="h"><a name="1236"></a>1236</td><td></td><td></td><td></td><td></td><td class="s">   confess 'undef' unless defined $_[0];</td></tr>
+<tr><td class="h"><a name="1237"></a>1237</td><td class="c3">2</td><td class="c0"><span title="Avg 582&micro;s">1.16ms</span></td><td class="c3">2</td><td class="c3">45&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 27&micro;s (10+17) within IPC::Run::BEGIN@1237 which was called:
+#    once (10&micro;s+17&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1237">line 1237</a></div></div>   no strict 'refs';<div class="calls"><div class="calls_out">   # spent    27&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1237">IPC::Run::BEGIN@1237</a>
+   # spent    17&micro;s making 1 call to <a href="strict-pm-3-sub.html#39">strict::unimport</a></div></div></td></tr>
+<tr><td class="h"><a name="1238"></a>1238</td><td></td><td></td><td></td><td></td><td class="s">   my $fd = $_[0] =~ /^\d+$/ ? $_[0] : fileno $_[0];</td></tr>
+<tr><td class="h"><a name="1239"></a>1239</td><td></td><td></td><td></td><td></td><td class="s">   my $r = POSIX::close $fd;</td></tr>
+<tr><td class="h"><a name="1240"></a>1240</td><td></td><td></td><td></td><td></td><td class="s">   $r = $r ? '' : &quot; ERROR $!&quot;;</td></tr>
+<tr><td class="h"><a name="1241"></a>1241</td><td></td><td></td><td></td><td></td><td class="s">   delete $fds{$fd};</td></tr>
+<tr><td class="h"><a name="1242"></a>1242</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;close( $fd ) = &quot; . ( $r || 0 ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1243"></a>1243</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1244"></a>1244</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1245"></a>1245</td><td></td><td></td><td></td><td></td><td class="s">sub _dup {</td></tr>
+<tr><td class="h"><a name="1246"></a>1246</td><td></td><td></td><td></td><td></td><td class="s">   confess 'undef' unless defined $_[0];</td></tr>
+<tr><td class="h"><a name="1247"></a>1247</td><td></td><td></td><td></td><td></td><td class="s">   my $r = POSIX::dup( $_[0] );</td></tr>
+<tr><td class="h"><a name="1248"></a>1248</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;$!: dup( $_[0] )&quot; unless defined $r;</td></tr>
+<tr><td class="h"><a name="1249"></a>1249</td><td></td><td></td><td></td><td></td><td class="s">   $r = 0 if $r eq '0 but true';</td></tr>
+<tr><td class="h"><a name="1250"></a>1250</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;dup( $_[0] ) = $r&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1251"></a>1251</td><td></td><td></td><td></td><td></td><td class="s">   $fds{$r} = 1;</td></tr>
+<tr><td class="h"><a name="1252"></a>1252</td><td></td><td></td><td></td><td></td><td class="s">   return $r;</td></tr>
+<tr><td class="h"><a name="1253"></a>1253</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1254"></a>1254</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1255"></a>1255</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1256"></a>1256</td><td></td><td></td><td></td><td></td><td class="s">sub _dup2_rudely {</td></tr>
+<tr><td class="h"><a name="1257"></a>1257</td><td></td><td></td><td></td><td></td><td class="s">   confess 'undef' unless defined $_[0] &amp;&amp; defined $_[1];</td></tr>
+<tr><td class="h"><a name="1258"></a>1258</td><td></td><td></td><td></td><td></td><td class="s">   my $r = POSIX::dup2( $_[0], $_[1] );</td></tr>
+<tr><td class="h"><a name="1259"></a>1259</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;$!: dup2( $_[0], $_[1] )&quot; unless defined $r;</td></tr>
+<tr><td class="h"><a name="1260"></a>1260</td><td></td><td></td><td></td><td></td><td class="s">   $r = 0 if $r eq '0 but true';</td></tr>
+<tr><td class="h"><a name="1261"></a>1261</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;dup2( $_[0], $_[1] ) = $r&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1262"></a>1262</td><td></td><td></td><td></td><td></td><td class="s">   $fds{$r} = 1;</td></tr>
+<tr><td class="h"><a name="1263"></a>1263</td><td></td><td></td><td></td><td></td><td class="s">   return $r;</td></tr>
+<tr><td class="h"><a name="1264"></a>1264</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1265"></a>1265</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1266"></a>1266</td><td></td><td></td><td></td><td></td><td class="s">sub _exec {</td></tr>
+<tr><td class="h"><a name="1267"></a>1267</td><td></td><td></td><td></td><td></td><td class="s">   confess 'undef passed' if grep !defined, @_;</td></tr>
+<tr><td class="h"><a name="1268"></a>1268</td><td></td><td></td><td></td><td></td><td class="s">#   exec @_ or croak &quot;$!: exec( &quot; . join( ', ', @_ ) . &quot; )&quot;;</td></tr>
+<tr><td class="h"><a name="1269"></a>1269</td><td></td><td></td><td></td><td></td><td class="s">   _debug 'exec()ing ', join &quot; &quot;, map &quot;'$_'&quot;, @_ if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1270"></a>1270</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1271"></a>1271</td><td></td><td></td><td></td><td></td><td class="s">#   {</td></tr>
+<tr><td class="h"><a name="1272"></a>1272</td><td></td><td></td><td></td><td></td><td class="s">## Commented out since we don't call this on Win32.</td></tr>
+<tr><td class="h"><a name="1273"></a>1273</td><td></td><td></td><td></td><td></td><td class="s">#      # This works around the bug where 5.6.1 complains</td></tr>
+<tr><td class="h"><a name="1274"></a>1274</td><td></td><td></td><td></td><td></td><td class="s">#      # &quot;Can't exec ...: No error&quot; after an exec on NT, where</td></tr>
+<tr><td class="h"><a name="1275"></a>1275</td><td></td><td></td><td></td><td></td><td class="s">#      # exec() is simulated and actually returns in Perl's C</td></tr>
+<tr><td class="h"><a name="1276"></a>1276</td><td></td><td></td><td></td><td></td><td class="s">#      # code, though Perl's &amp;exec does not...</td></tr>
+<tr><td class="h"><a name="1277"></a>1277</td><td></td><td></td><td></td><td></td><td class="s">#      no warnings &quot;exec&quot;;</td></tr>
+<tr><td class="h"><a name="1278"></a>1278</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="1279"></a>1279</td><td></td><td></td><td></td><td></td><td class="s">#      # Just in case the no warnings workaround</td></tr>
+<tr><td class="h"><a name="1280"></a>1280</td><td></td><td></td><td></td><td></td><td class="s">#      # stops beign a workaround, we don't want</td></tr>
+<tr><td class="h"><a name="1281"></a>1281</td><td></td><td></td><td></td><td></td><td class="s">#      # old values of $! causing spurious strerr()</td></tr>
+<tr><td class="h"><a name="1282"></a>1282</td><td></td><td></td><td></td><td></td><td class="s">#      # messages to appear in the &quot;Can't exec&quot; message</td></tr>
+<tr><td class="h"><a name="1283"></a>1283</td><td></td><td></td><td></td><td></td><td class="s">#      undef $!;</td></tr>
+<tr><td class="h"><a name="1284"></a>1284</td><td></td><td></td><td></td><td></td><td class="s">      exec @_;</td></tr>
+<tr><td class="h"><a name="1285"></a>1285</td><td></td><td></td><td></td><td></td><td class="s">#   }</td></tr>
+<tr><td class="h"><a name="1286"></a>1286</td><td></td><td></td><td></td><td></td><td class="s">#   croak &quot;$!: exec( &quot; . join( ', ', map &quot;'$_'&quot;, @_ ) . &quot; )&quot;;</td></tr>
+<tr><td class="h"><a name="1287"></a>1287</td><td></td><td></td><td></td><td></td><td class="s">    ## Fall through so $! can be reported to parent.</td></tr>
+<tr><td class="h"><a name="1288"></a>1288</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1289"></a>1289</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1290"></a>1290</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1291"></a>1291</td><td></td><td></td><td></td><td></td><td class="s">sub _sysopen {</td></tr>
+<tr><td class="h"><a name="1292"></a>1292</td><td></td><td></td><td></td><td></td><td class="s">   confess 'undef' unless defined $_[0] &amp;&amp; defined $_[1];</td></tr>
+<tr><td class="h"><a name="1293"></a>1293</td><td></td><td></td><td></td><td></td><td class="s">_debug sprintf( &quot;O_RDONLY=0x%02x &quot;, O_RDONLY ),</td></tr>
+<tr><td class="h"><a name="1294"></a>1294</td><td></td><td></td><td></td><td></td><td class="s">sprintf( &quot;O_WRONLY=0x%02x &quot;, O_WRONLY ),</td></tr>
+<tr><td class="h"><a name="1295"></a>1295</td><td></td><td></td><td></td><td></td><td class="s">sprintf( &quot;O_RDWR=0x%02x &quot;, O_RDWR ),</td></tr>
+<tr><td class="h"><a name="1296"></a>1296</td><td></td><td></td><td></td><td></td><td class="s">sprintf( &quot;O_TRUNC=0x%02x &quot;, O_TRUNC),</td></tr>
+<tr><td class="h"><a name="1297"></a>1297</td><td></td><td></td><td></td><td></td><td class="s">sprintf( &quot;O_CREAT=0x%02x &quot;, O_CREAT),</td></tr>
+<tr><td class="h"><a name="1298"></a>1298</td><td></td><td></td><td></td><td></td><td class="s">sprintf( &quot;O_APPEND=0x%02x &quot;, O_APPEND),</td></tr>
+<tr><td class="h"><a name="1299"></a>1299</td><td></td><td></td><td></td><td></td><td class="s">if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1300"></a>1300</td><td></td><td></td><td></td><td></td><td class="s">   my $r = POSIX::open( $_[0], $_[1], 0644 );</td></tr>
+<tr><td class="h"><a name="1301"></a>1301</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;$!: open( $_[0], &quot;, sprintf( &quot;0x%03x&quot;, $_[1] ), &quot; )&quot; unless defined $r;</td></tr>
+<tr><td class="h"><a name="1302"></a>1302</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;open( $_[0], &quot;, sprintf( &quot;0x%03x&quot;, $_[1] ), &quot; ) = $r&quot;</td></tr>
+<tr><td class="h"><a name="1303"></a>1303</td><td></td><td></td><td></td><td></td><td class="s">      if _debugging_data;</td></tr>
+<tr><td class="h"><a name="1304"></a>1304</td><td></td><td></td><td></td><td></td><td class="s">   $fds{$r} = 1;</td></tr>
+<tr><td class="h"><a name="1305"></a>1305</td><td></td><td></td><td></td><td></td><td class="s">   return $r;</td></tr>
+<tr><td class="h"><a name="1306"></a>1306</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1307"></a>1307</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1308"></a>1308</td><td></td><td></td><td></td><td></td><td class="s">sub _pipe {</td></tr>
+<tr><td class="h"><a name="1309"></a>1309</td><td></td><td></td><td></td><td></td><td class="s">   ## Normal, blocking write for pipes that we read and the child writes,</td></tr>
+<tr><td class="h"><a name="1310"></a>1310</td><td></td><td></td><td></td><td></td><td class="s">   ## since most children expect writes to stdout to block rather than</td></tr>
+<tr><td class="h"><a name="1311"></a>1311</td><td></td><td></td><td></td><td></td><td class="s">   ## do a partial write.</td></tr>
+<tr><td class="h"><a name="1312"></a>1312</td><td></td><td></td><td></td><td></td><td class="s">   my ( $r, $w ) = POSIX::pipe;</td></tr>
+<tr><td class="h"><a name="1313"></a>1313</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;$!: pipe()&quot; unless defined $r;</td></tr>
+<tr><td class="h"><a name="1314"></a>1314</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;pipe() = ( $r, $w ) &quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1315"></a>1315</td><td></td><td></td><td></td><td></td><td class="s">   $fds{$r} = $fds{$w} = 1;</td></tr>
+<tr><td class="h"><a name="1316"></a>1316</td><td></td><td></td><td></td><td></td><td class="s">   return ( $r, $w );</td></tr>
+<tr><td class="h"><a name="1317"></a>1317</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1318"></a>1318</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1319"></a>1319</td><td></td><td></td><td></td><td></td><td class="s">sub _pipe_nb {</td></tr>
+<tr><td class="h"><a name="1320"></a>1320</td><td></td><td></td><td></td><td></td><td class="s">   ## For pipes that we write, unblock the write side, so we can fill a buffer</td></tr>
+<tr><td class="h"><a name="1321"></a>1321</td><td></td><td></td><td></td><td></td><td class="s">   ## and continue to select().</td></tr>
+<tr><td class="h"><a name="1322"></a>1322</td><td></td><td></td><td></td><td></td><td class="s">   ## Contributed by Borislav Deianov &lt;borislav@ensim.com&gt;, with minor</td></tr>
+<tr><td class="h"><a name="1323"></a>1323</td><td></td><td></td><td></td><td></td><td class="s">   ## bugfix on fcntl result by me.</td></tr>
+<tr><td class="h"><a name="1324"></a>1324</td><td></td><td></td><td></td><td></td><td class="s">   local ( *R, *W );</td></tr>
+<tr><td class="h"><a name="1325"></a>1325</td><td></td><td></td><td></td><td></td><td class="s">   my $f = pipe( R, W );</td></tr>
+<tr><td class="h"><a name="1326"></a>1326</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;$!: pipe()&quot; unless defined $f;</td></tr>
+<tr><td class="h"><a name="1327"></a>1327</td><td></td><td></td><td></td><td></td><td class="s">   my ( $r, $w ) = ( fileno R, fileno W );</td></tr>
+<tr><td class="h"><a name="1328"></a>1328</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;pipe_nb pipe() = ( $r, $w )&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1329"></a>1329</td><td></td><td></td><td></td><td></td><td class="s">   unless ( Win32_MODE ) {</td></tr>
+<tr><td class="h"><a name="1330"></a>1330</td><td></td><td></td><td></td><td></td><td class="s">      ## POSIX::fcntl doesn't take fd numbers, so gotta use Perl's and</td></tr>
+<tr><td class="h"><a name="1331"></a>1331</td><td></td><td></td><td></td><td></td><td class="s">      ## then _dup the originals (which get closed on leaving this block)</td></tr>
+<tr><td class="h"><a name="1332"></a>1332</td><td></td><td></td><td></td><td></td><td class="s">      my $fres = fcntl( W, &amp;F_SETFL, O_WRONLY | O_NONBLOCK );</td></tr>
+<tr><td class="h"><a name="1333"></a>1333</td><td></td><td></td><td></td><td></td><td class="s">      croak &quot;$!: fcntl( $w, F_SETFL, O_NONBLOCK )&quot; unless $fres;</td></tr>
+<tr><td class="h"><a name="1334"></a>1334</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;fcntl( $w, F_SETFL, O_NONBLOCK )&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1335"></a>1335</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1336"></a>1336</td><td></td><td></td><td></td><td></td><td class="s">   ( $r, $w ) = ( _dup( $r ), _dup( $w ) );</td></tr>
+<tr><td class="h"><a name="1337"></a>1337</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;pipe_nb() = ( $r, $w )&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1338"></a>1338</td><td></td><td></td><td></td><td></td><td class="s">   return ( $r, $w );</td></tr>
+<tr><td class="h"><a name="1339"></a>1339</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1340"></a>1340</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1341"></a>1341</td><td></td><td></td><td></td><td></td><td class="s">sub _pty {</td></tr>
+<tr><td class="h"><a name="1342"></a>1342</td><td></td><td></td><td></td><td></td><td class="s">   require IO::Pty;</td></tr>
+<tr><td class="h"><a name="1343"></a>1343</td><td></td><td></td><td></td><td></td><td class="s">   my $pty = IO::Pty-&gt;new();</td></tr>
+<tr><td class="h"><a name="1344"></a>1344</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;$!: pty ()&quot; unless $pty;</td></tr>
+<tr><td class="h"><a name="1345"></a>1345</td><td></td><td></td><td></td><td></td><td class="s">   $pty-&gt;autoflush();</td></tr>
+<tr><td class="h"><a name="1346"></a>1346</td><td></td><td></td><td></td><td></td><td class="s">   $pty-&gt;blocking( 0 ) or croak &quot;$!: pty-&gt;blocking ( 0 )&quot;;</td></tr>
+<tr><td class="h"><a name="1347"></a>1347</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;pty() = ( &quot;, $pty-&gt;fileno, &quot;, &quot;, $pty-&gt;slave-&gt;fileno, &quot; )&quot;</td></tr>
+<tr><td class="h"><a name="1348"></a>1348</td><td></td><td></td><td></td><td></td><td class="s">      if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1349"></a>1349</td><td></td><td></td><td></td><td></td><td class="s">   $fds{$pty-&gt;fileno} = $fds{$pty-&gt;slave-&gt;fileno} = 1;</td></tr>
+<tr><td class="h"><a name="1350"></a>1350</td><td></td><td></td><td></td><td></td><td class="s">   return $pty;</td></tr>
+<tr><td class="h"><a name="1351"></a>1351</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1352"></a>1352</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1353"></a>1353</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1354"></a>1354</td><td></td><td></td><td></td><td></td><td class="s">sub _read {</td></tr>
+<tr><td class="h"><a name="1355"></a>1355</td><td></td><td></td><td></td><td></td><td class="s">   confess 'undef' unless defined $_[0];</td></tr>
+<tr><td class="h"><a name="1356"></a>1356</td><td></td><td></td><td></td><td></td><td class="s">   my $s  = '';</td></tr>
+<tr><td class="h"><a name="1357"></a>1357</td><td></td><td></td><td></td><td></td><td class="s">   my $r = POSIX::read( $_[0], $s, 10_000 );</td></tr>
+<tr><td class="h"><a name="1358"></a>1358</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;$!: read( $_[0] )&quot; if not($r) and $! != POSIX::EINTR;</td></tr>
+<tr><td class="h"><a name="1359"></a>1359</td><td></td><td></td><td></td><td></td><td class="s">   $r ||= 0;</td></tr>
+<tr><td class="h"><a name="1360"></a>1360</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;read( $_[0] ) = $r chars '$s'&quot; if _debugging_data;</td></tr>
+<tr><td class="h"><a name="1361"></a>1361</td><td></td><td></td><td></td><td></td><td class="s">   return $s;</td></tr>
+<tr><td class="h"><a name="1362"></a>1362</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1363"></a>1363</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1364"></a>1364</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1365"></a>1365</td><td></td><td></td><td></td><td></td><td class="s">## A METHOD, not a function.</td></tr>
+<tr><td class="h"><a name="1366"></a>1366</td><td></td><td></td><td></td><td></td><td class="s">sub _spawn {</td></tr>
+<tr><td class="h"><a name="1367"></a>1367</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="1368"></a>1368</td><td></td><td></td><td></td><td></td><td class="s">   my ( $kid ) = @_;</td></tr>
+<tr><td class="h"><a name="1369"></a>1369</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1370"></a>1370</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;opening sync pipe &quot;, $kid-&gt;{PID} if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1371"></a>1371</td><td></td><td></td><td></td><td></td><td class="s">   my $sync_reader_fd;</td></tr>
+<tr><td class="h"><a name="1372"></a>1372</td><td></td><td></td><td></td><td></td><td class="s">   ( $sync_reader_fd, $self-&gt;{SYNC_WRITER_FD} ) = _pipe;</td></tr>
+<tr><td class="h"><a name="1373"></a>1373</td><td></td><td></td><td></td><td></td><td class="s">   $kid-&gt;{PID} = fork();</td></tr>
+<tr><td class="h"><a name="1374"></a>1374</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;$! during fork&quot; unless defined $kid-&gt;{PID};</td></tr>
+<tr><td class="h"><a name="1375"></a>1375</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1376"></a>1376</td><td></td><td></td><td></td><td></td><td class="s">   unless ( $kid-&gt;{PID} ) {</td></tr>
+<tr><td class="h"><a name="1377"></a>1377</td><td></td><td></td><td></td><td></td><td class="s">      ## _do_kid_and_exit closes sync_reader_fd since it closes all unwanted and</td></tr>
+<tr><td class="h"><a name="1378"></a>1378</td><td></td><td></td><td></td><td></td><td class="s">      ## unloved fds.</td></tr>
+<tr><td class="h"><a name="1379"></a>1379</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;_do_kid_and_exit( $kid );</td></tr>
+<tr><td class="h"><a name="1380"></a>1380</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1381"></a>1381</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;fork() = &quot;, $kid-&gt;{PID} if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1382"></a>1382</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1383"></a>1383</td><td></td><td></td><td></td><td></td><td class="s">   ## Wait for kid to get to it's exec() and see if it fails.</td></tr>
+<tr><td class="h"><a name="1384"></a>1384</td><td></td><td></td><td></td><td></td><td class="s">   _close $self-&gt;{SYNC_WRITER_FD};</td></tr>
+<tr><td class="h"><a name="1385"></a>1385</td><td></td><td></td><td></td><td></td><td class="s">   my $sync_pulse = _read $sync_reader_fd;</td></tr>
+<tr><td class="h"><a name="1386"></a>1386</td><td></td><td></td><td></td><td></td><td class="s">   _close $sync_reader_fd;</td></tr>
+<tr><td class="h"><a name="1387"></a>1387</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1388"></a>1388</td><td></td><td></td><td></td><td></td><td class="s">   if ( ! defined $sync_pulse || length $sync_pulse ) {</td></tr>
+<tr><td class="h"><a name="1389"></a>1389</td><td></td><td></td><td></td><td></td><td class="s">      if ( waitpid( $kid-&gt;{PID}, 0 ) &gt;= 0 ) {</td></tr>
+<tr><td class="h"><a name="1390"></a>1390</td><td></td><td></td><td></td><td></td><td class="s">         $kid-&gt;{RESULT} = $?;</td></tr>
+<tr><td class="h"><a name="1391"></a>1391</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="1392"></a>1392</td><td></td><td></td><td></td><td></td><td class="s">      else {</td></tr>
+<tr><td class="h"><a name="1393"></a>1393</td><td></td><td></td><td></td><td></td><td class="s">         $kid-&gt;{RESULT} = -1;</td></tr>
+<tr><td class="h"><a name="1394"></a>1394</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="1395"></a>1395</td><td></td><td></td><td></td><td></td><td class="s">      $sync_pulse =</td></tr>
+<tr><td class="h"><a name="1396"></a>1396</td><td></td><td></td><td></td><td></td><td class="s">         &quot;error reading synchronization pipe for $kid-&gt;{NUM}, pid $kid-&gt;{PID}&quot;</td></tr>
+<tr><td class="h"><a name="1397"></a>1397</td><td></td><td></td><td></td><td></td><td class="s">         unless length $sync_pulse;</td></tr>
+<tr><td class="h"><a name="1398"></a>1398</td><td></td><td></td><td></td><td></td><td class="s">      croak $sync_pulse;</td></tr>
+<tr><td class="h"><a name="1399"></a>1399</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1400"></a>1400</td><td></td><td></td><td></td><td></td><td class="s">   return $kid-&gt;{PID};</td></tr>
+<tr><td class="h"><a name="1401"></a>1401</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1402"></a>1402</td><td></td><td></td><td></td><td></td><td class="s">## Wait for pty to get set up.  This is a hack until we get synchronous</td></tr>
+<tr><td class="h"><a name="1403"></a>1403</td><td></td><td></td><td></td><td></td><td class="s">## selects.</td></tr>
+<tr><td class="h"><a name="1404"></a>1404</td><td></td><td></td><td></td><td></td><td class="s">if ( keys %{$self-&gt;{PTYS}} &amp;&amp; $IO::Pty::VERSION &lt; 0.9 ) {</td></tr>
+<tr><td class="h"><a name="1405"></a>1405</td><td></td><td></td><td></td><td></td><td class="s">_debug &quot;sleeping to give pty a chance to init, will fix when newer IO::Pty arrives.&quot;;</td></tr>
+<tr><td class="h"><a name="1406"></a>1406</td><td></td><td></td><td></td><td></td><td class="s">sleep 1;</td></tr>
+<tr><td class="h"><a name="1407"></a>1407</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1408"></a>1408</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1409"></a>1409</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1410"></a>1410</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1411"></a>1411</td><td></td><td></td><td></td><td></td><td class="s">sub _write {</td></tr>
+<tr><td class="h"><a name="1412"></a>1412</td><td></td><td></td><td></td><td></td><td class="s">   confess 'undef' unless defined $_[0] &amp;&amp; defined $_[1];</td></tr>
+<tr><td class="h"><a name="1413"></a>1413</td><td></td><td></td><td></td><td></td><td class="s">   my $r = POSIX::write( $_[0], $_[1], length $_[1] );</td></tr>
+<tr><td class="h"><a name="1414"></a>1414</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;$!: write( $_[0], '$_[1]' )&quot; unless $r;</td></tr>
+<tr><td class="h"><a name="1415"></a>1415</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;write( $_[0], '$_[1]' ) = $r&quot; if _debugging_data;</td></tr>
+<tr><td class="h"><a name="1416"></a>1416</td><td></td><td></td><td></td><td></td><td class="s">   return $r;</td></tr>
+<tr><td class="h"><a name="1417"></a>1417</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1418"></a>1418</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1419"></a>1419</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="1420"></a>1420</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1421"></a>1421</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="1422"></a>1422</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1423"></a>1423</td><td></td><td></td><td></td><td></td><td class="s">=item run</td></tr>
+<tr><td class="h"><a name="1424"></a>1424</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1425"></a>1425</td><td></td><td></td><td></td><td></td><td class="s">Run takes a harness or harness specification and runs it, pumping</td></tr>
+<tr><td class="h"><a name="1426"></a>1426</td><td></td><td></td><td></td><td></td><td class="s">all input to the child(ren), closing the input pipes when no more</td></tr>
+<tr><td class="h"><a name="1427"></a>1427</td><td></td><td></td><td></td><td></td><td class="s">input is available, collecting all output that arrives, until the</td></tr>
+<tr><td class="h"><a name="1428"></a>1428</td><td></td><td></td><td></td><td></td><td class="s">pipes delivering output are closed, then waiting for the children to</td></tr>
+<tr><td class="h"><a name="1429"></a>1429</td><td></td><td></td><td></td><td></td><td class="s">exit and reaping their result codes.</td></tr>
+<tr><td class="h"><a name="1430"></a>1430</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1431"></a>1431</td><td></td><td></td><td></td><td></td><td class="s">You may think of C&lt;run( ... )&gt; as being like </td></tr>
+<tr><td class="h"><a name="1432"></a>1432</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1433"></a>1433</td><td></td><td></td><td></td><td></td><td class="s">   start( ... )-&gt;finish();</td></tr>
+<tr><td class="h"><a name="1434"></a>1434</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1435"></a>1435</td><td></td><td></td><td></td><td></td><td class="s">, though there is one subtle difference: run() does not</td></tr>
+<tr><td class="h"><a name="1436"></a>1436</td><td></td><td></td><td></td><td></td><td class="s">set \$input_scalars to '' like finish() does.  If an exception is thrown</td></tr>
+<tr><td class="h"><a name="1437"></a>1437</td><td></td><td></td><td></td><td></td><td class="s">from run(), all children will be killed off &quot;gently&quot;, and then &quot;annihilated&quot;</td></tr>
+<tr><td class="h"><a name="1438"></a>1438</td><td></td><td></td><td></td><td></td><td class="s">if they do not go gently (in to that dark night. sorry).</td></tr>
+<tr><td class="h"><a name="1439"></a>1439</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1440"></a>1440</td><td></td><td></td><td></td><td></td><td class="s">If any exceptions are thrown, this does a L&lt;/kill_kill&gt; before propogating</td></tr>
+<tr><td class="h"><a name="1441"></a>1441</td><td></td><td></td><td></td><td></td><td class="s">them.</td></tr>
+<tr><td class="h"><a name="1442"></a>1442</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1443"></a>1443</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="1444"></a>1444</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1445"></a>1445</td><td class="c3">2</td><td class="c0"><span title="Avg 4.16ms">8.33ms</span></td><td class="c3">2</td><td class="c3">54&micro;s</td><td class="s"><div class="calls"><div class="calls_in"># spent 32&micro;s (10+22) within IPC::Run::BEGIN@1445 which was called:
+#    once (10&micro;s+22&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#1445">line 1445</a></div></div>use vars qw( $in_run );  ## No, not Enron;)<div class="calls"><div class="calls_out"># spent    32&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#1445">IPC::Run::BEGIN@1445</a>
+# spent    22&micro;s making 1 call to <a href="vars-pm-6-sub.html#10">vars::import</a></div></div></td></tr>
+<tr><td class="h"><a name="1446"></a>1446</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1447"></a>1447</td><td></td><td></td><td></td><td></td><td class="s">sub run {</td></tr>
+<tr><td class="h"><a name="1448"></a>1448</td><td></td><td></td><td></td><td></td><td class="s">   local $in_run = 1;  ## Allow run()-only optimizations.</td></tr>
+<tr><td class="h"><a name="1449"></a>1449</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = start( @_ );</td></tr>
+<tr><td class="h"><a name="1450"></a>1450</td><td></td><td></td><td></td><td></td><td class="s">   my $r = eval {</td></tr>
+<tr><td class="h"><a name="1451"></a>1451</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;{clear_ins} = 0;</td></tr>
+<tr><td class="h"><a name="1452"></a>1452</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;finish;</td></tr>
+<tr><td class="h"><a name="1453"></a>1453</td><td></td><td></td><td></td><td></td><td class="s">   };</td></tr>
+<tr><td class="h"><a name="1454"></a>1454</td><td></td><td></td><td></td><td></td><td class="s">   if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="1455"></a>1455</td><td></td><td></td><td></td><td></td><td class="s">      my $x = $@;</td></tr>
+<tr><td class="h"><a name="1456"></a>1456</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;kill_kill;</td></tr>
+<tr><td class="h"><a name="1457"></a>1457</td><td></td><td></td><td></td><td></td><td class="s">      die $x;</td></tr>
+<tr><td class="h"><a name="1458"></a>1458</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1459"></a>1459</td><td></td><td></td><td></td><td></td><td class="s">   return $r;</td></tr>
+<tr><td class="h"><a name="1460"></a>1460</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1461"></a>1461</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1462"></a>1462</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="1463"></a>1463</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1464"></a>1464</td><td></td><td></td><td></td><td></td><td class="s">=item signal</td></tr>
+<tr><td class="h"><a name="1465"></a>1465</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1466"></a>1466</td><td></td><td></td><td></td><td></td><td class="s">   ## To send it a specific signal by name (&quot;USR1&quot;):</td></tr>
+<tr><td class="h"><a name="1467"></a>1467</td><td></td><td></td><td></td><td></td><td class="s">   signal $h, &quot;USR1&quot;;</td></tr>
+<tr><td class="h"><a name="1468"></a>1468</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;signal ( &quot;USR1&quot; );</td></tr>
+<tr><td class="h"><a name="1469"></a>1469</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1470"></a>1470</td><td></td><td></td><td></td><td></td><td class="s">If $signal is provided and defined, sends a signal to all child processes.  Try</td></tr>
+<tr><td class="h"><a name="1471"></a>1471</td><td></td><td></td><td></td><td></td><td class="s">not to send numeric signals, use C&lt;&quot;KILL&quot;&gt; instead of C&lt;9&gt;, for instance.</td></tr>
+<tr><td class="h"><a name="1472"></a>1472</td><td></td><td></td><td></td><td></td><td class="s">Numeric signals aren't portable.</td></tr>
+<tr><td class="h"><a name="1473"></a>1473</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1474"></a>1474</td><td></td><td></td><td></td><td></td><td class="s">Throws an exception if $signal is undef.</td></tr>
+<tr><td class="h"><a name="1475"></a>1475</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1476"></a>1476</td><td></td><td></td><td></td><td></td><td class="s">This will I&lt;not&gt; clean up the harness, C&lt;finish&gt; it if you kill it.</td></tr>
+<tr><td class="h"><a name="1477"></a>1477</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1478"></a>1478</td><td></td><td></td><td></td><td></td><td class="s">Normally TERM kills a process gracefully (this is what the command line utility</td></tr>
+<tr><td class="h"><a name="1479"></a>1479</td><td></td><td></td><td></td><td></td><td class="s">C&lt;kill&gt; does by default), INT is sent by one of the keys C&lt;^C&gt;, C&lt;Backspace&gt; or</td></tr>
+<tr><td class="h"><a name="1480"></a>1480</td><td></td><td></td><td></td><td></td><td class="s">C&lt;E&lt;lt&gt;DelE&lt;gt&gt;&gt;, and C&lt;QUIT&gt; is used to kill a process and make it coredump.</td></tr>
+<tr><td class="h"><a name="1481"></a>1481</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1482"></a>1482</td><td></td><td></td><td></td><td></td><td class="s">The C&lt;HUP&gt; signal is often used to get a process to &quot;restart&quot;, rereading </td></tr>
+<tr><td class="h"><a name="1483"></a>1483</td><td></td><td></td><td></td><td></td><td class="s">config files, and C&lt;USR1&gt; and C&lt;USR2&gt; for really application-specific things.</td></tr>
+<tr><td class="h"><a name="1484"></a>1484</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1485"></a>1485</td><td></td><td></td><td></td><td></td><td class="s">Often, running C&lt;kill -l&gt; (that's a lower case &quot;L&quot;) on the command line will</td></tr>
+<tr><td class="h"><a name="1486"></a>1486</td><td></td><td></td><td></td><td></td><td class="s">list the signals present on your operating system.</td></tr>
+<tr><td class="h"><a name="1487"></a>1487</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1488"></a>1488</td><td></td><td></td><td></td><td></td><td class="s">B&lt;WARNING&gt;: The signal subsystem is not at all portable.  We *may* offer</td></tr>
+<tr><td class="h"><a name="1489"></a>1489</td><td></td><td></td><td></td><td></td><td class="s">to simulate C&lt;TERM&gt; and C&lt;KILL&gt; on some operating systems, submit code</td></tr>
+<tr><td class="h"><a name="1490"></a>1490</td><td></td><td></td><td></td><td></td><td class="s">to me if you want this.</td></tr>
+<tr><td class="h"><a name="1491"></a>1491</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1492"></a>1492</td><td></td><td></td><td></td><td></td><td class="s">B&lt;WARNING 2&gt;: Up to and including perl v5.6.1, doing almost anything in a</td></tr>
+<tr><td class="h"><a name="1493"></a>1493</td><td></td><td></td><td></td><td></td><td class="s">signal handler could be dangerous.  The most safe code avoids all</td></tr>
+<tr><td class="h"><a name="1494"></a>1494</td><td></td><td></td><td></td><td></td><td class="s">mallocs and system calls, usually by preallocating a flag before</td></tr>
+<tr><td class="h"><a name="1495"></a>1495</td><td></td><td></td><td></td><td></td><td class="s">entering the signal handler, altering the flag's value in the</td></tr>
+<tr><td class="h"><a name="1496"></a>1496</td><td></td><td></td><td></td><td></td><td class="s">handler, and responding to the changed value in the main system:</td></tr>
+<tr><td class="h"><a name="1497"></a>1497</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1498"></a>1498</td><td></td><td></td><td></td><td></td><td class="s">   my $got_usr1 = 0;</td></tr>
+<tr><td class="h"><a name="1499"></a>1499</td><td></td><td></td><td></td><td></td><td class="s">   sub usr1_handler { ++$got_signal }</td></tr>
+<tr><td class="h"><a name="1500"></a>1500</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1501"></a>1501</td><td></td><td></td><td></td><td></td><td class="s">   $SIG{USR1} = \&amp;usr1_handler;</td></tr>
+<tr><td class="h"><a name="1502"></a>1502</td><td></td><td></td><td></td><td></td><td class="s">   while () { sleep 1; print &quot;GOT IT&quot; while $got_usr1--; }</td></tr>
+<tr><td class="h"><a name="1503"></a>1503</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1504"></a>1504</td><td></td><td></td><td></td><td></td><td class="s">Even this approach is perilous if ++ and -- aren't atomic on your system</td></tr>
+<tr><td class="h"><a name="1505"></a>1505</td><td></td><td></td><td></td><td></td><td class="s">(I've never heard of this on any modern CPU large enough to run perl).</td></tr>
+<tr><td class="h"><a name="1506"></a>1506</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1507"></a>1507</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="1508"></a>1508</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1509"></a>1509</td><td></td><td></td><td></td><td></td><td class="s">sub signal {</td></tr>
+<tr><td class="h"><a name="1510"></a>1510</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="1511"></a>1511</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1512"></a>1512</td><td></td><td></td><td></td><td></td><td class="s">   local $cur_self = $self;</td></tr>
+<tr><td class="h"><a name="1513"></a>1513</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1514"></a>1514</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;_kill_kill_kill_pussycat_kill unless @_;</td></tr>
+<tr><td class="h"><a name="1515"></a>1515</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1516"></a>1516</td><td></td><td></td><td></td><td></td><td class="s">   Carp::cluck &quot;Ignoring extra parameters passed to kill()&quot; if @_ &gt; 1;</td></tr>
+<tr><td class="h"><a name="1517"></a>1517</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1518"></a>1518</td><td></td><td></td><td></td><td></td><td class="s">   my ( $signal ) = @_;</td></tr>
+<tr><td class="h"><a name="1519"></a>1519</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;Undefined signal passed to signal&quot; unless defined $signal;</td></tr>
+<tr><td class="h"><a name="1520"></a>1520</td><td></td><td></td><td></td><td></td><td class="s">   for ( grep $_-&gt;{PID} &amp;&amp; ! defined $_-&gt;{RESULT}, @{$self-&gt;{KIDS}} ) {</td></tr>
+<tr><td class="h"><a name="1521"></a>1521</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;sending $signal to $_-&gt;{PID}&quot;</td></tr>
+<tr><td class="h"><a name="1522"></a>1522</td><td></td><td></td><td></td><td></td><td class="s">         if _debugging;</td></tr>
+<tr><td class="h"><a name="1523"></a>1523</td><td></td><td></td><td></td><td></td><td class="s">      kill $signal, $_-&gt;{PID}</td></tr>
+<tr><td class="h"><a name="1524"></a>1524</td><td></td><td></td><td></td><td></td><td class="s">         or _debugging &amp;&amp; _debug &quot;$! sending $signal to $_-&gt;{PID}&quot;;</td></tr>
+<tr><td class="h"><a name="1525"></a>1525</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1526"></a>1526</td><td></td><td></td><td></td><td></td><td class="s">   </td></tr>
+<tr><td class="h"><a name="1527"></a>1527</td><td></td><td></td><td></td><td></td><td class="s">   return;</td></tr>
+<tr><td class="h"><a name="1528"></a>1528</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1529"></a>1529</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1530"></a>1530</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="1531"></a>1531</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1532"></a>1532</td><td></td><td></td><td></td><td></td><td class="s">=item kill_kill</td></tr>
+<tr><td class="h"><a name="1533"></a>1533</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1534"></a>1534</td><td></td><td></td><td></td><td></td><td class="s">   ## To kill off a process:</td></tr>
+<tr><td class="h"><a name="1535"></a>1535</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;kill_kill;</td></tr>
+<tr><td class="h"><a name="1536"></a>1536</td><td></td><td></td><td></td><td></td><td class="s">   kill_kill $h;</td></tr>
+<tr><td class="h"><a name="1537"></a>1537</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1538"></a>1538</td><td></td><td></td><td></td><td></td><td class="s">   ## To specify the grace period other than 30 seconds:</td></tr>
+<tr><td class="h"><a name="1539"></a>1539</td><td></td><td></td><td></td><td></td><td class="s">   kill_kill $h, grace =&gt; 5;</td></tr>
+<tr><td class="h"><a name="1540"></a>1540</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1541"></a>1541</td><td></td><td></td><td></td><td></td><td class="s">   ## To send QUIT instead of KILL if a process refuses to die:</td></tr>
+<tr><td class="h"><a name="1542"></a>1542</td><td></td><td></td><td></td><td></td><td class="s">   kill_kill $h, coup_d_grace =&gt; &quot;QUIT&quot;;</td></tr>
+<tr><td class="h"><a name="1543"></a>1543</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1544"></a>1544</td><td></td><td></td><td></td><td></td><td class="s">Sends a C&lt;TERM&gt;, waits for all children to exit for up to 30 seconds, then</td></tr>
+<tr><td class="h"><a name="1545"></a>1545</td><td></td><td></td><td></td><td></td><td class="s">sends a C&lt;KILL&gt; to any that survived the C&lt;TERM&gt;.</td></tr>
+<tr><td class="h"><a name="1546"></a>1546</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1547"></a>1547</td><td></td><td></td><td></td><td></td><td class="s">Will wait for up to 30 more seconds for the OS to successfully C&lt;KILL&gt; the</td></tr>
+<tr><td class="h"><a name="1548"></a>1548</td><td></td><td></td><td></td><td></td><td class="s">processes.</td></tr>
+<tr><td class="h"><a name="1549"></a>1549</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1550"></a>1550</td><td></td><td></td><td></td><td></td><td class="s">The 30 seconds may be overridden by setting the C&lt;grace&gt; option, this</td></tr>
+<tr><td class="h"><a name="1551"></a>1551</td><td></td><td></td><td></td><td></td><td class="s">overrides both timers.</td></tr>
+<tr><td class="h"><a name="1552"></a>1552</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1553"></a>1553</td><td></td><td></td><td></td><td></td><td class="s">The harness is then cleaned up.</td></tr>
+<tr><td class="h"><a name="1554"></a>1554</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1555"></a>1555</td><td></td><td></td><td></td><td></td><td class="s">The doubled name indicates that this function may kill again and avoids</td></tr>
+<tr><td class="h"><a name="1556"></a>1556</td><td></td><td></td><td></td><td></td><td class="s">colliding with the core Perl C&lt;kill&gt; function.</td></tr>
+<tr><td class="h"><a name="1557"></a>1557</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1558"></a>1558</td><td></td><td></td><td></td><td></td><td class="s">Returns a 1 if the C&lt;TERM&gt; was sufficient, or a 0 if C&lt;KILL&gt; was </td></tr>
+<tr><td class="h"><a name="1559"></a>1559</td><td></td><td></td><td></td><td></td><td class="s">required.  Throws an exception if C&lt;KILL&gt; did not permit the children</td></tr>
+<tr><td class="h"><a name="1560"></a>1560</td><td></td><td></td><td></td><td></td><td class="s">to be reaped.</td></tr>
+<tr><td class="h"><a name="1561"></a>1561</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1562"></a>1562</td><td></td><td></td><td></td><td></td><td class="s">B&lt;NOTE&gt;: The grace period is actually up to 1 second longer than that</td></tr>
+<tr><td class="h"><a name="1563"></a>1563</td><td></td><td></td><td></td><td></td><td class="s">given.  This is because the granularity of C&lt;time&gt; is 1 second.  Let me</td></tr>
+<tr><td class="h"><a name="1564"></a>1564</td><td></td><td></td><td></td><td></td><td class="s">know if you need finer granularity, we can leverage Time::HiRes here.</td></tr>
+<tr><td class="h"><a name="1565"></a>1565</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1566"></a>1566</td><td></td><td></td><td></td><td></td><td class="s">B&lt;Win32&gt;: Win32 does not know how to send real signals, so C&lt;TERM&gt; is</td></tr>
+<tr><td class="h"><a name="1567"></a>1567</td><td></td><td></td><td></td><td></td><td class="s">a full-force kill on Win32.  Thus all talk of grace periods, etc. do</td></tr>
+<tr><td class="h"><a name="1568"></a>1568</td><td></td><td></td><td></td><td></td><td class="s">not apply to Win32.</td></tr>
+<tr><td class="h"><a name="1569"></a>1569</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1570"></a>1570</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="1571"></a>1571</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1572"></a>1572</td><td></td><td></td><td></td><td></td><td class="s">sub kill_kill {</td></tr>
+<tr><td class="h"><a name="1573"></a>1573</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="1574"></a>1574</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1575"></a>1575</td><td></td><td></td><td></td><td></td><td class="s">   my %options = @_;</td></tr>
+<tr><td class="h"><a name="1576"></a>1576</td><td></td><td></td><td></td><td></td><td class="s">   my $grace = $options{grace};</td></tr>
+<tr><td class="h"><a name="1577"></a>1577</td><td></td><td></td><td></td><td></td><td class="s">   $grace = 30 unless defined $grace;</td></tr>
+<tr><td class="h"><a name="1578"></a>1578</td><td></td><td></td><td></td><td></td><td class="s">   ++$grace; ## Make grace time a _minimum_</td></tr>
+<tr><td class="h"><a name="1579"></a>1579</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1580"></a>1580</td><td></td><td></td><td></td><td></td><td class="s">   my $coup_d_grace = $options{coup_d_grace};</td></tr>
+<tr><td class="h"><a name="1581"></a>1581</td><td></td><td></td><td></td><td></td><td class="s">   $coup_d_grace = &quot;KILL&quot; unless defined $coup_d_grace;</td></tr>
+<tr><td class="h"><a name="1582"></a>1582</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1583"></a>1583</td><td></td><td></td><td></td><td></td><td class="s">   delete $options{$_} for qw( grace coup_d_grace );</td></tr>
+<tr><td class="h"><a name="1584"></a>1584</td><td></td><td></td><td></td><td></td><td class="s">   Carp::cluck &quot;Ignoring unknown options for kill_kill: &quot;,</td></tr>
+<tr><td class="h"><a name="1585"></a>1585</td><td></td><td></td><td></td><td></td><td class="s">       join &quot; &quot;,keys %options</td></tr>
+<tr><td class="h"><a name="1586"></a>1586</td><td></td><td></td><td></td><td></td><td class="s">       if keys %options;</td></tr>
+<tr><td class="h"><a name="1587"></a>1587</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1588"></a>1588</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;signal( &quot;TERM&quot; );</td></tr>
+<tr><td class="h"><a name="1589"></a>1589</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1590"></a>1590</td><td></td><td></td><td></td><td></td><td class="s">   my $quitting_time = time + $grace;</td></tr>
+<tr><td class="h"><a name="1591"></a>1591</td><td></td><td></td><td></td><td></td><td class="s">   my $delay = 0.01;</td></tr>
+<tr><td class="h"><a name="1592"></a>1592</td><td></td><td></td><td></td><td></td><td class="s">   my $accum_delay;</td></tr>
+<tr><td class="h"><a name="1593"></a>1593</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1594"></a>1594</td><td></td><td></td><td></td><td></td><td class="s">   my $have_killed_before;</td></tr>
+<tr><td class="h"><a name="1595"></a>1595</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1596"></a>1596</td><td></td><td></td><td></td><td></td><td class="s">   while () {</td></tr>
+<tr><td class="h"><a name="1597"></a>1597</td><td></td><td></td><td></td><td></td><td class="s">      ## delay first to yeild to other processes</td></tr>
+<tr><td class="h"><a name="1598"></a>1598</td><td></td><td></td><td></td><td></td><td class="s">      select undef, undef, undef, $delay;</td></tr>
+<tr><td class="h"><a name="1599"></a>1599</td><td></td><td></td><td></td><td></td><td class="s">      $accum_delay += $delay;</td></tr>
+<tr><td class="h"><a name="1600"></a>1600</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1601"></a>1601</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;reap_nb;</td></tr>
+<tr><td class="h"><a name="1602"></a>1602</td><td></td><td></td><td></td><td></td><td class="s">      last unless $self-&gt;_running_kids;</td></tr>
+<tr><td class="h"><a name="1603"></a>1603</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1604"></a>1604</td><td></td><td></td><td></td><td></td><td class="s">      if ( $accum_delay &gt;= $grace*0.8 ) {</td></tr>
+<tr><td class="h"><a name="1605"></a>1605</td><td></td><td></td><td></td><td></td><td class="s">         ## No point in checking until delay has grown some.</td></tr>
+<tr><td class="h"><a name="1606"></a>1606</td><td></td><td></td><td></td><td></td><td class="s">         if ( time &gt;= $quitting_time ) {</td></tr>
+<tr><td class="h"><a name="1607"></a>1607</td><td></td><td></td><td></td><td></td><td class="s">            if ( ! $have_killed_before ) {</td></tr>
+<tr><td class="h"><a name="1608"></a>1608</td><td></td><td></td><td></td><td></td><td class="s">               $self-&gt;signal( $coup_d_grace );</td></tr>
+<tr><td class="h"><a name="1609"></a>1609</td><td></td><td></td><td></td><td></td><td class="s">               $have_killed_before = 1;</td></tr>
+<tr><td class="h"><a name="1610"></a>1610</td><td></td><td></td><td></td><td></td><td class="s">               $quitting_time += $grace;</td></tr>
+<tr><td class="h"><a name="1611"></a>1611</td><td></td><td></td><td></td><td></td><td class="s">               $delay = 0.01;</td></tr>
+<tr><td class="h"><a name="1612"></a>1612</td><td></td><td></td><td></td><td></td><td class="s">               $accum_delay = 0;</td></tr>
+<tr><td class="h"><a name="1613"></a>1613</td><td></td><td></td><td></td><td></td><td class="s">               next;</td></tr>
+<tr><td class="h"><a name="1614"></a>1614</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="1615"></a>1615</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;Unable to reap all children, even after KILLing them&quot;</td></tr>
+<tr><td class="h"><a name="1616"></a>1616</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1617"></a>1617</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="1618"></a>1618</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1619"></a>1619</td><td></td><td></td><td></td><td></td><td class="s">      $delay *= 2;</td></tr>
+<tr><td class="h"><a name="1620"></a>1620</td><td></td><td></td><td></td><td></td><td class="s">      $delay = 0.5 if $delay &gt;= 0.5;</td></tr>
+<tr><td class="h"><a name="1621"></a>1621</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1622"></a>1622</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1623"></a>1623</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;_cleanup;</td></tr>
+<tr><td class="h"><a name="1624"></a>1624</td><td></td><td></td><td></td><td></td><td class="s">   return $have_killed_before;</td></tr>
+<tr><td class="h"><a name="1625"></a>1625</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="1626"></a>1626</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1627"></a>1627</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="1628"></a>1628</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1629"></a>1629</td><td></td><td></td><td></td><td></td><td class="s">=item harness</td></tr>
+<tr><td class="h"><a name="1630"></a>1630</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1631"></a>1631</td><td></td><td></td><td></td><td></td><td class="s">Takes a harness specification and returns a harness.  This harness is</td></tr>
+<tr><td class="h"><a name="1632"></a>1632</td><td></td><td></td><td></td><td></td><td class="s">blessed in to IPC::Run, allowing you to use method call syntax for</td></tr>
+<tr><td class="h"><a name="1633"></a>1633</td><td></td><td></td><td></td><td></td><td class="s">run(), start(), et al if you like.</td></tr>
+<tr><td class="h"><a name="1634"></a>1634</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1635"></a>1635</td><td></td><td></td><td></td><td></td><td class="s">harness() is provided so that you can pre-build harnesses if you</td></tr>
+<tr><td class="h"><a name="1636"></a>1636</td><td></td><td></td><td></td><td></td><td class="s">would like to, but it's not required..</td></tr>
+<tr><td class="h"><a name="1637"></a>1637</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1638"></a>1638</td><td></td><td></td><td></td><td></td><td class="s">You may proceed to run(), start() or pump() after calling harness() (pump()</td></tr>
+<tr><td class="h"><a name="1639"></a>1639</td><td></td><td></td><td></td><td></td><td class="s">calls start() if need be).  Alternatively, you may pass your</td></tr>
+<tr><td class="h"><a name="1640"></a>1640</td><td></td><td></td><td></td><td></td><td class="s">harness specification to run() or start() and let them harness() for</td></tr>
+<tr><td class="h"><a name="1641"></a>1641</td><td></td><td></td><td></td><td></td><td class="s">you.  You can't pass harness specifications to pump(), though.</td></tr>
+<tr><td class="h"><a name="1642"></a>1642</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1643"></a>1643</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="1644"></a>1644</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1645"></a>1645</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1646"></a>1646</td><td></td><td></td><td></td><td></td><td class="s">## Notes: I've avoided handling a scalar that doesn't look like an</td></tr>
+<tr><td class="h"><a name="1647"></a>1647</td><td></td><td></td><td></td><td></td><td class="s">## opcode as a here document or as a filename, though I could DWIM</td></tr>
+<tr><td class="h"><a name="1648"></a>1648</td><td></td><td></td><td></td><td></td><td class="s">## those.  I'm not sure that the advantages outweight the danger when</td></tr>
+<tr><td class="h"><a name="1649"></a>1649</td><td></td><td></td><td></td><td></td><td class="s">## the DWIMer guesses wrong.</td></tr>
+<tr><td class="h"><a name="1650"></a>1650</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1651"></a>1651</td><td></td><td></td><td></td><td></td><td class="s">## TODO: allow user to spec default shell. Hmm, globally, in the</td></tr>
+<tr><td class="h"><a name="1652"></a>1652</td><td></td><td></td><td></td><td></td><td class="s">## lexical scope hash, or per instance?  'Course they can do that</td></tr>
+<tr><td class="h"><a name="1653"></a>1653</td><td></td><td></td><td></td><td></td><td class="s">## now by using a [...] to hold the command.</td></tr>
+<tr><td class="h"><a name="1654"></a>1654</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="1655"></a>1655</td><td class="c3">1</td><td class="c3"><span title="Avg 300ns">300ns</span></td><td></td><td></td><td class="s">my $harness_id = 0;</td></tr>
+<tr><td class="h"><a name="1656"></a>1656</td><td></td><td></td><td></td><td></td><td class="s">sub harness {</td></tr>
+<tr><td class="h"><a name="1657"></a>1657</td><td></td><td></td><td></td><td></td><td class="s">   my $options;</td></tr>
+<tr><td class="h"><a name="1658"></a>1658</td><td></td><td></td><td></td><td></td><td class="s">   if ( @_ &amp;&amp; ref $_[-1] eq 'HASH' ) {</td></tr>
+<tr><td class="h"><a name="1659"></a>1659</td><td></td><td></td><td></td><td></td><td class="s">      $options = pop;</td></tr>
+<tr><td class="h"><a name="1660"></a>1660</td><td></td><td></td><td></td><td></td><td class="s">      require Data::Dumper;</td></tr>
+<tr><td class="h"><a name="1661"></a>1661</td><td></td><td></td><td></td><td></td><td class="s">      carp &quot;Passing in options as a hash is deprecated:\n&quot;, Data::Dumper::Dumper( $options );</td></tr>
+<tr><td class="h"><a name="1662"></a>1662</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1663"></a>1663</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1664"></a>1664</td><td></td><td></td><td></td><td></td><td class="s">#   local $IPC::Run::debug = $options-&gt;{debug}</td></tr>
+<tr><td class="h"><a name="1665"></a>1665</td><td></td><td></td><td></td><td></td><td class="s">#      if $options &amp;&amp; defined $options-&gt;{debug};</td></tr>
+<tr><td class="h"><a name="1666"></a>1666</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1667"></a>1667</td><td></td><td></td><td></td><td></td><td class="s">   my @args;</td></tr>
+<tr><td class="h"><a name="1668"></a>1668</td><td></td><td></td><td></td><td></td><td class="s">   if ( @_ == 1 &amp;&amp; ! ref $_[0] ) {</td></tr>
+<tr><td class="h"><a name="1669"></a>1669</td><td></td><td></td><td></td><td></td><td class="s">      if ( Win32_MODE ) {</td></tr>
+<tr><td class="h"><a name="1670"></a>1670</td><td></td><td></td><td></td><td></td><td class="s">         my $command = $ENV{ComSpec} || 'cmd';</td></tr>
+<tr><td class="h"><a name="1671"></a>1671</td><td></td><td></td><td></td><td></td><td class="s">         @args = ( [ $command, '/c', win32_parse_cmd_line $_[0] ] );</td></tr>
+<tr><td class="h"><a name="1672"></a>1672</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="1673"></a>1673</td><td></td><td></td><td></td><td></td><td class="s">      else {</td></tr>
+<tr><td class="h"><a name="1674"></a>1674</td><td></td><td></td><td></td><td></td><td class="s">         @args = ( [ qw( sh -c ), @_ ] );</td></tr>
+<tr><td class="h"><a name="1675"></a>1675</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="1676"></a>1676</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1677"></a>1677</td><td></td><td></td><td></td><td></td><td class="s">   elsif ( @_ &gt; 1 &amp;&amp; ! grep ref $_, @_ ) {</td></tr>
+<tr><td class="h"><a name="1678"></a>1678</td><td></td><td></td><td></td><td></td><td class="s">      @args = ( [ @_ ] );</td></tr>
+<tr><td class="h"><a name="1679"></a>1679</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1680"></a>1680</td><td></td><td></td><td></td><td></td><td class="s">   else {</td></tr>
+<tr><td class="h"><a name="1681"></a>1681</td><td></td><td></td><td></td><td></td><td class="s">      @args = @_;</td></tr>
+<tr><td class="h"><a name="1682"></a>1682</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1683"></a>1683</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1684"></a>1684</td><td></td><td></td><td></td><td></td><td class="s">   my @errs;               # Accum errors, emit them when done.</td></tr>
+<tr><td class="h"><a name="1685"></a>1685</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1686"></a>1686</td><td></td><td></td><td></td><td></td><td class="s">   my $succinct;           # set if no redir ops are required yet.  Cleared</td></tr>
+<tr><td class="h"><a name="1687"></a>1687</td><td></td><td></td><td></td><td></td><td class="s">                            # if an op is seen.</td></tr>
+<tr><td class="h"><a name="1688"></a>1688</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1689"></a>1689</td><td></td><td></td><td></td><td></td><td class="s">   my $cur_kid;            # references kid or handle being parsed</td></tr>
+<tr><td class="h"><a name="1690"></a>1690</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1691"></a>1691</td><td></td><td></td><td></td><td></td><td class="s">   my $assumed_fd    = 0;  # fd to assume in succinct mode (no redir ops)</td></tr>
+<tr><td class="h"><a name="1692"></a>1692</td><td></td><td></td><td></td><td></td><td class="s">   my $handle_num    = 0;  # 1... is which handle we're parsing</td></tr>
+<tr><td class="h"><a name="1693"></a>1693</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1694"></a>1694</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = bless {}, __PACKAGE__;</td></tr>
+<tr><td class="h"><a name="1695"></a>1695</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1696"></a>1696</td><td></td><td></td><td></td><td></td><td class="s">   local $cur_self = $self;</td></tr>
+<tr><td class="h"><a name="1697"></a>1697</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1698"></a>1698</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{ID}    = ++$harness_id;</td></tr>
+<tr><td class="h"><a name="1699"></a>1699</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{IOS}   = [];</td></tr>
+<tr><td class="h"><a name="1700"></a>1700</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{KIDS}  = [];</td></tr>
+<tr><td class="h"><a name="1701"></a>1701</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{PIPES} = [];</td></tr>
+<tr><td class="h"><a name="1702"></a>1702</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{PTYS}  = {};</td></tr>
+<tr><td class="h"><a name="1703"></a>1703</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{STATE} = _newed;</td></tr>
+<tr><td class="h"><a name="1704"></a>1704</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1705"></a>1705</td><td></td><td></td><td></td><td></td><td class="s">   if ( $options ) {</td></tr>
+<tr><td class="h"><a name="1706"></a>1706</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;{$_} = $options-&gt;{$_}</td></tr>
+<tr><td class="h"><a name="1707"></a>1707</td><td></td><td></td><td></td><td></td><td class="s">         for keys %$options;</td></tr>
+<tr><td class="h"><a name="1708"></a>1708</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="1709"></a>1709</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1710"></a>1710</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;****** harnessing *****&quot; if _debugging;</td></tr>
+<tr><td class="h"><a name="1711"></a>1711</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1712"></a>1712</td><td></td><td></td><td></td><td></td><td class="s">   my $first_parse;</td></tr>
+<tr><td class="h"><a name="1713"></a>1713</td><td></td><td></td><td></td><td></td><td class="s">   local $_;</td></tr>
+<tr><td class="h"><a name="1714"></a>1714</td><td></td><td></td><td></td><td></td><td class="s">   my $arg_count = @args;</td></tr>
+<tr><td class="h"><a name="1715"></a>1715</td><td></td><td></td><td></td><td></td><td class="s">   while ( @args ) { for ( shift @args ) {</td></tr>
+<tr><td class="h"><a name="1716"></a>1716</td><td></td><td></td><td></td><td></td><td class="s">      eval {</td></tr>
+<tr><td class="h"><a name="1717"></a>1717</td><td></td><td></td><td></td><td></td><td class="s">         $first_parse = 1;</td></tr>
+<tr><td class="h"><a name="1718"></a>1718</td><td></td><td></td><td></td><td></td><td class="s">         _debug(</td></tr>
+<tr><td class="h"><a name="1719"></a>1719</td><td></td><td></td><td></td><td></td><td class="s">            &quot;parsing &quot;,</td></tr>
+<tr><td class="h"><a name="1720"></a>1720</td><td></td><td></td><td></td><td></td><td class="s">            defined $_</td></tr>
+<tr><td class="h"><a name="1721"></a>1721</td><td></td><td></td><td></td><td></td><td class="s">               ? ref $_ eq 'ARRAY'</td></tr>
+<tr><td class="h"><a name="1722"></a>1722</td><td></td><td></td><td></td><td></td><td class="s">                  ? ( '[ ', join( ', ', map &quot;'$_'&quot;, @$_ ), ' ]' )</td></tr>
+<tr><td class="h"><a name="1723"></a>1723</td><td></td><td></td><td></td><td></td><td class="s">                  : ( ref $_</td></tr>
+<tr><td class="h"><a name="1724"></a>1724</td><td></td><td></td><td></td><td></td><td class="s">                     || ( length $_ &lt; 50</td></tr>
+<tr><td class="h"><a name="1725"></a>1725</td><td></td><td></td><td></td><td></td><td class="s">                           ? &quot;'$_'&quot;</td></tr>
+<tr><td class="h"><a name="1726"></a>1726</td><td></td><td></td><td></td><td></td><td class="s">                           : join( '', &quot;'&quot;, substr( $_, 0, 10 ), &quot;...'&quot; )</td></tr>
+<tr><td class="h"><a name="1727"></a>1727</td><td></td><td></td><td></td><td></td><td class="s">                        )</td></tr>
+<tr><td class="h"><a name="1728"></a>1728</td><td></td><td></td><td></td><td></td><td class="s">                  )</td></tr>
+<tr><td class="h"><a name="1729"></a>1729</td><td></td><td></td><td></td><td></td><td class="s">               : '&lt;undef&gt;'</td></tr>
+<tr><td class="h"><a name="1730"></a>1730</td><td></td><td></td><td></td><td></td><td class="s">         ) if _debugging;</td></tr>
+<tr><td class="h"><a name="1731"></a>1731</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1732"></a>1732</td><td></td><td></td><td></td><td></td><td class="s">      REPARSE:</td></tr>
+<tr><td class="h"><a name="1733"></a>1733</td><td></td><td></td><td></td><td></td><td class="s">         if ( ref eq 'ARRAY' || ( ! $cur_kid &amp;&amp; ref eq 'CODE' ) ) {</td></tr>
+<tr><td class="h"><a name="1734"></a>1734</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;Process control symbol ('|', '&amp;') missing&quot; if $cur_kid;</td></tr>
+<tr><td class="h"><a name="1735"></a>1735</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;Can't spawn a subroutine on Win32&quot;</td></tr>
+<tr><td class="h"><a name="1736"></a>1736</td><td></td><td></td><td></td><td></td><td class="s">               if Win32_MODE &amp;&amp; ref eq &quot;CODE&quot;;</td></tr>
+<tr><td class="h"><a name="1737"></a>1737</td><td></td><td></td><td></td><td></td><td class="s">            $cur_kid = {</td></tr>
+<tr><td class="h"><a name="1738"></a>1738</td><td></td><td></td><td></td><td></td><td class="s">               TYPE   =&gt; 'cmd',</td></tr>
+<tr><td class="h"><a name="1739"></a>1739</td><td></td><td></td><td></td><td></td><td class="s">               VAL    =&gt; $_,</td></tr>
+<tr><td class="h"><a name="1740"></a>1740</td><td></td><td></td><td></td><td></td><td class="s">               NUM    =&gt; @{$self-&gt;{KIDS}} + 1,</td></tr>
+<tr><td class="h"><a name="1741"></a>1741</td><td></td><td></td><td></td><td></td><td class="s">               OPS    =&gt; [],</td></tr>
+<tr><td class="h"><a name="1742"></a>1742</td><td></td><td></td><td></td><td></td><td class="s">               PID    =&gt; '',</td></tr>
+<tr><td class="h"><a name="1743"></a>1743</td><td></td><td></td><td></td><td></td><td class="s">               RESULT =&gt; undef,</td></tr>
+<tr><td class="h"><a name="1744"></a>1744</td><td></td><td></td><td></td><td></td><td class="s">            };</td></tr>
+<tr><td class="h"><a name="1745"></a>1745</td><td></td><td></td><td></td><td></td><td class="s">            push @{$self-&gt;{KIDS}}, $cur_kid;</td></tr>
+<tr><td class="h"><a name="1746"></a>1746</td><td></td><td></td><td></td><td></td><td class="s">            $succinct = 1;</td></tr>
+<tr><td class="h"><a name="1747"></a>1747</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1748"></a>1748</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1749"></a>1749</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( UNIVERSAL::isa( $_, 'IPC::Run::IO' ) ) {</td></tr>
+<tr><td class="h"><a name="1750"></a>1750</td><td></td><td></td><td></td><td></td><td class="s">            push @{$self-&gt;{IOS}}, $_;</td></tr>
+<tr><td class="h"><a name="1751"></a>1751</td><td></td><td></td><td></td><td></td><td class="s">            $cur_kid = undef;</td></tr>
+<tr><td class="h"><a name="1752"></a>1752</td><td></td><td></td><td></td><td></td><td class="s">            $succinct = 1;</td></tr>
+<tr><td class="h"><a name="1753"></a>1753</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1754"></a>1754</td><td></td><td></td><td></td><td></td><td class="s">         </td></tr>
+<tr><td class="h"><a name="1755"></a>1755</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( UNIVERSAL::isa( $_, 'IPC::Run::Timer' ) ) {</td></tr>
+<tr><td class="h"><a name="1756"></a>1756</td><td></td><td></td><td></td><td></td><td class="s">            push @{$self-&gt;{TIMERS}}, $_;</td></tr>
+<tr><td class="h"><a name="1757"></a>1757</td><td></td><td></td><td></td><td></td><td class="s">            $cur_kid = undef;</td></tr>
+<tr><td class="h"><a name="1758"></a>1758</td><td></td><td></td><td></td><td></td><td class="s">            $succinct = 1;</td></tr>
+<tr><td class="h"><a name="1759"></a>1759</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1760"></a>1760</td><td></td><td></td><td></td><td></td><td class="s">         </td></tr>
+<tr><td class="h"><a name="1761"></a>1761</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( /^(\d*)&gt;&amp;(\d+)$/ ) {</td></tr>
+<tr><td class="h"><a name="1762"></a>1762</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;No command before '$_'&quot; unless $cur_kid;</td></tr>
+<tr><td class="h"><a name="1763"></a>1763</td><td></td><td></td><td></td><td></td><td class="s">            push @{$cur_kid-&gt;{OPS}}, {</td></tr>
+<tr><td class="h"><a name="1764"></a>1764</td><td></td><td></td><td></td><td></td><td class="s">               TYPE =&gt; 'dup',</td></tr>
+<tr><td class="h"><a name="1765"></a>1765</td><td></td><td></td><td></td><td></td><td class="s">               KFD1 =&gt; $2,</td></tr>
+<tr><td class="h"><a name="1766"></a>1766</td><td></td><td></td><td></td><td></td><td class="s">               KFD2 =&gt; length $1 ? $1 : 1,</td></tr>
+<tr><td class="h"><a name="1767"></a>1767</td><td></td><td></td><td></td><td></td><td class="s">            };</td></tr>
+<tr><td class="h"><a name="1768"></a>1768</td><td></td><td></td><td></td><td></td><td class="s">            _debug &quot;redirect operators now required&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1769"></a>1769</td><td></td><td></td><td></td><td></td><td class="s">            $succinct = ! $first_parse;</td></tr>
+<tr><td class="h"><a name="1770"></a>1770</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1771"></a>1771</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1772"></a>1772</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( /^(\d*)&lt;&amp;(\d+)$/ ) {</td></tr>
+<tr><td class="h"><a name="1773"></a>1773</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;No command before '$_'&quot; unless $cur_kid;</td></tr>
+<tr><td class="h"><a name="1774"></a>1774</td><td></td><td></td><td></td><td></td><td class="s">            push @{$cur_kid-&gt;{OPS}}, {</td></tr>
+<tr><td class="h"><a name="1775"></a>1775</td><td></td><td></td><td></td><td></td><td class="s">               TYPE =&gt; 'dup',</td></tr>
+<tr><td class="h"><a name="1776"></a>1776</td><td></td><td></td><td></td><td></td><td class="s">               KFD1 =&gt; $2,</td></tr>
+<tr><td class="h"><a name="1777"></a>1777</td><td></td><td></td><td></td><td></td><td class="s">               KFD2 =&gt; length $1 ? $1 : 0,</td></tr>
+<tr><td class="h"><a name="1778"></a>1778</td><td></td><td></td><td></td><td></td><td class="s">            };</td></tr>
+<tr><td class="h"><a name="1779"></a>1779</td><td></td><td></td><td></td><td></td><td class="s">            $succinct = ! $first_parse;</td></tr>
+<tr><td class="h"><a name="1780"></a>1780</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1781"></a>1781</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1782"></a>1782</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( /^(\d*)&lt;&amp;-$/ ) {</td></tr>
+<tr><td class="h"><a name="1783"></a>1783</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;No command before '$_'&quot; unless $cur_kid;</td></tr>
+<tr><td class="h"><a name="1784"></a>1784</td><td></td><td></td><td></td><td></td><td class="s">            push @{$cur_kid-&gt;{OPS}}, {</td></tr>
+<tr><td class="h"><a name="1785"></a>1785</td><td></td><td></td><td></td><td></td><td class="s">               TYPE =&gt; 'close',</td></tr>
+<tr><td class="h"><a name="1786"></a>1786</td><td></td><td></td><td></td><td></td><td class="s">               KFD  =&gt; length $1 ? $1 : 0,</td></tr>
+<tr><td class="h"><a name="1787"></a>1787</td><td></td><td></td><td></td><td></td><td class="s">            };</td></tr>
+<tr><td class="h"><a name="1788"></a>1788</td><td></td><td></td><td></td><td></td><td class="s">            $succinct = ! $first_parse;</td></tr>
+<tr><td class="h"><a name="1789"></a>1789</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1790"></a>1790</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1791"></a>1791</td><td></td><td></td><td></td><td></td><td class="s">         elsif (</td></tr>
+<tr><td class="h"><a name="1792"></a>1792</td><td></td><td></td><td></td><td></td><td class="s">               /^(\d*) (&lt;pipe)()            ()  ()  $/x</td></tr>
+<tr><td class="h"><a name="1793"></a>1793</td><td></td><td></td><td></td><td></td><td class="s">            || /^(\d*) (&lt;pty) ((?:\s+\S+)?) (&lt;) ()  $/x</td></tr>
+<tr><td class="h"><a name="1794"></a>1794</td><td></td><td></td><td></td><td></td><td class="s">            || /^(\d*) (&lt;)    ()            ()  (.*)$/x</td></tr>
+<tr><td class="h"><a name="1795"></a>1795</td><td></td><td></td><td></td><td></td><td class="s">         ) {</td></tr>
+<tr><td class="h"><a name="1796"></a>1796</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;No command before '$_'&quot; unless $cur_kid;</td></tr>
+<tr><td class="h"><a name="1797"></a>1797</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1798"></a>1798</td><td></td><td></td><td></td><td></td><td class="s">            $succinct = ! $first_parse;</td></tr>
+<tr><td class="h"><a name="1799"></a>1799</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1800"></a>1800</td><td></td><td></td><td></td><td></td><td class="s">            my $type = $2 . $4;</td></tr>
+<tr><td class="h"><a name="1801"></a>1801</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1802"></a>1802</td><td></td><td></td><td></td><td></td><td class="s">            my $kfd = length $1 ? $1 : 0;</td></tr>
+<tr><td class="h"><a name="1803"></a>1803</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1804"></a>1804</td><td></td><td></td><td></td><td></td><td class="s">            my $pty_id;</td></tr>
+<tr><td class="h"><a name="1805"></a>1805</td><td></td><td></td><td></td><td></td><td class="s">            if ( $type eq '&lt;pty&lt;' ) {</td></tr>
+<tr><td class="h"><a name="1806"></a>1806</td><td></td><td></td><td></td><td></td><td class="s">               $pty_id = length $3 ? $3 : '0';</td></tr>
+<tr><td class="h"><a name="1807"></a>1807</td><td></td><td></td><td></td><td></td><td class="s">               ## do the require here to cause early error reporting</td></tr>
+<tr><td class="h"><a name="1808"></a>1808</td><td></td><td></td><td></td><td></td><td class="s">               require IO::Pty;</td></tr>
+<tr><td class="h"><a name="1809"></a>1809</td><td></td><td></td><td></td><td></td><td class="s">               ## Just flag the pyt's existence for now.  It'll be</td></tr>
+<tr><td class="h"><a name="1810"></a>1810</td><td></td><td></td><td></td><td></td><td class="s">               ## converted to a real IO::Pty by _open_pipes.</td></tr>
+<tr><td class="h"><a name="1811"></a>1811</td><td></td><td></td><td></td><td></td><td class="s">               $self-&gt;{PTYS}-&gt;{$pty_id} = undef;</td></tr>
+<tr><td class="h"><a name="1812"></a>1812</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="1813"></a>1813</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1814"></a>1814</td><td></td><td></td><td></td><td></td><td class="s">            my $source = $5;</td></tr>
+<tr><td class="h"><a name="1815"></a>1815</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1816"></a>1816</td><td></td><td></td><td></td><td></td><td class="s">            my @filters;</td></tr>
+<tr><td class="h"><a name="1817"></a>1817</td><td></td><td></td><td></td><td></td><td class="s">            my $binmode;</td></tr>
+<tr><td class="h"><a name="1818"></a>1818</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1819"></a>1819</td><td></td><td></td><td></td><td></td><td class="s">            unless ( length $source ) {</td></tr>
+<tr><td class="h"><a name="1820"></a>1820</td><td></td><td></td><td></td><td></td><td class="s">               if ( ! $succinct ) {</td></tr>
+<tr><td class="h"><a name="1821"></a>1821</td><td></td><td></td><td></td><td></td><td class="s">                  while ( @args &gt; 1</td></tr>
+<tr><td class="h"><a name="1822"></a>1822</td><td></td><td></td><td></td><td></td><td class="s">                      &amp;&amp; (</td></tr>
+<tr><td class="h"><a name="1823"></a>1823</td><td></td><td></td><td></td><td></td><td class="s">                         ( ref $args[1] &amp;&amp; ! UNIVERSAL::isa $args[1], &quot;IPC::Run::Timer&quot; )</td></tr>
+<tr><td class="h"><a name="1824"></a>1824</td><td></td><td></td><td></td><td></td><td class="s">                         || UNIVERSAL::isa $args[0], &quot;IPC::Run::binmode_pseudo_filter&quot;</td></tr>
+<tr><td class="h"><a name="1825"></a>1825</td><td></td><td></td><td></td><td></td><td class="s">                      )</td></tr>
+<tr><td class="h"><a name="1826"></a>1826</td><td></td><td></td><td></td><td></td><td class="s">                  ) {</td></tr>
+<tr><td class="h"><a name="1827"></a>1827</td><td></td><td></td><td></td><td></td><td class="s">                     if ( UNIVERSAL::isa $args[0], &quot;IPC::Run::binmode_pseudo_filter&quot; ) {</td></tr>
+<tr><td class="h"><a name="1828"></a>1828</td><td></td><td></td><td></td><td></td><td class="s">                        $binmode = shift( @args )-&gt;();</td></tr>
+<tr><td class="h"><a name="1829"></a>1829</td><td></td><td></td><td></td><td></td><td class="s">                     }</td></tr>
+<tr><td class="h"><a name="1830"></a>1830</td><td></td><td></td><td></td><td></td><td class="s">                     else {</td></tr>
+<tr><td class="h"><a name="1831"></a>1831</td><td></td><td></td><td></td><td></td><td class="s">                        push @filters, shift @args</td></tr>
+<tr><td class="h"><a name="1832"></a>1832</td><td></td><td></td><td></td><td></td><td class="s">                     }</td></tr>
+<tr><td class="h"><a name="1833"></a>1833</td><td></td><td></td><td></td><td></td><td class="s">                  }</td></tr>
+<tr><td class="h"><a name="1834"></a>1834</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="1835"></a>1835</td><td></td><td></td><td></td><td></td><td class="s">               $source = shift @args;</td></tr>
+<tr><td class="h"><a name="1836"></a>1836</td><td></td><td></td><td></td><td></td><td class="s">               croak &quot;'$_' missing a source&quot; if _empty $source;</td></tr>
+<tr><td class="h"><a name="1837"></a>1837</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1838"></a>1838</td><td></td><td></td><td></td><td></td><td class="s">               _debug(</td></tr>
+<tr><td class="h"><a name="1839"></a>1839</td><td></td><td></td><td></td><td></td><td class="s">                  'Kid ', $cur_kid-&gt;{NUM}, &quot;'s input fd &quot;, $kfd,</td></tr>
+<tr><td class="h"><a name="1840"></a>1840</td><td></td><td></td><td></td><td></td><td class="s">                  ' has ', scalar( @filters ), ' filters.'</td></tr>
+<tr><td class="h"><a name="1841"></a>1841</td><td></td><td></td><td></td><td></td><td class="s">               ) if _debugging_details &amp;&amp; @filters;</td></tr>
+<tr><td class="h"><a name="1842"></a>1842</td><td></td><td></td><td></td><td></td><td class="s">            };</td></tr>
+<tr><td class="h"><a name="1843"></a>1843</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1844"></a>1844</td><td></td><td></td><td></td><td></td><td class="s">            my IPC::Run::IO $pipe = IPC::Run::IO-&gt;_new_internal(</td></tr>
+<tr><td class="h"><a name="1845"></a>1845</td><td></td><td></td><td></td><td></td><td class="s">               $type, $kfd, $pty_id, $source, $binmode, @filters</td></tr>
+<tr><td class="h"><a name="1846"></a>1846</td><td></td><td></td><td></td><td></td><td class="s">            );</td></tr>
+<tr><td class="h"><a name="1847"></a>1847</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1848"></a>1848</td><td></td><td></td><td></td><td></td><td class="s">            if ( ( ref $source eq 'GLOB' || UNIVERSAL::isa $source, 'IO::Handle' )</td></tr>
+<tr><td class="h"><a name="1849"></a>1849</td><td></td><td></td><td></td><td></td><td class="s">               &amp;&amp; $type !~ /^&lt;p(ty&lt;|ipe)$/</td></tr>
+<tr><td class="h"><a name="1850"></a>1850</td><td></td><td></td><td></td><td></td><td class="s">            ) {</td></tr>
+<tr><td class="h"><a name="1851"></a>1851</td><td></td><td></td><td></td><td></td><td class="s">               _debug &quot;setting DONT_CLOSE&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1852"></a>1852</td><td></td><td></td><td></td><td></td><td class="s">               $pipe-&gt;{DONT_CLOSE} = 1; ## this FD is not closed by us.</td></tr>
+<tr><td class="h"><a name="1853"></a>1853</td><td></td><td></td><td></td><td></td><td class="s">               _dont_inherit( $source ) if Win32_MODE;</td></tr>
+<tr><td class="h"><a name="1854"></a>1854</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="1855"></a>1855</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1856"></a>1856</td><td></td><td></td><td></td><td></td><td class="s">            push @{$cur_kid-&gt;{OPS}}, $pipe;</td></tr>
+<tr><td class="h"><a name="1857"></a>1857</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="1858"></a>1858</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1859"></a>1859</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( /^()   (&gt;&gt;?)  (&amp;)     ()      (.*)$/x</td></tr>
+<tr><td class="h"><a name="1860"></a>1860</td><td></td><td></td><td></td><td></td><td class="s">            ||   /^()   (&amp;)    (&gt;pipe) ()      ()  $/x </td></tr>
+<tr><td class="h"><a name="1861"></a>1861</td><td></td><td></td><td></td><td></td><td class="s">            ||   /^()   (&gt;pipe)(&amp;)     ()      ()  $/x </td></tr>
+<tr><td class="h"><a name="1862"></a>1862</td><td></td><td></td><td></td><td></td><td class="s">            ||   /^(\d*)()     (&gt;pipe) ()      ()  $/x</td></tr>
+<tr><td class="h"><a name="1863"></a>1863</td><td></td><td></td><td></td><td></td><td class="s">            ||   /^()   (&amp;)    (&gt;pty)  ( \w*)&gt; ()  $/x </td></tr>
+<tr><td class="h"><a name="1864"></a>1864</td><td></td><td></td><td></td><td></td><td class="s">## TODO:    ||   /^()   (&gt;pty) (\d*)&gt; (&amp;) ()  $/x </td></tr>
+<tr><td class="h"><a name="1865"></a>1865</td><td></td><td></td><td></td><td></td><td class="s">            ||   /^(\d*)()     (&gt;pty)  ( \w*)&gt; ()  $/x</td></tr>
+<tr><td class="h"><a name="1866"></a>1866</td><td></td><td></td><td></td><td></td><td class="s">            ||   /^()   (&amp;)    (&gt;&gt;?)   ()      (.*)$/x </td></tr>
+<tr><td class="h"><a name="1867"></a>1867</td><td></td><td></td><td></td><td></td><td class="s">            ||   /^(\d*)()     (&gt;&gt;?)   ()      (.*)$/x</td></tr>
+<tr><td class="h"><a name="1868"></a>1868</td><td></td><td></td><td></td><td></td><td class="s">         ) {</td></tr>
+<tr><td class="h"><a name="1869"></a>1869</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;No command before '$_'&quot; unless $cur_kid;</td></tr>
+<tr><td class="h"><a name="1870"></a>1870</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1871"></a>1871</td><td></td><td></td><td></td><td></td><td class="s">            $succinct = ! $first_parse;</td></tr>
+<tr><td class="h"><a name="1872"></a>1872</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1873"></a>1873</td><td></td><td></td><td></td><td></td><td class="s">            my $type = (</td></tr>
+<tr><td class="h"><a name="1874"></a>1874</td><td></td><td></td><td></td><td></td><td class="s">               $2 eq '&gt;pipe' || $3 eq '&gt;pipe'</td></tr>
+<tr><td class="h"><a name="1875"></a>1875</td><td></td><td></td><td></td><td></td><td class="s">                  ? '&gt;pipe'</td></tr>
+<tr><td class="h"><a name="1876"></a>1876</td><td></td><td></td><td></td><td></td><td class="s">                  : $2 eq '&gt;pty' || $3 eq '&gt;pty'</td></tr>
+<tr><td class="h"><a name="1877"></a>1877</td><td></td><td></td><td></td><td></td><td class="s">                     ? '&gt;pty&gt;'</td></tr>
+<tr><td class="h"><a name="1878"></a>1878</td><td></td><td></td><td></td><td></td><td class="s">                     : '&gt;'</td></tr>
+<tr><td class="h"><a name="1879"></a>1879</td><td></td><td></td><td></td><td></td><td class="s">            );</td></tr>
+<tr><td class="h"><a name="1880"></a>1880</td><td></td><td></td><td></td><td></td><td class="s">            my $kfd = length $1 ? $1 : 1;</td></tr>
+<tr><td class="h"><a name="1881"></a>1881</td><td></td><td></td><td></td><td></td><td class="s">            my $trunc = ! ( $2 eq '&gt;&gt;' || $3 eq '&gt;&gt;' );</td></tr>
+<tr><td class="h"><a name="1882"></a>1882</td><td></td><td></td><td></td><td></td><td class="s">            my $pty_id = (</td></tr>
+<tr><td class="h"><a name="1883"></a>1883</td><td></td><td></td><td></td><td></td><td class="s">               $2 eq '&gt;pty' || $3 eq '&gt;pty'</td></tr>
+<tr><td class="h"><a name="1884"></a>1884</td><td></td><td></td><td></td><td></td><td class="s">                  ? length $4 ? $4 : 0</td></tr>
+<tr><td class="h"><a name="1885"></a>1885</td><td></td><td></td><td></td><td></td><td class="s">                  : undef</td></tr>
+<tr><td class="h"><a name="1886"></a>1886</td><td></td><td></td><td></td><td></td><td class="s">            );</td></tr>
+<tr><td class="h"><a name="1887"></a>1887</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1888"></a>1888</td><td></td><td></td><td></td><td></td><td class="s">            my $stderr_too =</td></tr>
+<tr><td class="h"><a name="1889"></a>1889</td><td></td><td></td><td></td><td></td><td class="s">                  $2 eq '&amp;'</td></tr>
+<tr><td class="h"><a name="1890"></a>1890</td><td></td><td></td><td></td><td></td><td class="s">               || $3 eq '&amp;'</td></tr>
+<tr><td class="h"><a name="1891"></a>1891</td><td></td><td></td><td></td><td></td><td class="s">               || ( ! length $1 &amp;&amp; substr( $type, 0, 4 ) eq '&gt;pty' );</td></tr>
+<tr><td class="h"><a name="1892"></a>1892</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1893"></a>1893</td><td></td><td></td><td></td><td></td><td class="s">            my $dest = $5;</td></tr>
+<tr><td class="h"><a name="1894"></a>1894</td><td></td><td></td><td></td><td></td><td class="s">            my @filters;</td></tr>
+<tr><td class="h"><a name="1895"></a>1895</td><td></td><td></td><td></td><td></td><td class="s">            my $binmode = 0;</td></tr>
+<tr><td class="h"><a name="1896"></a>1896</td><td></td><td></td><td></td><td></td><td class="s">            unless ( length $dest ) {</td></tr>
+<tr><td class="h"><a name="1897"></a>1897</td><td></td><td></td><td></td><td></td><td class="s">               if ( ! $succinct ) {</td></tr>
+<tr><td class="h"><a name="1898"></a>1898</td><td></td><td></td><td></td><td></td><td class="s">                  ## unshift...shift: '&gt;' filters source...sink left...right</td></tr>
+<tr><td class="h"><a name="1899"></a>1899</td><td></td><td></td><td></td><td></td><td class="s">                  while ( @args &gt; 1</td></tr>
+<tr><td class="h"><a name="1900"></a>1900</td><td></td><td></td><td></td><td></td><td class="s">                     &amp;&amp; ( </td></tr>
+<tr><td class="h"><a name="1901"></a>1901</td><td></td><td></td><td></td><td></td><td class="s">                        ( ref $args[1] &amp;&amp; !  UNIVERSAL::isa $args[1], &quot;IPC::Run::Timer&quot; )</td></tr>
+<tr><td class="h"><a name="1902"></a>1902</td><td></td><td></td><td></td><td></td><td class="s">                        || UNIVERSAL::isa $args[0], &quot;IPC::Run::binmode_pseudo_filter&quot;</td></tr>
+<tr><td class="h"><a name="1903"></a>1903</td><td></td><td></td><td></td><td></td><td class="s">                     )</td></tr>
+<tr><td class="h"><a name="1904"></a>1904</td><td></td><td></td><td></td><td></td><td class="s">                  ) {</td></tr>
+<tr><td class="h"><a name="1905"></a>1905</td><td></td><td></td><td></td><td></td><td class="s">                     if ( UNIVERSAL::isa $args[0], &quot;IPC::Run::binmode_pseudo_filter&quot; ) {</td></tr>
+<tr><td class="h"><a name="1906"></a>1906</td><td></td><td></td><td></td><td></td><td class="s">                        $binmode = shift( @args )-&gt;();</td></tr>
+<tr><td class="h"><a name="1907"></a>1907</td><td></td><td></td><td></td><td></td><td class="s">                     }</td></tr>
+<tr><td class="h"><a name="1908"></a>1908</td><td></td><td></td><td></td><td></td><td class="s">                     else {</td></tr>
+<tr><td class="h"><a name="1909"></a>1909</td><td></td><td></td><td></td><td></td><td class="s">                        unshift @filters, shift @args;</td></tr>
+<tr><td class="h"><a name="1910"></a>1910</td><td></td><td></td><td></td><td></td><td class="s">                     }</td></tr>
+<tr><td class="h"><a name="1911"></a>1911</td><td></td><td></td><td></td><td></td><td class="s">                  }</td></tr>
+<tr><td class="h"><a name="1912"></a>1912</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="1913"></a>1913</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1914"></a>1914</td><td></td><td></td><td></td><td></td><td class="s">               $dest = shift @args;</td></tr>
+<tr><td class="h"><a name="1915"></a>1915</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1916"></a>1916</td><td></td><td></td><td></td><td></td><td class="s">               _debug(</td></tr>
+<tr><td class="h"><a name="1917"></a>1917</td><td></td><td></td><td></td><td></td><td class="s">                  'Kid ', $cur_kid-&gt;{NUM}, &quot;'s output fd &quot;, $kfd,</td></tr>
+<tr><td class="h"><a name="1918"></a>1918</td><td></td><td></td><td></td><td></td><td class="s">                  ' has ', scalar( @filters ), ' filters.'</td></tr>
+<tr><td class="h"><a name="1919"></a>1919</td><td></td><td></td><td></td><td></td><td class="s">               ) if _debugging_details &amp;&amp; @filters;</td></tr>
+<tr><td class="h"><a name="1920"></a>1920</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1921"></a>1921</td><td></td><td></td><td></td><td></td><td class="s">               if ( $type eq '&gt;pty&gt;' ) {</td></tr>
+<tr><td class="h"><a name="1922"></a>1922</td><td></td><td></td><td></td><td></td><td class="s">                  ## do the require here to cause early error reporting</td></tr>
+<tr><td class="h"><a name="1923"></a>1923</td><td></td><td></td><td></td><td></td><td class="s">                  require IO::Pty;</td></tr>
+<tr><td class="h"><a name="1924"></a>1924</td><td></td><td></td><td></td><td></td><td class="s">                  ## Just flag the pyt's existence for now.  _open_pipes()</td></tr>
+<tr><td class="h"><a name="1925"></a>1925</td><td></td><td></td><td></td><td></td><td class="s">                  ## will new an IO::Pty for each key.</td></tr>
+<tr><td class="h"><a name="1926"></a>1926</td><td></td><td></td><td></td><td></td><td class="s">                  $self-&gt;{PTYS}-&gt;{$pty_id} = undef;</td></tr>
+<tr><td class="h"><a name="1927"></a>1927</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="1928"></a>1928</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="1929"></a>1929</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1930"></a>1930</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;'$_' missing a destination&quot; if _empty $dest;</td></tr>
+<tr><td class="h"><a name="1931"></a>1931</td><td></td><td></td><td></td><td></td><td class="s">            my $pipe = IPC::Run::IO-&gt;_new_internal(</td></tr>
+<tr><td class="h"><a name="1932"></a>1932</td><td></td><td></td><td></td><td></td><td class="s">               $type, $kfd, $pty_id, $dest, $binmode, @filters</td></tr>
+<tr><td class="h"><a name="1933"></a>1933</td><td></td><td></td><td></td><td></td><td class="s">            );</td></tr>
+<tr><td class="h"><a name="1934"></a>1934</td><td></td><td></td><td></td><td></td><td class="s">            $pipe-&gt;{TRUNC} = $trunc;</td></tr>
+<tr><td class="h"><a name="1935"></a>1935</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1936"></a>1936</td><td></td><td></td><td></td><td></td><td class="s">            if (  ( UNIVERSAL::isa( $dest, 'GLOB' ) || UNIVERSAL::isa( $dest, 'IO::Handle' ) )</td></tr>
+<tr><td class="h"><a name="1937"></a>1937</td><td></td><td></td><td></td><td></td><td class="s">               &amp;&amp; $type !~ /^&gt;(pty&gt;|pipe)$/</td></tr>
+<tr><td class="h"><a name="1938"></a>1938</td><td></td><td></td><td></td><td></td><td class="s">            ) {</td></tr>
+<tr><td class="h"><a name="1939"></a>1939</td><td></td><td></td><td></td><td></td><td class="s">               _debug &quot;setting DONT_CLOSE&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="1940"></a>1940</td><td></td><td></td><td></td><td></td><td class="s">               $pipe-&gt;{DONT_CLOSE} = 1; ## this FD is not closed by us.</td></tr>
+<tr><td class="h"><a name="1941"></a>1941</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="1942"></a>1942</td><td></td><td></td><td></td><td></td><td class="s">            push @{$cur_kid-&gt;{OPS}}, $pipe;</td></tr>
+<tr><td class="h"><a name="1943"></a>1943</td><td></td><td></td><td></td><td></td><td class="s">            push @{$cur_kid-&gt;{OPS}}, {</td></tr>
+<tr><td class="h"><a name="1944"></a>1944</td><td></td><td></td><td></td><td></td><td class="s">               TYPE =&gt; 'dup',</td></tr>
+<tr><td class="h"><a name="1945"></a>1945</td><td></td><td></td><td></td><td></td><td class="s">               KFD1 =&gt; 1,</td></tr>
+<tr><td class="h"><a name="1946"></a>1946</td><td></td><td></td><td></td><td></td><td class="s">               KFD2 =&gt; 2,</td></tr>
+<tr><td class="h"><a name="1947"></a>1947</td><td></td><td></td><td></td><td></td><td class="s">            } if $stderr_too;</td></tr>
+<tr><td class="h"><a name="1948"></a>1948</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1949"></a>1949</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1950"></a>1950</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( $_ eq &quot;|&quot; ) {</td></tr>
+<tr><td class="h"><a name="1951"></a>1951</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;No command before '$_'&quot; unless $cur_kid;</td></tr>
+<tr><td class="h"><a name="1952"></a>1952</td><td></td><td></td><td></td><td></td><td class="s">            unshift @{$cur_kid-&gt;{OPS}}, {</td></tr>
+<tr><td class="h"><a name="1953"></a>1953</td><td></td><td></td><td></td><td></td><td class="s">               TYPE =&gt; '|',</td></tr>
+<tr><td class="h"><a name="1954"></a>1954</td><td></td><td></td><td></td><td></td><td class="s">               KFD  =&gt; 1,</td></tr>
+<tr><td class="h"><a name="1955"></a>1955</td><td></td><td></td><td></td><td></td><td class="s">            };</td></tr>
+<tr><td class="h"><a name="1956"></a>1956</td><td></td><td></td><td></td><td></td><td class="s">            $succinct   = 1;</td></tr>
+<tr><td class="h"><a name="1957"></a>1957</td><td></td><td></td><td></td><td></td><td class="s">            $assumed_fd = 1;</td></tr>
+<tr><td class="h"><a name="1958"></a>1958</td><td></td><td></td><td></td><td></td><td class="s">            $cur_kid    = undef;</td></tr>
+<tr><td class="h"><a name="1959"></a>1959</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1960"></a>1960</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1961"></a>1961</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( $_ eq &quot;&amp;&quot; ) {</td></tr>
+<tr><td class="h"><a name="1962"></a>1962</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;No command before '$_'&quot; unless $cur_kid;</td></tr>
+<tr><td class="h"><a name="1963"></a>1963</td><td></td><td></td><td></td><td></td><td class="s">            unshift @{$cur_kid-&gt;{OPS}}, {</td></tr>
+<tr><td class="h"><a name="1964"></a>1964</td><td></td><td></td><td></td><td></td><td class="s">               TYPE =&gt; 'close',</td></tr>
+<tr><td class="h"><a name="1965"></a>1965</td><td></td><td></td><td></td><td></td><td class="s">               KFD  =&gt; 0,</td></tr>
+<tr><td class="h"><a name="1966"></a>1966</td><td></td><td></td><td></td><td></td><td class="s">            };</td></tr>
+<tr><td class="h"><a name="1967"></a>1967</td><td></td><td></td><td></td><td></td><td class="s">            $succinct   = 1;</td></tr>
+<tr><td class="h"><a name="1968"></a>1968</td><td></td><td></td><td></td><td></td><td class="s">            $assumed_fd = 0;</td></tr>
+<tr><td class="h"><a name="1969"></a>1969</td><td></td><td></td><td></td><td></td><td class="s">            $cur_kid    = undef;</td></tr>
+<tr><td class="h"><a name="1970"></a>1970</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1971"></a>1971</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1972"></a>1972</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( $_ eq 'init' ) {</td></tr>
+<tr><td class="h"><a name="1973"></a>1973</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;No command before '$_'&quot; unless $cur_kid;</td></tr>
+<tr><td class="h"><a name="1974"></a>1974</td><td></td><td></td><td></td><td></td><td class="s">            push @{$cur_kid-&gt;{OPS}}, {</td></tr>
+<tr><td class="h"><a name="1975"></a>1975</td><td></td><td></td><td></td><td></td><td class="s">               TYPE =&gt; 'init',</td></tr>
+<tr><td class="h"><a name="1976"></a>1976</td><td></td><td></td><td></td><td></td><td class="s">               SUB  =&gt; shift @args,</td></tr>
+<tr><td class="h"><a name="1977"></a>1977</td><td></td><td></td><td></td><td></td><td class="s">            };</td></tr>
+<tr><td class="h"><a name="1978"></a>1978</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1979"></a>1979</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1980"></a>1980</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( ! ref $_ ) {</td></tr>
+<tr><td class="h"><a name="1981"></a>1981</td><td></td><td></td><td></td><td></td><td class="s">            $self-&gt;{$_} = shift @args;</td></tr>
+<tr><td class="h"><a name="1982"></a>1982</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1983"></a>1983</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1984"></a>1984</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( $_ eq 'init' ) {</td></tr>
+<tr><td class="h"><a name="1985"></a>1985</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;No command before '$_'&quot; unless $cur_kid;</td></tr>
+<tr><td class="h"><a name="1986"></a>1986</td><td></td><td></td><td></td><td></td><td class="s">            push @{$cur_kid-&gt;{OPS}}, {</td></tr>
+<tr><td class="h"><a name="1987"></a>1987</td><td></td><td></td><td></td><td></td><td class="s">               TYPE =&gt; 'init',</td></tr>
+<tr><td class="h"><a name="1988"></a>1988</td><td></td><td></td><td></td><td></td><td class="s">               SUB  =&gt; shift @args,</td></tr>
+<tr><td class="h"><a name="1989"></a>1989</td><td></td><td></td><td></td><td></td><td class="s">            };</td></tr>
+<tr><td class="h"><a name="1990"></a>1990</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="1991"></a>1991</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="1992"></a>1992</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( $succinct &amp;&amp; $first_parse ) {</td></tr>
+<tr><td class="h"><a name="1993"></a>1993</td><td></td><td></td><td></td><td></td><td class="s">            ## It's not an opcode, and no explicit opcodes have been</td></tr>
+<tr><td class="h"><a name="1994"></a>1994</td><td></td><td></td><td></td><td></td><td class="s">            ## seen yet, so assume it's a file name.</td></tr>
+<tr><td class="h"><a name="1995"></a>1995</td><td></td><td></td><td></td><td></td><td class="s">            unshift @args, $_;</td></tr>
+<tr><td class="h"><a name="1996"></a>1996</td><td></td><td></td><td></td><td></td><td class="s">            if ( ! $assumed_fd ) {</td></tr>
+<tr><td class="h"><a name="1997"></a>1997</td><td></td><td></td><td></td><td></td><td class="s">               $_ = &quot;$assumed_fd&lt;&quot;,</td></tr>
+<tr><td class="h"><a name="1998"></a>1998</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="1999"></a>1999</td><td></td><td></td><td></td><td></td><td class="s">            else {</td></tr>
+<tr><td class="h"><a name="2000"></a>2000</td><td></td><td></td><td></td><td></td><td class="s">               $_ = &quot;$assumed_fd&gt;&quot;,</td></tr>
+<tr><td class="h"><a name="2001"></a>2001</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2002"></a>2002</td><td></td><td></td><td></td><td></td><td class="s">            _debug &quot;assuming '&quot;, $_, &quot;'&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2003"></a>2003</td><td></td><td></td><td></td><td></td><td class="s">            ++$assumed_fd;</td></tr>
+<tr><td class="h"><a name="2004"></a>2004</td><td></td><td></td><td></td><td></td><td class="s">            $first_parse = 0;</td></tr>
+<tr><td class="h"><a name="2005"></a>2005</td><td></td><td></td><td></td><td></td><td class="s">            goto REPARSE;</td></tr>
+<tr><td class="h"><a name="2006"></a>2006</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2007"></a>2007</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2008"></a>2008</td><td></td><td></td><td></td><td></td><td class="s">         else {</td></tr>
+<tr><td class="h"><a name="2009"></a>2009</td><td></td><td></td><td></td><td></td><td class="s">            croak join( </td></tr>
+<tr><td class="h"><a name="2010"></a>2010</td><td></td><td></td><td></td><td></td><td class="s">               '',</td></tr>
+<tr><td class="h"><a name="2011"></a>2011</td><td></td><td></td><td></td><td></td><td class="s">               'Unexpected ',</td></tr>
+<tr><td class="h"><a name="2012"></a>2012</td><td></td><td></td><td></td><td></td><td class="s">               ( ref() ? $_ : 'scalar' ),</td></tr>
+<tr><td class="h"><a name="2013"></a>2013</td><td></td><td></td><td></td><td></td><td class="s">               ' in harness() parameter ',</td></tr>
+<tr><td class="h"><a name="2014"></a>2014</td><td></td><td></td><td></td><td></td><td class="s">               $arg_count - @args</td></tr>
+<tr><td class="h"><a name="2015"></a>2015</td><td></td><td></td><td></td><td></td><td class="s">            );</td></tr>
+<tr><td class="h"><a name="2016"></a>2016</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2017"></a>2017</td><td></td><td></td><td></td><td></td><td class="s">      };</td></tr>
+<tr><td class="h"><a name="2018"></a>2018</td><td></td><td></td><td></td><td></td><td class="s">      if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="2019"></a>2019</td><td></td><td></td><td></td><td></td><td class="s">         push @errs, $@;</td></tr>
+<tr><td class="h"><a name="2020"></a>2020</td><td></td><td></td><td></td><td></td><td class="s">         _debug 'caught ', $@ if _debugging;</td></tr>
+<tr><td class="h"><a name="2021"></a>2021</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2022"></a>2022</td><td></td><td></td><td></td><td></td><td class="s">   } }</td></tr>
+<tr><td class="h"><a name="2023"></a>2023</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2024"></a>2024</td><td></td><td></td><td></td><td></td><td class="s">   die join( '', @errs ) if @errs;</td></tr>
+<tr><td class="h"><a name="2025"></a>2025</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2026"></a>2026</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2027"></a>2027</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{STATE} = _harnessed;</td></tr>
+<tr><td class="h"><a name="2028"></a>2028</td><td></td><td></td><td></td><td></td><td class="s">#   $self-&gt;timeout( $options-&gt;{timeout} ) if exists $options-&gt;{timeout};</td></tr>
+<tr><td class="h"><a name="2029"></a>2029</td><td></td><td></td><td></td><td></td><td class="s">   return $self;</td></tr>
+<tr><td class="h"><a name="2030"></a>2030</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="2031"></a>2031</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2032"></a>2032</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2033"></a>2033</td><td></td><td></td><td></td><td></td><td class="s">sub _open_pipes {</td></tr>
+<tr><td class="h"><a name="2034"></a>2034</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="2035"></a>2035</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2036"></a>2036</td><td></td><td></td><td></td><td></td><td class="s">   my @errs;</td></tr>
+<tr><td class="h"><a name="2037"></a>2037</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2038"></a>2038</td><td></td><td></td><td></td><td></td><td class="s">   my @close_on_fail;</td></tr>
+<tr><td class="h"><a name="2039"></a>2039</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2040"></a>2040</td><td></td><td></td><td></td><td></td><td class="s">   ## When a pipe character is seen, a pipe is created.  $pipe_read_fd holds</td></tr>
+<tr><td class="h"><a name="2041"></a>2041</td><td></td><td></td><td></td><td></td><td class="s">   ## the dangling read end of the pipe until we get to the next process.</td></tr>
+<tr><td class="h"><a name="2042"></a>2042</td><td></td><td></td><td></td><td></td><td class="s">   my $pipe_read_fd;</td></tr>
+<tr><td class="h"><a name="2043"></a>2043</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2044"></a>2044</td><td></td><td></td><td></td><td></td><td class="s">   ## Output descriptors for the last command are shared by all children.</td></tr>
+<tr><td class="h"><a name="2045"></a>2045</td><td></td><td></td><td></td><td></td><td class="s">   ## @output_fds_accum accumulates the current set of output fds.</td></tr>
+<tr><td class="h"><a name="2046"></a>2046</td><td></td><td></td><td></td><td></td><td class="s">   my @output_fds_accum;</td></tr>
+<tr><td class="h"><a name="2047"></a>2047</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2048"></a>2048</td><td></td><td></td><td></td><td></td><td class="s">   for ( sort keys %{$self-&gt;{PTYS}} ) {</td></tr>
+<tr><td class="h"><a name="2049"></a>2049</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;opening pty '&quot;, $_, &quot;'&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2050"></a>2050</td><td></td><td></td><td></td><td></td><td class="s">      my $pty = _pty;</td></tr>
+<tr><td class="h"><a name="2051"></a>2051</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;{PTYS}-&gt;{$_} = $pty;</td></tr>
+<tr><td class="h"><a name="2052"></a>2052</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2053"></a>2053</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2054"></a>2054</td><td></td><td></td><td></td><td></td><td class="s">   for ( @{$self-&gt;{IOS}} ) {</td></tr>
+<tr><td class="h"><a name="2055"></a>2055</td><td></td><td></td><td></td><td></td><td class="s">      eval { $_-&gt;init; };</td></tr>
+<tr><td class="h"><a name="2056"></a>2056</td><td></td><td></td><td></td><td></td><td class="s">      if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="2057"></a>2057</td><td></td><td></td><td></td><td></td><td class="s">         push @errs, $@;</td></tr>
+<tr><td class="h"><a name="2058"></a>2058</td><td></td><td></td><td></td><td></td><td class="s">         _debug 'caught ', $@ if _debugging;</td></tr>
+<tr><td class="h"><a name="2059"></a>2059</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2060"></a>2060</td><td></td><td></td><td></td><td></td><td class="s">      else {</td></tr>
+<tr><td class="h"><a name="2061"></a>2061</td><td></td><td></td><td></td><td></td><td class="s">         push @close_on_fail, $_;</td></tr>
+<tr><td class="h"><a name="2062"></a>2062</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2063"></a>2063</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2064"></a>2064</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2065"></a>2065</td><td></td><td></td><td></td><td></td><td class="s">   ## Loop through the kids and their OPS, interpreting any that require</td></tr>
+<tr><td class="h"><a name="2066"></a>2066</td><td></td><td></td><td></td><td></td><td class="s">   ## parent-side actions.</td></tr>
+<tr><td class="h"><a name="2067"></a>2067</td><td></td><td></td><td></td><td></td><td class="s">   for my $kid ( @{$self-&gt;{KIDS}} ) {</td></tr>
+<tr><td class="h"><a name="2068"></a>2068</td><td></td><td></td><td></td><td></td><td class="s">      unless ( ref $kid-&gt;{VAL} eq 'CODE' ) {</td></tr>
+<tr><td class="h"><a name="2069"></a>2069</td><td></td><td></td><td></td><td></td><td class="s">         $kid-&gt;{PATH} = _search_path $kid-&gt;{VAL}-&gt;[0];</td></tr>
+<tr><td class="h"><a name="2070"></a>2070</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2071"></a>2071</td><td></td><td></td><td></td><td></td><td class="s">      if ( defined $pipe_read_fd ) {</td></tr>
+<tr><td class="h"><a name="2072"></a>2072</td><td></td><td></td><td></td><td></td><td class="s">         _debug &quot;placing write end of pipe on kid $kid-&gt;{NUM}'s stdin&quot;</td></tr>
+<tr><td class="h"><a name="2073"></a>2073</td><td></td><td></td><td></td><td></td><td class="s">            if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2074"></a>2074</td><td></td><td></td><td></td><td></td><td class="s">         unshift @{$kid-&gt;{OPS}}, {</td></tr>
+<tr><td class="h"><a name="2075"></a>2075</td><td></td><td></td><td></td><td></td><td class="s">            TYPE =&gt; 'PIPE',  ## Prevent next loop from triggering on this</td></tr>
+<tr><td class="h"><a name="2076"></a>2076</td><td></td><td></td><td></td><td></td><td class="s">            KFD  =&gt; 0,</td></tr>
+<tr><td class="h"><a name="2077"></a>2077</td><td></td><td></td><td></td><td></td><td class="s">            TFD  =&gt; $pipe_read_fd,</td></tr>
+<tr><td class="h"><a name="2078"></a>2078</td><td></td><td></td><td></td><td></td><td class="s">         };</td></tr>
+<tr><td class="h"><a name="2079"></a>2079</td><td></td><td></td><td></td><td></td><td class="s">         $pipe_read_fd = undef;</td></tr>
+<tr><td class="h"><a name="2080"></a>2080</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2081"></a>2081</td><td></td><td></td><td></td><td></td><td class="s">      @output_fds_accum = ();</td></tr>
+<tr><td class="h"><a name="2082"></a>2082</td><td></td><td></td><td></td><td></td><td class="s">      for my $op ( @{$kid-&gt;{OPS}} ) {</td></tr>
+<tr><td class="h"><a name="2083"></a>2083</td><td></td><td></td><td></td><td></td><td class="s">#         next if $op-&gt;{IS_DEBUG};</td></tr>
+<tr><td class="h"><a name="2084"></a>2084</td><td></td><td></td><td></td><td></td><td class="s">         my $ok = eval {</td></tr>
+<tr><td class="h"><a name="2085"></a>2085</td><td></td><td></td><td></td><td></td><td class="s">            if ( $op-&gt;{TYPE} eq '&lt;' ) {</td></tr>
+<tr><td class="h"><a name="2086"></a>2086</td><td></td><td></td><td></td><td></td><td class="s">               my $source = $op-&gt;{SOURCE};</td></tr>
+<tr><td class="h"><a name="2087"></a>2087</td><td></td><td></td><td></td><td></td><td class="s">               if ( ! ref $source ) {</td></tr>
+<tr><td class="h"><a name="2088"></a>2088</td><td></td><td></td><td></td><td></td><td class="s">                  _debug(</td></tr>
+<tr><td class="h"><a name="2089"></a>2089</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;kid &quot;, $kid-&gt;{NUM}, &quot; to read &quot;, $op-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2090"></a>2090</td><td></td><td></td><td></td><td></td><td class="s">                     &quot; from '&quot; .  $source, &quot;' (read only)&quot;</td></tr>
+<tr><td class="h"><a name="2091"></a>2091</td><td></td><td></td><td></td><td></td><td class="s">                  ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2092"></a>2092</td><td></td><td></td><td></td><td></td><td class="s">                  croak &quot;simulated open failure&quot;</td></tr>
+<tr><td class="h"><a name="2093"></a>2093</td><td></td><td></td><td></td><td></td><td class="s">                     if $self-&gt;{_simulate_open_failure};</td></tr>
+<tr><td class="h"><a name="2094"></a>2094</td><td></td><td></td><td></td><td></td><td class="s">                  $op-&gt;{TFD} = _sysopen( $source, O_RDONLY );</td></tr>
+<tr><td class="h"><a name="2095"></a>2095</td><td></td><td></td><td></td><td></td><td class="s">                  push @close_on_fail, $op-&gt;{TFD};</td></tr>
+<tr><td class="h"><a name="2096"></a>2096</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2097"></a>2097</td><td></td><td></td><td></td><td></td><td class="s">               elsif ( UNIVERSAL::isa( $source, 'GLOB' )</td></tr>
+<tr><td class="h"><a name="2098"></a>2098</td><td></td><td></td><td></td><td></td><td class="s">                  ||   UNIVERSAL::isa( $source, 'IO::Handle' )</td></tr>
+<tr><td class="h"><a name="2099"></a>2099</td><td></td><td></td><td></td><td></td><td class="s">               ) {</td></tr>
+<tr><td class="h"><a name="2100"></a>2100</td><td></td><td></td><td></td><td></td><td class="s">                  croak</td></tr>
+<tr><td class="h"><a name="2101"></a>2101</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;Unopened filehandle in input redirect for $op-&gt;{KFD}&quot;</td></tr>
+<tr><td class="h"><a name="2102"></a>2102</td><td></td><td></td><td></td><td></td><td class="s">                     unless defined fileno $source;</td></tr>
+<tr><td class="h"><a name="2103"></a>2103</td><td></td><td></td><td></td><td></td><td class="s">                  $op-&gt;{TFD} = fileno $source;</td></tr>
+<tr><td class="h"><a name="2104"></a>2104</td><td></td><td></td><td></td><td></td><td class="s">                  _debug(</td></tr>
+<tr><td class="h"><a name="2105"></a>2105</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;kid &quot;, $kid-&gt;{NUM}, &quot; to read &quot;, $op-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2106"></a>2106</td><td></td><td></td><td></td><td></td><td class="s">                     &quot; from fd &quot;, $op-&gt;{TFD}</td></tr>
+<tr><td class="h"><a name="2107"></a>2107</td><td></td><td></td><td></td><td></td><td class="s">                  ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2108"></a>2108</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2109"></a>2109</td><td></td><td></td><td></td><td></td><td class="s">               elsif ( UNIVERSAL::isa( $source, 'SCALAR' ) ) {</td></tr>
+<tr><td class="h"><a name="2110"></a>2110</td><td></td><td></td><td></td><td></td><td class="s">                  _debug(</td></tr>
+<tr><td class="h"><a name="2111"></a>2111</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;kid &quot;, $kid-&gt;{NUM}, &quot; to read &quot;, $op-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2112"></a>2112</td><td></td><td></td><td></td><td></td><td class="s">                     &quot; from SCALAR&quot;</td></tr>
+<tr><td class="h"><a name="2113"></a>2113</td><td></td><td></td><td></td><td></td><td class="s">                  ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2114"></a>2114</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2115"></a>2115</td><td></td><td></td><td></td><td></td><td class="s">                  $op-&gt;open_pipe( $self-&gt;_debug_fd );</td></tr>
+<tr><td class="h"><a name="2116"></a>2116</td><td></td><td></td><td></td><td></td><td class="s">                  push @close_on_fail, $op-&gt;{KFD}, $op-&gt;{FD};</td></tr>
+<tr><td class="h"><a name="2117"></a>2117</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2118"></a>2118</td><td></td><td></td><td></td><td></td><td class="s">                  my $s = '';</td></tr>
+<tr><td class="h"><a name="2119"></a>2119</td><td></td><td></td><td></td><td></td><td class="s">                  $op-&gt;{KIN_REF} = \$s;</td></tr>
+<tr><td class="h"><a name="2120"></a>2120</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2121"></a>2121</td><td></td><td></td><td></td><td></td><td class="s">               elsif ( UNIVERSAL::isa( $source, 'CODE' ) ) {</td></tr>
+<tr><td class="h"><a name="2122"></a>2122</td><td></td><td></td><td></td><td></td><td class="s">                  _debug(</td></tr>
+<tr><td class="h"><a name="2123"></a>2123</td><td></td><td></td><td></td><td></td><td class="s">                     'kid ', $kid-&gt;{NUM}, ' to read ', $op-&gt;{KFD}, ' from CODE'</td></tr>
+<tr><td class="h"><a name="2124"></a>2124</td><td></td><td></td><td></td><td></td><td class="s">                  ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2125"></a>2125</td><td></td><td></td><td></td><td></td><td class="s">                  </td></tr>
+<tr><td class="h"><a name="2126"></a>2126</td><td></td><td></td><td></td><td></td><td class="s">                  $op-&gt;open_pipe( $self-&gt;_debug_fd );</td></tr>
+<tr><td class="h"><a name="2127"></a>2127</td><td></td><td></td><td></td><td></td><td class="s">                  push @close_on_fail, $op-&gt;{KFD}, $op-&gt;{FD};</td></tr>
+<tr><td class="h"><a name="2128"></a>2128</td><td></td><td></td><td></td><td></td><td class="s">                  </td></tr>
+<tr><td class="h"><a name="2129"></a>2129</td><td></td><td></td><td></td><td></td><td class="s">                  my $s = '';</td></tr>
+<tr><td class="h"><a name="2130"></a>2130</td><td></td><td></td><td></td><td></td><td class="s">                  $op-&gt;{KIN_REF} = \$s;</td></tr>
+<tr><td class="h"><a name="2131"></a>2131</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2132"></a>2132</td><td></td><td></td><td></td><td></td><td class="s">               else {</td></tr>
+<tr><td class="h"><a name="2133"></a>2133</td><td></td><td></td><td></td><td></td><td class="s">                  croak(</td></tr>
+<tr><td class="h"><a name="2134"></a>2134</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;'&quot;</td></tr>
+<tr><td class="h"><a name="2135"></a>2135</td><td></td><td></td><td></td><td></td><td class="s">                     . ref( $source )</td></tr>
+<tr><td class="h"><a name="2136"></a>2136</td><td></td><td></td><td></td><td></td><td class="s">                     . &quot;' not allowed as a source for input redirection&quot;</td></tr>
+<tr><td class="h"><a name="2137"></a>2137</td><td></td><td></td><td></td><td></td><td class="s">                  );</td></tr>
+<tr><td class="h"><a name="2138"></a>2138</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2139"></a>2139</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;_init_filters;</td></tr>
+<tr><td class="h"><a name="2140"></a>2140</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2141"></a>2141</td><td></td><td></td><td></td><td></td><td class="s">            elsif ( $op-&gt;{TYPE} eq '&lt;pipe' ) {</td></tr>
+<tr><td class="h"><a name="2142"></a>2142</td><td></td><td></td><td></td><td></td><td class="s">               _debug(</td></tr>
+<tr><td class="h"><a name="2143"></a>2143</td><td></td><td></td><td></td><td></td><td class="s">                  'kid to read ', $op-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2144"></a>2144</td><td></td><td></td><td></td><td></td><td class="s">                  ' from a pipe IPC::Run opens and returns',</td></tr>
+<tr><td class="h"><a name="2145"></a>2145</td><td></td><td></td><td></td><td></td><td class="s">               ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2146"></a>2146</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2147"></a>2147</td><td></td><td></td><td></td><td></td><td class="s">               my ( $r, $w ) = $op-&gt;open_pipe( $self-&gt;_debug_fd, $op-&gt;{SOURCE} );</td></tr>
+<tr><td class="h"><a name="2148"></a>2148</td><td></td><td></td><td></td><td></td><td class="s">               _debug &quot;caller will write to &quot;, fileno $op-&gt;{SOURCE}</td></tr>
+<tr><td class="h"><a name="2149"></a>2149</td><td></td><td></td><td></td><td></td><td class="s">                  if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2150"></a>2150</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2151"></a>2151</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;{TFD}    = $r;</td></tr>
+<tr><td class="h"><a name="2152"></a>2152</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;{FD}     = undef; # we don't manage this fd</td></tr>
+<tr><td class="h"><a name="2153"></a>2153</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;_init_filters;</td></tr>
+<tr><td class="h"><a name="2154"></a>2154</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2155"></a>2155</td><td></td><td></td><td></td><td></td><td class="s">            elsif ( $op-&gt;{TYPE} eq '&lt;pty&lt;' ) {</td></tr>
+<tr><td class="h"><a name="2156"></a>2156</td><td></td><td></td><td></td><td></td><td class="s">               _debug(</td></tr>
+<tr><td class="h"><a name="2157"></a>2157</td><td></td><td></td><td></td><td></td><td class="s">                  'kid to read ', $op-&gt;{KFD}, &quot; from pty '&quot;, $op-&gt;{PTY_ID}, &quot;'&quot;,</td></tr>
+<tr><td class="h"><a name="2158"></a>2158</td><td></td><td></td><td></td><td></td><td class="s">               ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2159"></a>2159</td><td></td><td></td><td></td><td></td><td class="s">               </td></tr>
+<tr><td class="h"><a name="2160"></a>2160</td><td></td><td></td><td></td><td></td><td class="s">               for my $source ( $op-&gt;{SOURCE} ) {</td></tr>
+<tr><td class="h"><a name="2161"></a>2161</td><td></td><td></td><td></td><td></td><td class="s">                  if ( UNIVERSAL::isa( $source, 'SCALAR' ) ) {</td></tr>
+<tr><td class="h"><a name="2162"></a>2162</td><td></td><td></td><td></td><td></td><td class="s">                     _debug(</td></tr>
+<tr><td class="h"><a name="2163"></a>2163</td><td></td><td></td><td></td><td></td><td class="s">                        &quot;kid &quot;, $kid-&gt;{NUM}, &quot; to read &quot;, $op-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2164"></a>2164</td><td></td><td></td><td></td><td></td><td class="s">                        &quot; from SCALAR via pty '&quot;, $op-&gt;{PTY_ID}, &quot;'&quot;</td></tr>
+<tr><td class="h"><a name="2165"></a>2165</td><td></td><td></td><td></td><td></td><td class="s">                     ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2166"></a>2166</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2167"></a>2167</td><td></td><td></td><td></td><td></td><td class="s">                     my $s = '';</td></tr>
+<tr><td class="h"><a name="2168"></a>2168</td><td></td><td></td><td></td><td></td><td class="s">                     $op-&gt;{KIN_REF} = \$s;</td></tr>
+<tr><td class="h"><a name="2169"></a>2169</td><td></td><td></td><td></td><td></td><td class="s">                  }</td></tr>
+<tr><td class="h"><a name="2170"></a>2170</td><td></td><td></td><td></td><td></td><td class="s">                  elsif ( UNIVERSAL::isa( $source, 'CODE' ) ) {</td></tr>
+<tr><td class="h"><a name="2171"></a>2171</td><td></td><td></td><td></td><td></td><td class="s">                     _debug(</td></tr>
+<tr><td class="h"><a name="2172"></a>2172</td><td></td><td></td><td></td><td></td><td class="s">                        &quot;kid &quot;, $kid-&gt;{NUM}, &quot; to read &quot;, $op-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2173"></a>2173</td><td></td><td></td><td></td><td></td><td class="s">                        &quot; from CODE via pty '&quot;, $op-&gt;{PTY_ID}, &quot;'&quot;</td></tr>
+<tr><td class="h"><a name="2174"></a>2174</td><td></td><td></td><td></td><td></td><td class="s">                     ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2175"></a>2175</td><td></td><td></td><td></td><td></td><td class="s">                     my $s = '';</td></tr>
+<tr><td class="h"><a name="2176"></a>2176</td><td></td><td></td><td></td><td></td><td class="s">                     $op-&gt;{KIN_REF} = \$s;</td></tr>
+<tr><td class="h"><a name="2177"></a>2177</td><td></td><td></td><td></td><td></td><td class="s">                  }</td></tr>
+<tr><td class="h"><a name="2178"></a>2178</td><td></td><td></td><td></td><td></td><td class="s">                  else {</td></tr>
+<tr><td class="h"><a name="2179"></a>2179</td><td></td><td></td><td></td><td></td><td class="s">                     croak(</td></tr>
+<tr><td class="h"><a name="2180"></a>2180</td><td></td><td></td><td></td><td></td><td class="s">                        &quot;'&quot;</td></tr>
+<tr><td class="h"><a name="2181"></a>2181</td><td></td><td></td><td></td><td></td><td class="s">                        . ref( $source )</td></tr>
+<tr><td class="h"><a name="2182"></a>2182</td><td></td><td></td><td></td><td></td><td class="s">                        . &quot;' not allowed as a source for '&lt;pty&lt;' redirection&quot;</td></tr>
+<tr><td class="h"><a name="2183"></a>2183</td><td></td><td></td><td></td><td></td><td class="s">                     );</td></tr>
+<tr><td class="h"><a name="2184"></a>2184</td><td></td><td></td><td></td><td></td><td class="s">                  }</td></tr>
+<tr><td class="h"><a name="2185"></a>2185</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2186"></a>2186</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;{FD} = $self-&gt;{PTYS}-&gt;{$op-&gt;{PTY_ID}}-&gt;fileno;</td></tr>
+<tr><td class="h"><a name="2187"></a>2187</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;{TFD} = undef; # The fd isn't known until after fork().</td></tr>
+<tr><td class="h"><a name="2188"></a>2188</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;_init_filters;</td></tr>
+<tr><td class="h"><a name="2189"></a>2189</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2190"></a>2190</td><td></td><td></td><td></td><td></td><td class="s">            elsif ( $op-&gt;{TYPE} eq '&gt;' ) {</td></tr>
+<tr><td class="h"><a name="2191"></a>2191</td><td></td><td></td><td></td><td></td><td class="s">               ## N&gt; output redirection.</td></tr>
+<tr><td class="h"><a name="2192"></a>2192</td><td></td><td></td><td></td><td></td><td class="s">               my $dest = $op-&gt;{DEST};</td></tr>
+<tr><td class="h"><a name="2193"></a>2193</td><td></td><td></td><td></td><td></td><td class="s">               if ( ! ref $dest ) {</td></tr>
+<tr><td class="h"><a name="2194"></a>2194</td><td></td><td></td><td></td><td></td><td class="s">                  _debug(</td></tr>
+<tr><td class="h"><a name="2195"></a>2195</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;kid &quot;, $kid-&gt;{NUM}, &quot; to write &quot;, $op-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2196"></a>2196</td><td></td><td></td><td></td><td></td><td class="s">                     &quot; to '&quot;, $dest, &quot;' (write only, create, &quot;,</td></tr>
+<tr><td class="h"><a name="2197"></a>2197</td><td></td><td></td><td></td><td></td><td class="s">                     ( $op-&gt;{TRUNC} ? 'truncate' : 'append' ),</td></tr>
+<tr><td class="h"><a name="2198"></a>2198</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;)&quot;</td></tr>
+<tr><td class="h"><a name="2199"></a>2199</td><td></td><td></td><td></td><td></td><td class="s">                  ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2200"></a>2200</td><td></td><td></td><td></td><td></td><td class="s">                  croak &quot;simulated open failure&quot;</td></tr>
+<tr><td class="h"><a name="2201"></a>2201</td><td></td><td></td><td></td><td></td><td class="s">                     if $self-&gt;{_simulate_open_failure};</td></tr>
+<tr><td class="h"><a name="2202"></a>2202</td><td></td><td></td><td></td><td></td><td class="s">                  $op-&gt;{TFD} = _sysopen(</td></tr>
+<tr><td class="h"><a name="2203"></a>2203</td><td></td><td></td><td></td><td></td><td class="s">                     $dest,</td></tr>
+<tr><td class="h"><a name="2204"></a>2204</td><td></td><td></td><td></td><td></td><td class="s">                     ( O_WRONLY</td></tr>
+<tr><td class="h"><a name="2205"></a>2205</td><td></td><td></td><td></td><td></td><td class="s">                     | O_CREAT </td></tr>
+<tr><td class="h"><a name="2206"></a>2206</td><td></td><td></td><td></td><td></td><td class="s">                     | ( $op-&gt;{TRUNC} ? O_TRUNC : O_APPEND )</td></tr>
+<tr><td class="h"><a name="2207"></a>2207</td><td></td><td></td><td></td><td></td><td class="s">                     )</td></tr>
+<tr><td class="h"><a name="2208"></a>2208</td><td></td><td></td><td></td><td></td><td class="s">                  );</td></tr>
+<tr><td class="h"><a name="2209"></a>2209</td><td></td><td></td><td></td><td></td><td class="s">                  if ( Win32_MODE ) {</td></tr>
+<tr><td class="h"><a name="2210"></a>2210</td><td></td><td></td><td></td><td></td><td class="s">                     ## I have no idea why this is needed to make the current</td></tr>
+<tr><td class="h"><a name="2211"></a>2211</td><td></td><td></td><td></td><td></td><td class="s">                     ## file position survive the gyrations TFD must go </td></tr>
+<tr><td class="h"><a name="2212"></a>2212</td><td></td><td></td><td></td><td></td><td class="s">                     ## through...</td></tr>
+<tr><td class="h"><a name="2213"></a>2213</td><td></td><td></td><td></td><td></td><td class="s">                     POSIX::lseek( $op-&gt;{TFD}, 0, POSIX::SEEK_END() );</td></tr>
+<tr><td class="h"><a name="2214"></a>2214</td><td></td><td></td><td></td><td></td><td class="s">                  }</td></tr>
+<tr><td class="h"><a name="2215"></a>2215</td><td></td><td></td><td></td><td></td><td class="s">                  push @close_on_fail, $op-&gt;{TFD};</td></tr>
+<tr><td class="h"><a name="2216"></a>2216</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2217"></a>2217</td><td></td><td></td><td></td><td></td><td class="s">               elsif ( UNIVERSAL::isa( $dest, 'GLOB' ) ) {</td></tr>
+<tr><td class="h"><a name="2218"></a>2218</td><td></td><td></td><td></td><td></td><td class="s">                  croak(</td></tr>
+<tr><td class="h"><a name="2219"></a>2219</td><td></td><td></td><td></td><td></td><td class="s">                   &quot;Unopened filehandle in output redirect, command $kid-&gt;{NUM}&quot;</td></tr>
+<tr><td class="h"><a name="2220"></a>2220</td><td></td><td></td><td></td><td></td><td class="s">                  ) unless defined fileno $dest;</td></tr>
+<tr><td class="h"><a name="2221"></a>2221</td><td></td><td></td><td></td><td></td><td class="s">                  ## Turn on autoflush, mostly just to flush out</td></tr>
+<tr><td class="h"><a name="2222"></a>2222</td><td></td><td></td><td></td><td></td><td class="s">                  ## existing output.</td></tr>
+<tr><td class="h"><a name="2223"></a>2223</td><td></td><td></td><td></td><td></td><td class="s">                  my $old_fh = select( $dest ); $| = 1; select( $old_fh );</td></tr>
+<tr><td class="h"><a name="2224"></a>2224</td><td></td><td></td><td></td><td></td><td class="s">                  $op-&gt;{TFD} = fileno $dest;</td></tr>
+<tr><td class="h"><a name="2225"></a>2225</td><td></td><td></td><td></td><td></td><td class="s">                  _debug(</td></tr>
+<tr><td class="h"><a name="2226"></a>2226</td><td></td><td></td><td></td><td></td><td class="s">                     'kid to write ', $op-&gt;{KFD}, ' to handle ', $op-&gt;{TFD}</td></tr>
+<tr><td class="h"><a name="2227"></a>2227</td><td></td><td></td><td></td><td></td><td class="s">                  ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2228"></a>2228</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2229"></a>2229</td><td></td><td></td><td></td><td></td><td class="s">               elsif ( UNIVERSAL::isa( $dest, 'SCALAR' ) ) {</td></tr>
+<tr><td class="h"><a name="2230"></a>2230</td><td></td><td></td><td></td><td></td><td class="s">                  _debug(</td></tr>
+<tr><td class="h"><a name="2231"></a>2231</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;kid &quot;, $kid-&gt;{NUM}, &quot; to write $op-&gt;{KFD} to SCALAR&quot;</td></tr>
+<tr><td class="h"><a name="2232"></a>2232</td><td></td><td></td><td></td><td></td><td class="s">                  ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2233"></a>2233</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2234"></a>2234</td><td></td><td></td><td></td><td></td><td class="s">                  $op-&gt;open_pipe( $self-&gt;_debug_fd );</td></tr>
+<tr><td class="h"><a name="2235"></a>2235</td><td></td><td></td><td></td><td></td><td class="s">                  push @close_on_fail, $op-&gt;{FD}, $op-&gt;{TFD};</td></tr>
+<tr><td class="h"><a name="2236"></a>2236</td><td></td><td></td><td></td><td></td><td class="s">                  $$dest = '' if $op-&gt;{TRUNC};</td></tr>
+<tr><td class="h"><a name="2237"></a>2237</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2238"></a>2238</td><td></td><td></td><td></td><td></td><td class="s">               elsif ( UNIVERSAL::isa( $dest, 'CODE' ) ) {</td></tr>
+<tr><td class="h"><a name="2239"></a>2239</td><td></td><td></td><td></td><td></td><td class="s">                  _debug(</td></tr>
+<tr><td class="h"><a name="2240"></a>2240</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;kid $kid-&gt;{NUM} to write $op-&gt;{KFD} to CODE&quot;</td></tr>
+<tr><td class="h"><a name="2241"></a>2241</td><td></td><td></td><td></td><td></td><td class="s">                  ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2242"></a>2242</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2243"></a>2243</td><td></td><td></td><td></td><td></td><td class="s">                  $op-&gt;open_pipe( $self-&gt;_debug_fd );</td></tr>
+<tr><td class="h"><a name="2244"></a>2244</td><td></td><td></td><td></td><td></td><td class="s">                  push @close_on_fail, $op-&gt;{FD}, $op-&gt;{TFD};</td></tr>
+<tr><td class="h"><a name="2245"></a>2245</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2246"></a>2246</td><td></td><td></td><td></td><td></td><td class="s">               else {</td></tr>
+<tr><td class="h"><a name="2247"></a>2247</td><td></td><td></td><td></td><td></td><td class="s">                  croak(</td></tr>
+<tr><td class="h"><a name="2248"></a>2248</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;'&quot;</td></tr>
+<tr><td class="h"><a name="2249"></a>2249</td><td></td><td></td><td></td><td></td><td class="s">                     . ref( $dest )</td></tr>
+<tr><td class="h"><a name="2250"></a>2250</td><td></td><td></td><td></td><td></td><td class="s">                     . &quot;' not allowed as a sink for output redirection&quot;</td></tr>
+<tr><td class="h"><a name="2251"></a>2251</td><td></td><td></td><td></td><td></td><td class="s">                  );</td></tr>
+<tr><td class="h"><a name="2252"></a>2252</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2253"></a>2253</td><td></td><td></td><td></td><td></td><td class="s">               $output_fds_accum[$op-&gt;{KFD}] = $op;</td></tr>
+<tr><td class="h"><a name="2254"></a>2254</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;_init_filters;</td></tr>
+<tr><td class="h"><a name="2255"></a>2255</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2256"></a>2256</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2257"></a>2257</td><td></td><td></td><td></td><td></td><td class="s">            elsif ( $op-&gt;{TYPE} eq '&gt;pipe' ) {</td></tr>
+<tr><td class="h"><a name="2258"></a>2258</td><td></td><td></td><td></td><td></td><td class="s">               ## N&gt; output redirection to a pipe we open, but don't select()</td></tr>
+<tr><td class="h"><a name="2259"></a>2259</td><td></td><td></td><td></td><td></td><td class="s">               ## on.</td></tr>
+<tr><td class="h"><a name="2260"></a>2260</td><td></td><td></td><td></td><td></td><td class="s">               _debug(</td></tr>
+<tr><td class="h"><a name="2261"></a>2261</td><td></td><td></td><td></td><td></td><td class="s">                  &quot;kid &quot;, $kid-&gt;{NUM}, &quot; to write &quot;, $op-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2262"></a>2262</td><td></td><td></td><td></td><td></td><td class="s">                  ' to a pipe IPC::Run opens and returns'</td></tr>
+<tr><td class="h"><a name="2263"></a>2263</td><td></td><td></td><td></td><td></td><td class="s">               ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2264"></a>2264</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2265"></a>2265</td><td></td><td></td><td></td><td></td><td class="s">               my ( $r, $w ) = $op-&gt;open_pipe( $self-&gt;_debug_fd, $op-&gt;{DEST} );</td></tr>
+<tr><td class="h"><a name="2266"></a>2266</td><td></td><td></td><td></td><td></td><td class="s">               _debug &quot;caller will read from &quot;, fileno $op-&gt;{DEST}</td></tr>
+<tr><td class="h"><a name="2267"></a>2267</td><td></td><td></td><td></td><td></td><td class="s">                  if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2268"></a>2268</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2269"></a>2269</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;{TFD} = $w;</td></tr>
+<tr><td class="h"><a name="2270"></a>2270</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;{FD}  = undef; # we don't manage this fd</td></tr>
+<tr><td class="h"><a name="2271"></a>2271</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;_init_filters;</td></tr>
+<tr><td class="h"><a name="2272"></a>2272</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2273"></a>2273</td><td></td><td></td><td></td><td></td><td class="s">               $output_fds_accum[$op-&gt;{KFD}] = $op;</td></tr>
+<tr><td class="h"><a name="2274"></a>2274</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2275"></a>2275</td><td></td><td></td><td></td><td></td><td class="s">            elsif ( $op-&gt;{TYPE} eq '&gt;pty&gt;' ) {</td></tr>
+<tr><td class="h"><a name="2276"></a>2276</td><td></td><td></td><td></td><td></td><td class="s">               my $dest = $op-&gt;{DEST};</td></tr>
+<tr><td class="h"><a name="2277"></a>2277</td><td></td><td></td><td></td><td></td><td class="s">               if ( UNIVERSAL::isa( $dest, 'SCALAR' ) ) {</td></tr>
+<tr><td class="h"><a name="2278"></a>2278</td><td></td><td></td><td></td><td></td><td class="s">                  _debug(</td></tr>
+<tr><td class="h"><a name="2279"></a>2279</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;kid &quot;, $kid-&gt;{NUM}, &quot; to write &quot;, $op-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2280"></a>2280</td><td></td><td></td><td></td><td></td><td class="s">                     &quot; to SCALAR via pty '&quot;, $op-&gt;{PTY_ID}, &quot;'&quot;</td></tr>
+<tr><td class="h"><a name="2281"></a>2281</td><td></td><td></td><td></td><td></td><td class="s">               ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2282"></a>2282</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2283"></a>2283</td><td></td><td></td><td></td><td></td><td class="s">                  $$dest = '' if $op-&gt;{TRUNC};</td></tr>
+<tr><td class="h"><a name="2284"></a>2284</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2285"></a>2285</td><td></td><td></td><td></td><td></td><td class="s">               elsif ( UNIVERSAL::isa( $dest, 'CODE' ) ) {</td></tr>
+<tr><td class="h"><a name="2286"></a>2286</td><td></td><td></td><td></td><td></td><td class="s">                  _debug(</td></tr>
+<tr><td class="h"><a name="2287"></a>2287</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;kid &quot;, $kid-&gt;{NUM}, &quot; to write &quot;, $op-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2288"></a>2288</td><td></td><td></td><td></td><td></td><td class="s">                     &quot; to CODE via pty '&quot;, $op-&gt;{PTY_ID}, &quot;'&quot;</td></tr>
+<tr><td class="h"><a name="2289"></a>2289</td><td></td><td></td><td></td><td></td><td class="s">                  ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2290"></a>2290</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2291"></a>2291</td><td></td><td></td><td></td><td></td><td class="s">               else {</td></tr>
+<tr><td class="h"><a name="2292"></a>2292</td><td></td><td></td><td></td><td></td><td class="s">                  croak(</td></tr>
+<tr><td class="h"><a name="2293"></a>2293</td><td></td><td></td><td></td><td></td><td class="s">                     &quot;'&quot;</td></tr>
+<tr><td class="h"><a name="2294"></a>2294</td><td></td><td></td><td></td><td></td><td class="s">                     . ref( $dest )</td></tr>
+<tr><td class="h"><a name="2295"></a>2295</td><td></td><td></td><td></td><td></td><td class="s">                     . &quot;' not allowed as a sink for output redirection&quot;</td></tr>
+<tr><td class="h"><a name="2296"></a>2296</td><td></td><td></td><td></td><td></td><td class="s">                  );</td></tr>
+<tr><td class="h"><a name="2297"></a>2297</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2298"></a>2298</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2299"></a>2299</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;{FD} = $self-&gt;{PTYS}-&gt;{$op-&gt;{PTY_ID}}-&gt;fileno;</td></tr>
+<tr><td class="h"><a name="2300"></a>2300</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;{TFD} = undef; # The fd isn't known until after fork().</td></tr>
+<tr><td class="h"><a name="2301"></a>2301</td><td></td><td></td><td></td><td></td><td class="s">               $output_fds_accum[$op-&gt;{KFD}] = $op;</td></tr>
+<tr><td class="h"><a name="2302"></a>2302</td><td></td><td></td><td></td><td></td><td class="s">               $op-&gt;_init_filters;</td></tr>
+<tr><td class="h"><a name="2303"></a>2303</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2304"></a>2304</td><td></td><td></td><td></td><td></td><td class="s">            elsif ( $op-&gt;{TYPE} eq '|' ) {</td></tr>
+<tr><td class="h"><a name="2305"></a>2305</td><td></td><td></td><td></td><td></td><td class="s">               _debug(</td></tr>
+<tr><td class="h"><a name="2306"></a>2306</td><td></td><td></td><td></td><td></td><td class="s">                  &quot;pipelining $kid-&gt;{NUM} and &quot;</td></tr>
+<tr><td class="h"><a name="2307"></a>2307</td><td></td><td></td><td></td><td></td><td class="s">                  . ( $kid-&gt;{NUM} + 1 )</td></tr>
+<tr><td class="h"><a name="2308"></a>2308</td><td></td><td></td><td></td><td></td><td class="s">               ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2309"></a>2309</td><td></td><td></td><td></td><td></td><td class="s">               ( $pipe_read_fd, $op-&gt;{TFD} ) = _pipe;</td></tr>
+<tr><td class="h"><a name="2310"></a>2310</td><td></td><td></td><td></td><td></td><td class="s">               if ( Win32_MODE ) {</td></tr>
+<tr><td class="h"><a name="2311"></a>2311</td><td></td><td></td><td></td><td></td><td class="s">                  _dont_inherit( $pipe_read_fd );</td></tr>
+<tr><td class="h"><a name="2312"></a>2312</td><td></td><td></td><td></td><td></td><td class="s">                  _dont_inherit( $op-&gt;{TFD} );</td></tr>
+<tr><td class="h"><a name="2313"></a>2313</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2314"></a>2314</td><td></td><td></td><td></td><td></td><td class="s">               @output_fds_accum = ();</td></tr>
+<tr><td class="h"><a name="2315"></a>2315</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2316"></a>2316</td><td></td><td></td><td></td><td></td><td class="s">            elsif ( $op-&gt;{TYPE} eq '&amp;' ) {</td></tr>
+<tr><td class="h"><a name="2317"></a>2317</td><td></td><td></td><td></td><td></td><td class="s">               @output_fds_accum = ();</td></tr>
+<tr><td class="h"><a name="2318"></a>2318</td><td></td><td></td><td></td><td></td><td class="s">            } # end if $op-&gt;{TYPE} tree</td></tr>
+<tr><td class="h"><a name="2319"></a>2319</td><td></td><td></td><td></td><td></td><td class="s">            1;</td></tr>
+<tr><td class="h"><a name="2320"></a>2320</td><td></td><td></td><td></td><td></td><td class="s">         }; # end eval</td></tr>
+<tr><td class="h"><a name="2321"></a>2321</td><td></td><td></td><td></td><td></td><td class="s">         unless ( $ok ) {</td></tr>
+<tr><td class="h"><a name="2322"></a>2322</td><td></td><td></td><td></td><td></td><td class="s">            push @errs, $@;</td></tr>
+<tr><td class="h"><a name="2323"></a>2323</td><td></td><td></td><td></td><td></td><td class="s">            _debug 'caught ', $@ if _debugging;</td></tr>
+<tr><td class="h"><a name="2324"></a>2324</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2325"></a>2325</td><td></td><td></td><td></td><td></td><td class="s">      } # end for ( OPS }</td></tr>
+<tr><td class="h"><a name="2326"></a>2326</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2327"></a>2327</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2328"></a>2328</td><td></td><td></td><td></td><td></td><td class="s">   if ( @errs ) {</td></tr>
+<tr><td class="h"><a name="2329"></a>2329</td><td></td><td></td><td></td><td></td><td class="s">      for ( @close_on_fail ) {</td></tr>
+<tr><td class="h"><a name="2330"></a>2330</td><td></td><td></td><td></td><td></td><td class="s">         _close( $_ );</td></tr>
+<tr><td class="h"><a name="2331"></a>2331</td><td></td><td></td><td></td><td></td><td class="s">         $_ = undef;</td></tr>
+<tr><td class="h"><a name="2332"></a>2332</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2333"></a>2333</td><td></td><td></td><td></td><td></td><td class="s">      for ( keys %{$self-&gt;{PTYS}} ) {</td></tr>
+<tr><td class="h"><a name="2334"></a>2334</td><td></td><td></td><td></td><td></td><td class="s">         next unless $self-&gt;{PTYS}-&gt;{$_};</td></tr>
+<tr><td class="h"><a name="2335"></a>2335</td><td></td><td></td><td></td><td></td><td class="s">         close $self-&gt;{PTYS}-&gt;{$_};</td></tr>
+<tr><td class="h"><a name="2336"></a>2336</td><td></td><td></td><td></td><td></td><td class="s">         $self-&gt;{PTYS}-&gt;{$_} = undef;</td></tr>
+<tr><td class="h"><a name="2337"></a>2337</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2338"></a>2338</td><td></td><td></td><td></td><td></td><td class="s">      die join( '', @errs )</td></tr>
+<tr><td class="h"><a name="2339"></a>2339</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2340"></a>2340</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2341"></a>2341</td><td></td><td></td><td></td><td></td><td class="s">   ## give all but the last child all of the output file descriptors</td></tr>
+<tr><td class="h"><a name="2342"></a>2342</td><td></td><td></td><td></td><td></td><td class="s">   ## These will be reopened (and thus rendered useless) if the child</td></tr>
+<tr><td class="h"><a name="2343"></a>2343</td><td></td><td></td><td></td><td></td><td class="s">   ## dup2s on to these descriptors, since we unshift these.  This way</td></tr>
+<tr><td class="h"><a name="2344"></a>2344</td><td></td><td></td><td></td><td></td><td class="s">   ## each process emits output to the same file descriptors that the</td></tr>
+<tr><td class="h"><a name="2345"></a>2345</td><td></td><td></td><td></td><td></td><td class="s">   ## last child will write to.  This is probably not quite correct,</td></tr>
+<tr><td class="h"><a name="2346"></a>2346</td><td></td><td></td><td></td><td></td><td class="s">   ## since each child should write to the file descriptors inherited</td></tr>
+<tr><td class="h"><a name="2347"></a>2347</td><td></td><td></td><td></td><td></td><td class="s">   ## from the parent.</td></tr>
+<tr><td class="h"><a name="2348"></a>2348</td><td></td><td></td><td></td><td></td><td class="s">   ## TODO: fix the inheritance of output file descriptors.</td></tr>
+<tr><td class="h"><a name="2349"></a>2349</td><td></td><td></td><td></td><td></td><td class="s">   ## NOTE: This sharing of OPS among kids means that we can't easily put</td></tr>
+<tr><td class="h"><a name="2350"></a>2350</td><td></td><td></td><td></td><td></td><td class="s">   ## a kid number in each OPS structure to ping the kid when all ops</td></tr>
+<tr><td class="h"><a name="2351"></a>2351</td><td></td><td></td><td></td><td></td><td class="s">   ## have closed (when $self-&gt;{PIPES} has emptied).  This means that we</td></tr>
+<tr><td class="h"><a name="2352"></a>2352</td><td></td><td></td><td></td><td></td><td class="s">   ## need to scan the KIDS whenever @{$self-&gt;{PIPES}} is empty to see</td></tr>
+<tr><td class="h"><a name="2353"></a>2353</td><td></td><td></td><td></td><td></td><td class="s">   ## if there any of them are still alive.</td></tr>
+<tr><td class="h"><a name="2354"></a>2354</td><td></td><td></td><td></td><td></td><td class="s">   for ( my $num = 0; $num &lt; $#{$self-&gt;{KIDS}}; ++$num ) {</td></tr>
+<tr><td class="h"><a name="2355"></a>2355</td><td></td><td></td><td></td><td></td><td class="s">      for ( reverse @output_fds_accum ) {</td></tr>
+<tr><td class="h"><a name="2356"></a>2356</td><td></td><td></td><td></td><td></td><td class="s">         next unless defined $_;</td></tr>
+<tr><td class="h"><a name="2357"></a>2357</td><td></td><td></td><td></td><td></td><td class="s">         _debug(</td></tr>
+<tr><td class="h"><a name="2358"></a>2358</td><td></td><td></td><td></td><td></td><td class="s">            'kid ', $self-&gt;{KIDS}-&gt;[$num]-&gt;{NUM}, ' also to write ', $_-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2359"></a>2359</td><td></td><td></td><td></td><td></td><td class="s">            ' to ', ref $_-&gt;{DEST}</td></tr>
+<tr><td class="h"><a name="2360"></a>2360</td><td></td><td></td><td></td><td></td><td class="s">         ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2361"></a>2361</td><td></td><td></td><td></td><td></td><td class="s">         unshift @{$self-&gt;{KIDS}-&gt;[$num]-&gt;{OPS}}, $_;</td></tr>
+<tr><td class="h"><a name="2362"></a>2362</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2363"></a>2363</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2364"></a>2364</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2365"></a>2365</td><td></td><td></td><td></td><td></td><td class="s">   ## Open the debug pipe if we need it</td></tr>
+<tr><td class="h"><a name="2366"></a>2366</td><td></td><td></td><td></td><td></td><td class="s">   ## Create the list of PIPES we need to scan and the bit vectors needed by</td></tr>
+<tr><td class="h"><a name="2367"></a>2367</td><td></td><td></td><td></td><td></td><td class="s">   ## select().  Do this first so that _cleanup can _clobber() them if an</td></tr>
+<tr><td class="h"><a name="2368"></a>2368</td><td></td><td></td><td></td><td></td><td class="s">   ## exception occurs.</td></tr>
+<tr><td class="h"><a name="2369"></a>2369</td><td></td><td></td><td></td><td></td><td class="s">   @{$self-&gt;{PIPES}} = ();</td></tr>
+<tr><td class="h"><a name="2370"></a>2370</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{RIN} = '';</td></tr>
+<tr><td class="h"><a name="2371"></a>2371</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{WIN} = '';</td></tr>
+<tr><td class="h"><a name="2372"></a>2372</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{EIN} = '';</td></tr>
+<tr><td class="h"><a name="2373"></a>2373</td><td></td><td></td><td></td><td></td><td class="s">   ## PIN is a vec()tor that indicates who's paused.</td></tr>
+<tr><td class="h"><a name="2374"></a>2374</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{PIN} = '';</td></tr>
+<tr><td class="h"><a name="2375"></a>2375</td><td></td><td></td><td></td><td></td><td class="s">   for my $kid ( @{$self-&gt;{KIDS}} ) {</td></tr>
+<tr><td class="h"><a name="2376"></a>2376</td><td></td><td></td><td></td><td></td><td class="s">      for ( @{$kid-&gt;{OPS}} ) {</td></tr>
+<tr><td class="h"><a name="2377"></a>2377</td><td></td><td></td><td></td><td></td><td class="s">         if ( defined $_-&gt;{FD} ) {</td></tr>
+<tr><td class="h"><a name="2378"></a>2378</td><td></td><td></td><td></td><td></td><td class="s">            _debug(</td></tr>
+<tr><td class="h"><a name="2379"></a>2379</td><td></td><td></td><td></td><td></td><td class="s">               'kid ', $kid-&gt;{NUM}, '[', $kid-&gt;{PID}, &quot;]'s &quot;, $_-&gt;{KFD},</td></tr>
+<tr><td class="h"><a name="2380"></a>2380</td><td></td><td></td><td></td><td></td><td class="s">               ' is my ', $_-&gt;{FD}</td></tr>
+<tr><td class="h"><a name="2381"></a>2381</td><td></td><td></td><td></td><td></td><td class="s">            ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2382"></a>2382</td><td></td><td></td><td></td><td></td><td class="s">            vec( $self-&gt;{ $_-&gt;{TYPE} =~ /^&lt;/ ? 'WIN' : 'RIN' }, $_-&gt;{FD}, 1 ) = 1;</td></tr>
+<tr><td class="h"><a name="2383"></a>2383</td><td></td><td></td><td></td><td></td><td class="s">#            vec( $self-&gt;{EIN}, $_-&gt;{FD}, 1 ) = 1;</td></tr>
+<tr><td class="h"><a name="2384"></a>2384</td><td></td><td></td><td></td><td></td><td class="s">            push @{$self-&gt;{PIPES}}, $_;</td></tr>
+<tr><td class="h"><a name="2385"></a>2385</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2386"></a>2386</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2387"></a>2387</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2388"></a>2388</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2389"></a>2389</td><td></td><td></td><td></td><td></td><td class="s">   for my $io ( @{$self-&gt;{IOS}} ) {</td></tr>
+<tr><td class="h"><a name="2390"></a>2390</td><td></td><td></td><td></td><td></td><td class="s">      my $fd = $io-&gt;fileno;</td></tr>
+<tr><td class="h"><a name="2391"></a>2391</td><td></td><td></td><td></td><td></td><td class="s">      vec( $self-&gt;{RIN}, $fd, 1 ) = 1 if $io-&gt;mode =~ /r/;</td></tr>
+<tr><td class="h"><a name="2392"></a>2392</td><td></td><td></td><td></td><td></td><td class="s">      vec( $self-&gt;{WIN}, $fd, 1 ) = 1 if $io-&gt;mode =~ /w/;</td></tr>
+<tr><td class="h"><a name="2393"></a>2393</td><td></td><td></td><td></td><td></td><td class="s">#      vec( $self-&gt;{EIN}, $fd, 1 ) = 1;</td></tr>
+<tr><td class="h"><a name="2394"></a>2394</td><td></td><td></td><td></td><td></td><td class="s">      push @{$self-&gt;{PIPES}}, $io;</td></tr>
+<tr><td class="h"><a name="2395"></a>2395</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2396"></a>2396</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2397"></a>2397</td><td></td><td></td><td></td><td></td><td class="s">   ## Put filters on the end of the filter chains to read &amp; write the pipes.</td></tr>
+<tr><td class="h"><a name="2398"></a>2398</td><td></td><td></td><td></td><td></td><td class="s">   ## Clear pipe states</td></tr>
+<tr><td class="h"><a name="2399"></a>2399</td><td></td><td></td><td></td><td></td><td class="s">   for my $pipe ( @{$self-&gt;{PIPES}} ) {</td></tr>
+<tr><td class="h"><a name="2400"></a>2400</td><td></td><td></td><td></td><td></td><td class="s">      $pipe-&gt;{SOURCE_EMPTY} = 0;</td></tr>
+<tr><td class="h"><a name="2401"></a>2401</td><td></td><td></td><td></td><td></td><td class="s">      $pipe-&gt;{PAUSED} = 0;</td></tr>
+<tr><td class="h"><a name="2402"></a>2402</td><td></td><td></td><td></td><td></td><td class="s">      if ( $pipe-&gt;{TYPE} =~ /^&gt;/ ) {</td></tr>
+<tr><td class="h"><a name="2403"></a>2403</td><td></td><td></td><td></td><td></td><td class="s">         my $pipe_reader = sub {</td></tr>
+<tr><td class="h"><a name="2404"></a>2404</td><td></td><td></td><td></td><td></td><td class="s">            my ( undef, $out_ref ) = @_;</td></tr>
+<tr><td class="h"><a name="2405"></a>2405</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2406"></a>2406</td><td></td><td></td><td></td><td></td><td class="s">            return undef unless defined $pipe-&gt;{FD};</td></tr>
+<tr><td class="h"><a name="2407"></a>2407</td><td></td><td></td><td></td><td></td><td class="s">            return 0 unless vec( $self-&gt;{ROUT}, $pipe-&gt;{FD}, 1 );</td></tr>
+<tr><td class="h"><a name="2408"></a>2408</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2409"></a>2409</td><td></td><td></td><td></td><td></td><td class="s">            vec( $self-&gt;{ROUT}, $pipe-&gt;{FD}, 1 ) = 0;</td></tr>
+<tr><td class="h"><a name="2410"></a>2410</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2411"></a>2411</td><td></td><td></td><td></td><td></td><td class="s">            _debug_desc_fd( 'reading from', $pipe ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2412"></a>2412</td><td></td><td></td><td></td><td></td><td class="s">            my $in = eval { _read( $pipe-&gt;{FD} ) };</td></tr>
+<tr><td class="h"><a name="2413"></a>2413</td><td></td><td></td><td></td><td></td><td class="s">            if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="2414"></a>2414</td><td></td><td></td><td></td><td></td><td class="s">               $in = '';</td></tr>
+<tr><td class="h"><a name="2415"></a>2415</td><td></td><td></td><td></td><td></td><td class="s">               ## IO::Pty throws the Input/output error if the kid dies.</td></tr>
+<tr><td class="h"><a name="2416"></a>2416</td><td></td><td></td><td></td><td></td><td class="s">               ## read() throws the bad file descriptor message if the</td></tr>
+<tr><td class="h"><a name="2417"></a>2417</td><td></td><td></td><td></td><td></td><td class="s">               ## kid dies on Win32.</td></tr>
+<tr><td class="h"><a name="2418"></a>2418</td><td></td><td></td><td></td><td></td><td class="s">               die $@ unless</td></tr>
+<tr><td class="h"><a name="2419"></a>2419</td><td></td><td></td><td></td><td></td><td class="s">                  $@ =~ $_EIO ||</td></tr>
+<tr><td class="h"><a name="2420"></a>2420</td><td></td><td></td><td></td><td></td><td class="s">                  ($@ =~ /input or output/ &amp;&amp; $^O =~ /aix/) </td></tr>
+<tr><td class="h"><a name="2421"></a>2421</td><td></td><td></td><td></td><td></td><td class="s">                  || ( Win32_MODE &amp;&amp; $@ =~ /Bad file descriptor/ );</td></tr>
+<tr><td class="h"><a name="2422"></a>2422</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2423"></a>2423</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2424"></a>2424</td><td></td><td></td><td></td><td></td><td class="s">            unless ( length $in ) {</td></tr>
+<tr><td class="h"><a name="2425"></a>2425</td><td></td><td></td><td></td><td></td><td class="s">               $self-&gt;_clobber( $pipe );</td></tr>
+<tr><td class="h"><a name="2426"></a>2426</td><td></td><td></td><td></td><td></td><td class="s">               return undef;</td></tr>
+<tr><td class="h"><a name="2427"></a>2427</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2428"></a>2428</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2429"></a>2429</td><td></td><td></td><td></td><td></td><td class="s">            ## Protect the position so /.../g matches may be used.</td></tr>
+<tr><td class="h"><a name="2430"></a>2430</td><td></td><td></td><td></td><td></td><td class="s">            my $pos = pos $$out_ref;</td></tr>
+<tr><td class="h"><a name="2431"></a>2431</td><td></td><td></td><td></td><td></td><td class="s">            $$out_ref .= $in;</td></tr>
+<tr><td class="h"><a name="2432"></a>2432</td><td></td><td></td><td></td><td></td><td class="s">            pos( $$out_ref ) = $pos;</td></tr>
+<tr><td class="h"><a name="2433"></a>2433</td><td></td><td></td><td></td><td></td><td class="s">            return 1;</td></tr>
+<tr><td class="h"><a name="2434"></a>2434</td><td></td><td></td><td></td><td></td><td class="s">         };</td></tr>
+<tr><td class="h"><a name="2435"></a>2435</td><td></td><td></td><td></td><td></td><td class="s">         ## Input filters are the last filters</td></tr>
+<tr><td class="h"><a name="2436"></a>2436</td><td></td><td></td><td></td><td></td><td class="s">         push @{$pipe-&gt;{FILTERS}}, $pipe_reader;</td></tr>
+<tr><td class="h"><a name="2437"></a>2437</td><td></td><td></td><td></td><td></td><td class="s">         push @{$self-&gt;{TEMP_FILTERS}}, $pipe_reader;</td></tr>
+<tr><td class="h"><a name="2438"></a>2438</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2439"></a>2439</td><td></td><td></td><td></td><td></td><td class="s">      else {</td></tr>
+<tr><td class="h"><a name="2440"></a>2440</td><td></td><td></td><td></td><td></td><td class="s">         my $pipe_writer = sub {</td></tr>
+<tr><td class="h"><a name="2441"></a>2441</td><td></td><td></td><td></td><td></td><td class="s">            my ( $in_ref, $out_ref ) = @_;</td></tr>
+<tr><td class="h"><a name="2442"></a>2442</td><td></td><td></td><td></td><td></td><td class="s">            return undef unless defined $pipe-&gt;{FD};</td></tr>
+<tr><td class="h"><a name="2443"></a>2443</td><td></td><td></td><td></td><td></td><td class="s">            return 0</td></tr>
+<tr><td class="h"><a name="2444"></a>2444</td><td></td><td></td><td></td><td></td><td class="s">               unless vec( $self-&gt;{WOUT}, $pipe-&gt;{FD}, 1 )</td></tr>
+<tr><td class="h"><a name="2445"></a>2445</td><td></td><td></td><td></td><td></td><td class="s">                  || $pipe-&gt;{PAUSED};</td></tr>
+<tr><td class="h"><a name="2446"></a>2446</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2447"></a>2447</td><td></td><td></td><td></td><td></td><td class="s">            vec( $self-&gt;{WOUT}, $pipe-&gt;{FD}, 1 ) = 0;</td></tr>
+<tr><td class="h"><a name="2448"></a>2448</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2449"></a>2449</td><td></td><td></td><td></td><td></td><td class="s">            if ( ! length $$in_ref ) {</td></tr>
+<tr><td class="h"><a name="2450"></a>2450</td><td></td><td></td><td></td><td></td><td class="s">               if ( ! defined get_more_input ) {</td></tr>
+<tr><td class="h"><a name="2451"></a>2451</td><td></td><td></td><td></td><td></td><td class="s">                  $self-&gt;_clobber( $pipe );</td></tr>
+<tr><td class="h"><a name="2452"></a>2452</td><td></td><td></td><td></td><td></td><td class="s">                  return undef;</td></tr>
+<tr><td class="h"><a name="2453"></a>2453</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2454"></a>2454</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2455"></a>2455</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2456"></a>2456</td><td></td><td></td><td></td><td></td><td class="s">            unless ( length $$in_ref ) {</td></tr>
+<tr><td class="h"><a name="2457"></a>2457</td><td></td><td></td><td></td><td></td><td class="s">               unless ( $pipe-&gt;{PAUSED} ) {</td></tr>
+<tr><td class="h"><a name="2458"></a>2458</td><td></td><td></td><td></td><td></td><td class="s">                  _debug_desc_fd( 'pausing', $pipe ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2459"></a>2459</td><td></td><td></td><td></td><td></td><td class="s">                  vec( $self-&gt;{WIN}, $pipe-&gt;{FD}, 1 ) = 0;</td></tr>
+<tr><td class="h"><a name="2460"></a>2460</td><td></td><td></td><td></td><td></td><td class="s">#                  vec( $self-&gt;{EIN}, $pipe-&gt;{FD}, 1 ) = 0;</td></tr>
+<tr><td class="h"><a name="2461"></a>2461</td><td></td><td></td><td></td><td></td><td class="s">                  vec( $self-&gt;{PIN}, $pipe-&gt;{FD}, 1 ) = 1;</td></tr>
+<tr><td class="h"><a name="2462"></a>2462</td><td></td><td></td><td></td><td></td><td class="s">                  $pipe-&gt;{PAUSED} = 1;</td></tr>
+<tr><td class="h"><a name="2463"></a>2463</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2464"></a>2464</td><td></td><td></td><td></td><td></td><td class="s">               return 0;</td></tr>
+<tr><td class="h"><a name="2465"></a>2465</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2466"></a>2466</td><td></td><td></td><td></td><td></td><td class="s">            _debug_desc_fd( 'writing to', $pipe ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2467"></a>2467</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2468"></a>2468</td><td></td><td></td><td></td><td></td><td class="s">            my $c = _write( $pipe-&gt;{FD}, $$in_ref );</td></tr>
+<tr><td class="h"><a name="2469"></a>2469</td><td></td><td></td><td></td><td></td><td class="s">            substr( $$in_ref, 0, $c, '' );</td></tr>
+<tr><td class="h"><a name="2470"></a>2470</td><td></td><td></td><td></td><td></td><td class="s">            return 1;</td></tr>
+<tr><td class="h"><a name="2471"></a>2471</td><td></td><td></td><td></td><td></td><td class="s">         };</td></tr>
+<tr><td class="h"><a name="2472"></a>2472</td><td></td><td></td><td></td><td></td><td class="s">         ## Output filters are the first filters</td></tr>
+<tr><td class="h"><a name="2473"></a>2473</td><td></td><td></td><td></td><td></td><td class="s">         unshift @{$pipe-&gt;{FILTERS}}, $pipe_writer;</td></tr>
+<tr><td class="h"><a name="2474"></a>2474</td><td></td><td></td><td></td><td></td><td class="s">         push    @{$self-&gt;{TEMP_FILTERS}}, $pipe_writer;</td></tr>
+<tr><td class="h"><a name="2475"></a>2475</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2476"></a>2476</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2477"></a>2477</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="2478"></a>2478</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2479"></a>2479</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2480"></a>2480</td><td></td><td></td><td></td><td></td><td class="s">sub _dup2_gently {</td></tr>
+<tr><td class="h"><a name="2481"></a>2481</td><td></td><td></td><td></td><td></td><td class="s">   ## A METHOD, NOT A FUNCTION, NEEDS $self!</td></tr>
+<tr><td class="h"><a name="2482"></a>2482</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="2483"></a>2483</td><td></td><td></td><td></td><td></td><td class="s">   my ( $files, $fd1, $fd2 ) = @_;</td></tr>
+<tr><td class="h"><a name="2484"></a>2484</td><td></td><td></td><td></td><td></td><td class="s">   ## Moves TFDs that are using the destination fd out of the</td></tr>
+<tr><td class="h"><a name="2485"></a>2485</td><td></td><td></td><td></td><td></td><td class="s">   ## way before calling _dup2</td></tr>
+<tr><td class="h"><a name="2486"></a>2486</td><td></td><td></td><td></td><td></td><td class="s">   for ( @$files ) {</td></tr>
+<tr><td class="h"><a name="2487"></a>2487</td><td></td><td></td><td></td><td></td><td class="s">      next unless defined $_-&gt;{TFD};</td></tr>
+<tr><td class="h"><a name="2488"></a>2488</td><td></td><td></td><td></td><td></td><td class="s">      $_-&gt;{TFD} = _dup( $_-&gt;{TFD} ) if $_-&gt;{TFD} == $fd2;</td></tr>
+<tr><td class="h"><a name="2489"></a>2489</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2490"></a>2490</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{DEBUG_FD} = _dup $self-&gt;{DEBUG_FD}</td></tr>
+<tr><td class="h"><a name="2491"></a>2491</td><td></td><td></td><td></td><td></td><td class="s">      if defined $self-&gt;{DEBUG_FD} &amp;&amp; $self-&gt;{DEBUG_FD} == $fd2;</td></tr>
+<tr><td class="h"><a name="2492"></a>2492</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2493"></a>2493</td><td></td><td></td><td></td><td></td><td class="s">   _dup2_rudely( $fd1, $fd2 );</td></tr>
+<tr><td class="h"><a name="2494"></a>2494</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="2495"></a>2495</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2496"></a>2496</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="2497"></a>2497</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2498"></a>2498</td><td></td><td></td><td></td><td></td><td class="s">=item close_terminal</td></tr>
+<tr><td class="h"><a name="2499"></a>2499</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2500"></a>2500</td><td></td><td></td><td></td><td></td><td class="s">This is used as (or in) an init sub to cast off the bonds of a controlling</td></tr>
+<tr><td class="h"><a name="2501"></a>2501</td><td></td><td></td><td></td><td></td><td class="s">terminal.  It must precede all other redirection ops that affect</td></tr>
+<tr><td class="h"><a name="2502"></a>2502</td><td></td><td></td><td></td><td></td><td class="s">STDIN, STDOUT, or STDERR to be guaranteed effective.</td></tr>
+<tr><td class="h"><a name="2503"></a>2503</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2504"></a>2504</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="2505"></a>2505</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2506"></a>2506</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2507"></a>2507</td><td></td><td></td><td></td><td></td><td class="s">sub close_terminal {</td></tr>
+<tr><td class="h"><a name="2508"></a>2508</td><td></td><td></td><td></td><td></td><td class="s">   ## Cast of the bonds of a controlling terminal</td></tr>
+<tr><td class="h"><a name="2509"></a>2509</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2510"></a>2510</td><td></td><td></td><td></td><td></td><td class="s">   POSIX::setsid() || croak &quot;POSIX::setsid() failed&quot;;</td></tr>
+<tr><td class="h"><a name="2511"></a>2511</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;closing stdin, out, err&quot;</td></tr>
+<tr><td class="h"><a name="2512"></a>2512</td><td></td><td></td><td></td><td></td><td class="s">      if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2513"></a>2513</td><td></td><td></td><td></td><td></td><td class="s">   close STDIN;</td></tr>
+<tr><td class="h"><a name="2514"></a>2514</td><td></td><td></td><td></td><td></td><td class="s">   close STDERR;</td></tr>
+<tr><td class="h"><a name="2515"></a>2515</td><td></td><td></td><td></td><td></td><td class="s">   close STDOUT;</td></tr>
+<tr><td class="h"><a name="2516"></a>2516</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="2517"></a>2517</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2518"></a>2518</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2519"></a>2519</td><td></td><td></td><td></td><td></td><td class="s">sub _do_kid_and_exit {</td></tr>
+<tr><td class="h"><a name="2520"></a>2520</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="2521"></a>2521</td><td></td><td></td><td></td><td></td><td class="s">   my ( $kid ) = @_;</td></tr>
+<tr><td class="h"><a name="2522"></a>2522</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2523"></a>2523</td><td></td><td></td><td></td><td></td><td class="s">   ## For unknown reasons, placing these two statements in the eval{}</td></tr>
+<tr><td class="h"><a name="2524"></a>2524</td><td></td><td></td><td></td><td></td><td class="s">   ## causes the eval {} to not catch errors after they are executed in</td></tr>
+<tr><td class="h"><a name="2525"></a>2525</td><td></td><td></td><td></td><td></td><td class="s">   ## perl 5.6.0, godforsaken version that it is...not sure about 5.6.1.</td></tr>
+<tr><td class="h"><a name="2526"></a>2526</td><td></td><td></td><td></td><td></td><td class="s">   ## Part of this could be that these symbols get destructed when</td></tr>
+<tr><td class="h"><a name="2527"></a>2527</td><td></td><td></td><td></td><td></td><td class="s">   ## exiting the eval, and that destruction might be what's (wrongly)</td></tr>
+<tr><td class="h"><a name="2528"></a>2528</td><td></td><td></td><td></td><td></td><td class="s">   ## confusing the eval{}, allowing the exception to probpogate.</td></tr>
+<tr><td class="h"><a name="2529"></a>2529</td><td></td><td></td><td></td><td></td><td class="s">   my $s1 = gensym;</td></tr>
+<tr><td class="h"><a name="2530"></a>2530</td><td></td><td></td><td></td><td></td><td class="s">   my $s2 = gensym;</td></tr>
+<tr><td class="h"><a name="2531"></a>2531</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2532"></a>2532</td><td></td><td></td><td></td><td></td><td class="s">   eval {</td></tr>
+<tr><td class="h"><a name="2533"></a>2533</td><td></td><td></td><td></td><td></td><td class="s">      local $cur_self = $self;</td></tr>
+<tr><td class="h"><a name="2534"></a>2534</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2535"></a>2535</td><td></td><td></td><td></td><td></td><td class="s">      _set_child_debug_name( ref $kid-&gt;{VAL} eq &quot;CODE&quot;</td></tr>
+<tr><td class="h"><a name="2536"></a>2536</td><td></td><td></td><td></td><td></td><td class="s">         ? &quot;CODE&quot;</td></tr>
+<tr><td class="h"><a name="2537"></a>2537</td><td></td><td></td><td></td><td></td><td class="s">         : basename( $kid-&gt;{VAL}-&gt;[0] )</td></tr>
+<tr><td class="h"><a name="2538"></a>2538</td><td></td><td></td><td></td><td></td><td class="s">      );</td></tr>
+<tr><td class="h"><a name="2539"></a>2539</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2540"></a>2540</td><td></td><td></td><td></td><td></td><td class="s">      ## close parent FD's first so they're out of the way.</td></tr>
+<tr><td class="h"><a name="2541"></a>2541</td><td></td><td></td><td></td><td></td><td class="s">      ## Don't close STDIN, STDOUT, STDERR: they should be inherited or</td></tr>
+<tr><td class="h"><a name="2542"></a>2542</td><td></td><td></td><td></td><td></td><td class="s">      ## overwritten below.</td></tr>
+<tr><td class="h"><a name="2543"></a>2543</td><td></td><td></td><td></td><td></td><td class="s">      my @needed = $self-&gt;{noinherit} ? () : ( 1, 1, 1 );</td></tr>
+<tr><td class="h"><a name="2544"></a>2544</td><td></td><td></td><td></td><td></td><td class="s">      $needed[ $self-&gt;{SYNC_WRITER_FD} ] = 1;</td></tr>
+<tr><td class="h"><a name="2545"></a>2545</td><td></td><td></td><td></td><td></td><td class="s">      $needed[ $self-&gt;{DEBUG_FD} ] = 1 if defined $self-&gt;{DEBUG_FD};</td></tr>
+<tr><td class="h"><a name="2546"></a>2546</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2547"></a>2547</td><td></td><td></td><td></td><td></td><td class="s">      for ( @{$kid-&gt;{OPS}} ) {</td></tr>
+<tr><td class="h"><a name="2548"></a>2548</td><td></td><td></td><td></td><td></td><td class="s">         $needed[ $_-&gt;{TFD} ] = 1 if defined $_-&gt;{TFD};</td></tr>
+<tr><td class="h"><a name="2549"></a>2549</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2550"></a>2550</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2551"></a>2551</td><td></td><td></td><td></td><td></td><td class="s">      ## TODO: use the forthcoming IO::Pty to close the terminal and</td></tr>
+<tr><td class="h"><a name="2552"></a>2552</td><td></td><td></td><td></td><td></td><td class="s">      ## make the first pty for this child the controlling terminal.</td></tr>
+<tr><td class="h"><a name="2553"></a>2553</td><td></td><td></td><td></td><td></td><td class="s">      ## This will also make it so that pty-laden kids don't cause</td></tr>
+<tr><td class="h"><a name="2554"></a>2554</td><td></td><td></td><td></td><td></td><td class="s">      ## other kids to lose stdin/stdout/stderr.</td></tr>
+<tr><td class="h"><a name="2555"></a>2555</td><td></td><td></td><td></td><td></td><td class="s">      my @closed;</td></tr>
+<tr><td class="h"><a name="2556"></a>2556</td><td></td><td></td><td></td><td></td><td class="s">      if ( %{$self-&gt;{PTYS}} ) {</td></tr>
+<tr><td class="h"><a name="2557"></a>2557</td><td></td><td></td><td></td><td></td><td class="s">         ## Clean up the parent's fds.</td></tr>
+<tr><td class="h"><a name="2558"></a>2558</td><td></td><td></td><td></td><td></td><td class="s">         for ( keys %{$self-&gt;{PTYS}} ) {</td></tr>
+<tr><td class="h"><a name="2559"></a>2559</td><td></td><td></td><td></td><td></td><td class="s">            _debug &quot;Cleaning up parent's ptty '$_'&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2560"></a>2560</td><td></td><td></td><td></td><td></td><td class="s">            my $slave = $self-&gt;{PTYS}-&gt;{$_}-&gt;slave;</td></tr>
+<tr><td class="h"><a name="2561"></a>2561</td><td></td><td></td><td></td><td></td><td class="s">            $closed[ $self-&gt;{PTYS}-&gt;{$_}-&gt;fileno ] = 1;</td></tr>
+<tr><td class="h"><a name="2562"></a>2562</td><td></td><td></td><td></td><td></td><td class="s">            close $self-&gt;{PTYS}-&gt;{$_};</td></tr>
+<tr><td class="h"><a name="2563"></a>2563</td><td></td><td></td><td></td><td></td><td class="s">            $self-&gt;{PTYS}-&gt;{$_} = $slave;</td></tr>
+<tr><td class="h"><a name="2564"></a>2564</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2565"></a>2565</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2566"></a>2566</td><td></td><td></td><td></td><td></td><td class="s">         close_terminal;</td></tr>
+<tr><td class="h"><a name="2567"></a>2567</td><td></td><td></td><td></td><td></td><td class="s">         $closed[ $_ ] = 1 for ( 0..2 );</td></tr>
+<tr><td class="h"><a name="2568"></a>2568</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2569"></a>2569</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2570"></a>2570</td><td></td><td></td><td></td><td></td><td class="s">      for my $sibling ( @{$self-&gt;{KIDS}} ) {</td></tr>
+<tr><td class="h"><a name="2571"></a>2571</td><td></td><td></td><td></td><td></td><td class="s">         for ( @{$sibling-&gt;{OPS}} ) {</td></tr>
+<tr><td class="h"><a name="2572"></a>2572</td><td></td><td></td><td></td><td></td><td class="s">            if ( $_-&gt;{TYPE} =~ /^.pty.$/ ) {</td></tr>
+<tr><td class="h"><a name="2573"></a>2573</td><td></td><td></td><td></td><td></td><td class="s">               $_-&gt;{TFD} = $self-&gt;{PTYS}-&gt;{$_-&gt;{PTY_ID}}-&gt;fileno;</td></tr>
+<tr><td class="h"><a name="2574"></a>2574</td><td></td><td></td><td></td><td></td><td class="s">               $needed[$_-&gt;{TFD}] = 1;</td></tr>
+<tr><td class="h"><a name="2575"></a>2575</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2576"></a>2576</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2577"></a>2577</td><td></td><td></td><td></td><td></td><td class="s">#            for ( $_-&gt;{FD}, ( $sibling != $kid ? $_-&gt;{TFD} : () ) ) {</td></tr>
+<tr><td class="h"><a name="2578"></a>2578</td><td></td><td></td><td></td><td></td><td class="s">#               if ( defined $_ &amp;&amp; ! $closed[$_] &amp;&amp; ! $needed[$_] ) {</td></tr>
+<tr><td class="h"><a name="2579"></a>2579</td><td></td><td></td><td></td><td></td><td class="s">#                  _close( $_ );</td></tr>
+<tr><td class="h"><a name="2580"></a>2580</td><td></td><td></td><td></td><td></td><td class="s">#                  $closed[$_] = 1;</td></tr>
+<tr><td class="h"><a name="2581"></a>2581</td><td></td><td></td><td></td><td></td><td class="s">#                  $_ = undef;</td></tr>
+<tr><td class="h"><a name="2582"></a>2582</td><td></td><td></td><td></td><td></td><td class="s">#               }</td></tr>
+<tr><td class="h"><a name="2583"></a>2583</td><td></td><td></td><td></td><td></td><td class="s">#            }</td></tr>
+<tr><td class="h"><a name="2584"></a>2584</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2585"></a>2585</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2586"></a>2586</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2587"></a>2587</td><td></td><td></td><td></td><td></td><td class="s">      ## This is crude: we have no way of keeping track of browsing all open</td></tr>
+<tr><td class="h"><a name="2588"></a>2588</td><td></td><td></td><td></td><td></td><td class="s">      ## fds, so we scan to a fairly high fd.</td></tr>
+<tr><td class="h"><a name="2589"></a>2589</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;open fds: &quot;, join &quot; &quot;, keys %fds if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2590"></a>2590</td><td></td><td></td><td></td><td></td><td class="s">      for (keys %fds) {</td></tr>
+<tr><td class="h"><a name="2591"></a>2591</td><td></td><td></td><td></td><td></td><td class="s">         if ( ! $closed[$_] &amp;&amp; ! $needed[$_] ) {</td></tr>
+<tr><td class="h"><a name="2592"></a>2592</td><td></td><td></td><td></td><td></td><td class="s">            _close( $_ );</td></tr>
+<tr><td class="h"><a name="2593"></a>2593</td><td></td><td></td><td></td><td></td><td class="s">            $closed[$_] = 1;</td></tr>
+<tr><td class="h"><a name="2594"></a>2594</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2595"></a>2595</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2596"></a>2596</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2597"></a>2597</td><td></td><td></td><td></td><td></td><td class="s">      ## Lazy closing is so the same fd (ie the same TFD value) can be dup2'ed on</td></tr>
+<tr><td class="h"><a name="2598"></a>2598</td><td></td><td></td><td></td><td></td><td class="s">      ## several times.</td></tr>
+<tr><td class="h"><a name="2599"></a>2599</td><td></td><td></td><td></td><td></td><td class="s">      my @lazy_close;</td></tr>
+<tr><td class="h"><a name="2600"></a>2600</td><td></td><td></td><td></td><td></td><td class="s">      for ( @{$kid-&gt;{OPS}} ) {</td></tr>
+<tr><td class="h"><a name="2601"></a>2601</td><td></td><td></td><td></td><td></td><td class="s">         if ( defined $_-&gt;{TFD} ) {</td></tr>
+<tr><td class="h"><a name="2602"></a>2602</td><td></td><td></td><td></td><td></td><td class="s">            unless ( $_-&gt;{TFD} == $_-&gt;{KFD} ) {</td></tr>
+<tr><td class="h"><a name="2603"></a>2603</td><td></td><td></td><td></td><td></td><td class="s">               $self-&gt;_dup2_gently( $kid-&gt;{OPS}, $_-&gt;{TFD}, $_-&gt;{KFD} );</td></tr>
+<tr><td class="h"><a name="2604"></a>2604</td><td></td><td></td><td></td><td></td><td class="s">               push @lazy_close, $_-&gt;{TFD};</td></tr>
+<tr><td class="h"><a name="2605"></a>2605</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2606"></a>2606</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2607"></a>2607</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( $_-&gt;{TYPE} eq 'dup' ) {</td></tr>
+<tr><td class="h"><a name="2608"></a>2608</td><td></td><td></td><td></td><td></td><td class="s">            $self-&gt;_dup2_gently( $kid-&gt;{OPS}, $_-&gt;{KFD1}, $_-&gt;{KFD2} )</td></tr>
+<tr><td class="h"><a name="2609"></a>2609</td><td></td><td></td><td></td><td></td><td class="s">               unless $_-&gt;{KFD1} == $_-&gt;{KFD2};</td></tr>
+<tr><td class="h"><a name="2610"></a>2610</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2611"></a>2611</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( $_-&gt;{TYPE} eq 'close' ) {</td></tr>
+<tr><td class="h"><a name="2612"></a>2612</td><td></td><td></td><td></td><td></td><td class="s">            for ( $_-&gt;{KFD} ) {</td></tr>
+<tr><td class="h"><a name="2613"></a>2613</td><td></td><td></td><td></td><td></td><td class="s">               if ( ! $closed[$_] ) {</td></tr>
+<tr><td class="h"><a name="2614"></a>2614</td><td></td><td></td><td></td><td></td><td class="s">                  _close( $_ );</td></tr>
+<tr><td class="h"><a name="2615"></a>2615</td><td></td><td></td><td></td><td></td><td class="s">                  $closed[$_] = 1;</td></tr>
+<tr><td class="h"><a name="2616"></a>2616</td><td></td><td></td><td></td><td></td><td class="s">                  $_ = undef;</td></tr>
+<tr><td class="h"><a name="2617"></a>2617</td><td></td><td></td><td></td><td></td><td class="s">               }</td></tr>
+<tr><td class="h"><a name="2618"></a>2618</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2619"></a>2619</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2620"></a>2620</td><td></td><td></td><td></td><td></td><td class="s">         elsif ( $_-&gt;{TYPE} eq 'init' ) {</td></tr>
+<tr><td class="h"><a name="2621"></a>2621</td><td></td><td></td><td></td><td></td><td class="s">            $_-&gt;{SUB}-&gt;();</td></tr>
+<tr><td class="h"><a name="2622"></a>2622</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2623"></a>2623</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2624"></a>2624</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2625"></a>2625</td><td></td><td></td><td></td><td></td><td class="s">      for ( @lazy_close ) {</td></tr>
+<tr><td class="h"><a name="2626"></a>2626</td><td></td><td></td><td></td><td></td><td class="s">         unless ( $closed[$_] ) {</td></tr>
+<tr><td class="h"><a name="2627"></a>2627</td><td></td><td></td><td></td><td></td><td class="s">            _close( $_ );</td></tr>
+<tr><td class="h"><a name="2628"></a>2628</td><td></td><td></td><td></td><td></td><td class="s">            $closed[$_] = 1;</td></tr>
+<tr><td class="h"><a name="2629"></a>2629</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2630"></a>2630</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2631"></a>2631</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2632"></a>2632</td><td></td><td></td><td></td><td></td><td class="s">      if ( ref $kid-&gt;{VAL} ne 'CODE' ) {</td></tr>
+<tr><td class="h"><a name="2633"></a>2633</td><td></td><td></td><td></td><td></td><td class="s">         open $s1, &quot;&gt;&amp;=$self-&gt;{SYNC_WRITER_FD}&quot;</td></tr>
+<tr><td class="h"><a name="2634"></a>2634</td><td></td><td></td><td></td><td></td><td class="s">            or croak &quot;$! setting filehandle to fd SYNC_WRITER_FD&quot;;</td></tr>
+<tr><td class="h"><a name="2635"></a>2635</td><td></td><td></td><td></td><td></td><td class="s">         fcntl $s1, F_SETFD, 1;</td></tr>
+<tr><td class="h"><a name="2636"></a>2636</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2637"></a>2637</td><td></td><td></td><td></td><td></td><td class="s">         if ( defined $self-&gt;{DEBUG_FD} ) {</td></tr>
+<tr><td class="h"><a name="2638"></a>2638</td><td></td><td></td><td></td><td></td><td class="s">            open $s2, &quot;&gt;&amp;=$self-&gt;{DEBUG_FD}&quot;</td></tr>
+<tr><td class="h"><a name="2639"></a>2639</td><td></td><td></td><td></td><td></td><td class="s">               or croak &quot;$! setting filehandle to fd DEBUG_FD&quot;;</td></tr>
+<tr><td class="h"><a name="2640"></a>2640</td><td></td><td></td><td></td><td></td><td class="s">            fcntl $s2, F_SETFD, 1;</td></tr>
+<tr><td class="h"><a name="2641"></a>2641</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2642"></a>2642</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2643"></a>2643</td><td></td><td></td><td></td><td></td><td class="s">         my @cmd = ( $kid-&gt;{PATH}, @{$kid-&gt;{VAL}}[1..$#{$kid-&gt;{VAL}}] );</td></tr>
+<tr><td class="h"><a name="2644"></a>2644</td><td></td><td></td><td></td><td></td><td class="s">         _debug 'execing ', join &quot; &quot;, map { /[\s\&quot;]/ ? &quot;'$_'&quot; : $_ } @cmd</td></tr>
+<tr><td class="h"><a name="2645"></a>2645</td><td></td><td></td><td></td><td></td><td class="s">            if _debugging;</td></tr>
+<tr><td class="h"><a name="2646"></a>2646</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2647"></a>2647</td><td></td><td></td><td></td><td></td><td class="s">         die &quot;exec failed: simulating exec() failure&quot;</td></tr>
+<tr><td class="h"><a name="2648"></a>2648</td><td></td><td></td><td></td><td></td><td class="s">            if $self-&gt;{_simulate_exec_failure};</td></tr>
+<tr><td class="h"><a name="2649"></a>2649</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2650"></a>2650</td><td></td><td></td><td></td><td></td><td class="s">         _exec $kid-&gt;{PATH}, @{$kid-&gt;{VAL}}[1..$#{$kid-&gt;{VAL}}];</td></tr>
+<tr><td class="h"><a name="2651"></a>2651</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2652"></a>2652</td><td></td><td></td><td></td><td></td><td class="s">         croak &quot;exec failed: $!&quot;;</td></tr>
+<tr><td class="h"><a name="2653"></a>2653</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2654"></a>2654</td><td></td><td></td><td></td><td></td><td class="s">   };</td></tr>
+<tr><td class="h"><a name="2655"></a>2655</td><td></td><td></td><td></td><td></td><td class="s">   if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="2656"></a>2656</td><td></td><td></td><td></td><td></td><td class="s">      _write $self-&gt;{SYNC_WRITER_FD}, $@;</td></tr>
+<tr><td class="h"><a name="2657"></a>2657</td><td></td><td></td><td></td><td></td><td class="s">      ## Avoid DESTROY.</td></tr>
+<tr><td class="h"><a name="2658"></a>2658</td><td></td><td></td><td></td><td></td><td class="s">      POSIX::exit 1;</td></tr>
+<tr><td class="h"><a name="2659"></a>2659</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2660"></a>2660</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2661"></a>2661</td><td></td><td></td><td></td><td></td><td class="s">   ## We must be executing code in the child, otherwise exec() would have</td></tr>
+<tr><td class="h"><a name="2662"></a>2662</td><td></td><td></td><td></td><td></td><td class="s">   ## prevented us from being here.</td></tr>
+<tr><td class="h"><a name="2663"></a>2663</td><td></td><td></td><td></td><td></td><td class="s">   _close $self-&gt;{SYNC_WRITER_FD};</td></tr>
+<tr><td class="h"><a name="2664"></a>2664</td><td></td><td></td><td></td><td></td><td class="s">   _debug 'calling fork()ed CODE ref' if _debugging;</td></tr>
+<tr><td class="h"><a name="2665"></a>2665</td><td></td><td></td><td></td><td></td><td class="s">   POSIX::close $self-&gt;{DEBUG_FD}      if defined $self-&gt;{DEBUG_FD};</td></tr>
+<tr><td class="h"><a name="2666"></a>2666</td><td></td><td></td><td></td><td></td><td class="s">   ## TODO: Overload CORE::GLOBAL::exit...</td></tr>
+<tr><td class="h"><a name="2667"></a>2667</td><td></td><td></td><td></td><td></td><td class="s">   $kid-&gt;{VAL}-&gt;();</td></tr>
+<tr><td class="h"><a name="2668"></a>2668</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2669"></a>2669</td><td></td><td></td><td></td><td></td><td class="s">   ## There are bugs in perl closures up to and including 5.6.1</td></tr>
+<tr><td class="h"><a name="2670"></a>2670</td><td></td><td></td><td></td><td></td><td class="s">   ## that may keep this next line from having any effect, and it</td></tr>
+<tr><td class="h"><a name="2671"></a>2671</td><td></td><td></td><td></td><td></td><td class="s">   ## won't have any effect if our caller has kept a copy of it, but</td></tr>
+<tr><td class="h"><a name="2672"></a>2672</td><td></td><td></td><td></td><td></td><td class="s">   ## this may cause the closure to be cleaned up.  Maybe.</td></tr>
+<tr><td class="h"><a name="2673"></a>2673</td><td></td><td></td><td></td><td></td><td class="s">   $kid-&gt;{VAL} = undef;</td></tr>
+<tr><td class="h"><a name="2674"></a>2674</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2675"></a>2675</td><td></td><td></td><td></td><td></td><td class="s">   ## Use POSIX::exit to avoid global destruction, since this might</td></tr>
+<tr><td class="h"><a name="2676"></a>2676</td><td></td><td></td><td></td><td></td><td class="s">   ## cause DESTROY() to be called on objects created in the parent</td></tr>
+<tr><td class="h"><a name="2677"></a>2677</td><td></td><td></td><td></td><td></td><td class="s">   ## and thus cause double cleanup.  For instance, if DESTROY() unlinks</td></tr>
+<tr><td class="h"><a name="2678"></a>2678</td><td></td><td></td><td></td><td></td><td class="s">   ## a file in the child, we don't want the parent to suddenly miss</td></tr>
+<tr><td class="h"><a name="2679"></a>2679</td><td></td><td></td><td></td><td></td><td class="s">   ## it.</td></tr>
+<tr><td class="h"><a name="2680"></a>2680</td><td></td><td></td><td></td><td></td><td class="s">   POSIX::exit 0;</td></tr>
+<tr><td class="h"><a name="2681"></a>2681</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="2682"></a>2682</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2683"></a>2683</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="2684"></a>2684</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2685"></a>2685</td><td></td><td></td><td></td><td></td><td class="s">=item start</td></tr>
+<tr><td class="h"><a name="2686"></a>2686</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2687"></a>2687</td><td></td><td></td><td></td><td></td><td class="s">   $h = start(</td></tr>
+<tr><td class="h"><a name="2688"></a>2688</td><td></td><td></td><td></td><td></td><td class="s">      \@cmd, \$in, \$out, ...,</td></tr>
+<tr><td class="h"><a name="2689"></a>2689</td><td></td><td></td><td></td><td></td><td class="s">      timeout( 30, name =&gt; &quot;process timeout&quot; ),</td></tr>
+<tr><td class="h"><a name="2690"></a>2690</td><td></td><td></td><td></td><td></td><td class="s">      $stall_timeout = timeout( 10, name =&gt; &quot;stall timeout&quot;   ),</td></tr>
+<tr><td class="h"><a name="2691"></a>2691</td><td></td><td></td><td></td><td></td><td class="s">   );</td></tr>
+<tr><td class="h"><a name="2692"></a>2692</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2693"></a>2693</td><td></td><td></td><td></td><td></td><td class="s">   $h = start \@cmd, '&lt;', \$in, '|', \@cmd2, ...;</td></tr>
+<tr><td class="h"><a name="2694"></a>2694</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2695"></a>2695</td><td></td><td></td><td></td><td></td><td class="s">start() accepts a harness or harness specification and returns a harness</td></tr>
+<tr><td class="h"><a name="2696"></a>2696</td><td></td><td></td><td></td><td></td><td class="s">after building all of the pipes and launching (via fork()/exec(), or, maybe</td></tr>
+<tr><td class="h"><a name="2697"></a>2697</td><td></td><td></td><td></td><td></td><td class="s">someday, spawn()) all the child processes.  It does not send or receive any</td></tr>
+<tr><td class="h"><a name="2698"></a>2698</td><td></td><td></td><td></td><td></td><td class="s">data on the pipes, see pump() and finish() for that.</td></tr>
+<tr><td class="h"><a name="2699"></a>2699</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2700"></a>2700</td><td></td><td></td><td></td><td></td><td class="s">You may call harness() and then pass it's result to start() if you like,</td></tr>
+<tr><td class="h"><a name="2701"></a>2701</td><td></td><td></td><td></td><td></td><td class="s">but you only need to if it helps you structure or tune your application.</td></tr>
+<tr><td class="h"><a name="2702"></a>2702</td><td></td><td></td><td></td><td></td><td class="s">If you do call harness(), you may skip start() and proceed directly to</td></tr>
+<tr><td class="h"><a name="2703"></a>2703</td><td></td><td></td><td></td><td></td><td class="s">pump.</td></tr>
+<tr><td class="h"><a name="2704"></a>2704</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2705"></a>2705</td><td></td><td></td><td></td><td></td><td class="s">start() also starts all timers in the harness.  See L&lt;IPC::Run::Timer&gt;</td></tr>
+<tr><td class="h"><a name="2706"></a>2706</td><td></td><td></td><td></td><td></td><td class="s">for more information.</td></tr>
+<tr><td class="h"><a name="2707"></a>2707</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2708"></a>2708</td><td></td><td></td><td></td><td></td><td class="s">start() flushes STDOUT and STDERR to help you avoid duplicate output.</td></tr>
+<tr><td class="h"><a name="2709"></a>2709</td><td></td><td></td><td></td><td></td><td class="s">It has no way of asking Perl to flush all your open filehandles, so</td></tr>
+<tr><td class="h"><a name="2710"></a>2710</td><td></td><td></td><td></td><td></td><td class="s">you are going to need to flush any others you have open.  Sorry.</td></tr>
+<tr><td class="h"><a name="2711"></a>2711</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2712"></a>2712</td><td></td><td></td><td></td><td></td><td class="s">Here's how if you don't want to alter the state of $| for your</td></tr>
+<tr><td class="h"><a name="2713"></a>2713</td><td></td><td></td><td></td><td></td><td class="s">filehandle:</td></tr>
+<tr><td class="h"><a name="2714"></a>2714</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2715"></a>2715</td><td></td><td></td><td></td><td></td><td class="s">   $ofh = select HANDLE; $of = $|; $| = 1; $| = $of; select $ofh;</td></tr>
+<tr><td class="h"><a name="2716"></a>2716</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2717"></a>2717</td><td></td><td></td><td></td><td></td><td class="s">If you don't mind leaving output unbuffered on HANDLE, you can do</td></tr>
+<tr><td class="h"><a name="2718"></a>2718</td><td></td><td></td><td></td><td></td><td class="s">the slightly shorter</td></tr>
+<tr><td class="h"><a name="2719"></a>2719</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2720"></a>2720</td><td></td><td></td><td></td><td></td><td class="s">   $ofh = select HANDLE; $| = 1; select $ofh;</td></tr>
+<tr><td class="h"><a name="2721"></a>2721</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2722"></a>2722</td><td></td><td></td><td></td><td></td><td class="s">Or, you can use IO::Handle's flush() method:</td></tr>
+<tr><td class="h"><a name="2723"></a>2723</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2724"></a>2724</td><td></td><td></td><td></td><td></td><td class="s">   use IO::Handle;</td></tr>
+<tr><td class="h"><a name="2725"></a>2725</td><td></td><td></td><td></td><td></td><td class="s">   flush HANDLE;</td></tr>
+<tr><td class="h"><a name="2726"></a>2726</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2727"></a>2727</td><td></td><td></td><td></td><td></td><td class="s">Perl needs the equivalent of C's fflush( (FILE *)NULL ).</td></tr>
+<tr><td class="h"><a name="2728"></a>2728</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2729"></a>2729</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="2730"></a>2730</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2731"></a>2731</td><td></td><td></td><td></td><td></td><td class="s">sub start {</td></tr>
+<tr><td class="h"><a name="2732"></a>2732</td><td></td><td></td><td></td><td></td><td class="s"># $SIG{__DIE__} = sub { my $s = shift; Carp::cluck $s; die $s };</td></tr>
+<tr><td class="h"><a name="2733"></a>2733</td><td></td><td></td><td></td><td></td><td class="s">   my $options;</td></tr>
+<tr><td class="h"><a name="2734"></a>2734</td><td></td><td></td><td></td><td></td><td class="s">   if ( @_ &amp;&amp; ref $_[-1] eq 'HASH' ) {</td></tr>
+<tr><td class="h"><a name="2735"></a>2735</td><td></td><td></td><td></td><td></td><td class="s">      $options = pop;</td></tr>
+<tr><td class="h"><a name="2736"></a>2736</td><td></td><td></td><td></td><td></td><td class="s">      require Data::Dumper;</td></tr>
+<tr><td class="h"><a name="2737"></a>2737</td><td></td><td></td><td></td><td></td><td class="s">      carp &quot;Passing in options as a hash is deprecated:\n&quot;, Data::Dumper::Dumper( $options );</td></tr>
+<tr><td class="h"><a name="2738"></a>2738</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2739"></a>2739</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2740"></a>2740</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self;</td></tr>
+<tr><td class="h"><a name="2741"></a>2741</td><td></td><td></td><td></td><td></td><td class="s">   if ( @_ == 1 &amp;&amp; UNIVERSAL::isa( $_[0], __PACKAGE__ ) ) {</td></tr>
+<tr><td class="h"><a name="2742"></a>2742</td><td></td><td></td><td></td><td></td><td class="s">      $self = shift;</td></tr>
+<tr><td class="h"><a name="2743"></a>2743</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;{$_} = $options-&gt;{$_} for keys %$options;</td></tr>
+<tr><td class="h"><a name="2744"></a>2744</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2745"></a>2745</td><td></td><td></td><td></td><td></td><td class="s">   else {</td></tr>
+<tr><td class="h"><a name="2746"></a>2746</td><td></td><td></td><td></td><td></td><td class="s">      $self = harness( @_, $options ? $options : () );</td></tr>
+<tr><td class="h"><a name="2747"></a>2747</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2748"></a>2748</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2749"></a>2749</td><td></td><td></td><td></td><td></td><td class="s">   local $cur_self = $self;</td></tr>
+<tr><td class="h"><a name="2750"></a>2750</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2751"></a>2751</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;kill_kill if $self-&gt;{STATE} == _started;</td></tr>
+<tr><td class="h"><a name="2752"></a>2752</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2753"></a>2753</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;** starting&quot; if _debugging;</td></tr>
+<tr><td class="h"><a name="2754"></a>2754</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2755"></a>2755</td><td></td><td></td><td></td><td></td><td class="s">   $_-&gt;{RESULT} = undef for @{$self-&gt;{KIDS}};</td></tr>
+<tr><td class="h"><a name="2756"></a>2756</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2757"></a>2757</td><td></td><td></td><td></td><td></td><td class="s">   ## Assume we're not being called from &amp;run.  It will correct our</td></tr>
+<tr><td class="h"><a name="2758"></a>2758</td><td></td><td></td><td></td><td></td><td class="s">   ## assumption if need be.  This affects whether &amp;_select_loop clears</td></tr>
+<tr><td class="h"><a name="2759"></a>2759</td><td></td><td></td><td></td><td></td><td class="s">   ## input queues to '' when they're empty.</td></tr>
+<tr><td class="h"><a name="2760"></a>2760</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{clear_ins} = 1;</td></tr>
+<tr><td class="h"><a name="2761"></a>2761</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2762"></a>2762</td><td></td><td></td><td></td><td></td><td class="s">   IPC::Run::Win32Helper::optimize $self</td></tr>
+<tr><td class="h"><a name="2763"></a>2763</td><td></td><td></td><td></td><td></td><td class="s">       if Win32_MODE &amp;&amp; $in_run;</td></tr>
+<tr><td class="h"><a name="2764"></a>2764</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2765"></a>2765</td><td></td><td></td><td></td><td></td><td class="s">   my @errs;</td></tr>
+<tr><td class="h"><a name="2766"></a>2766</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2767"></a>2767</td><td></td><td></td><td></td><td></td><td class="s">   for ( @{$self-&gt;{TIMERS}} ) {</td></tr>
+<tr><td class="h"><a name="2768"></a>2768</td><td></td><td></td><td></td><td></td><td class="s">      eval { $_-&gt;start };</td></tr>
+<tr><td class="h"><a name="2769"></a>2769</td><td></td><td></td><td></td><td></td><td class="s">      if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="2770"></a>2770</td><td></td><td></td><td></td><td></td><td class="s">         push @errs, $@;</td></tr>
+<tr><td class="h"><a name="2771"></a>2771</td><td></td><td></td><td></td><td></td><td class="s">         _debug 'caught ', $@ if _debugging;</td></tr>
+<tr><td class="h"><a name="2772"></a>2772</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2773"></a>2773</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2774"></a>2774</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2775"></a>2775</td><td></td><td></td><td></td><td></td><td class="s">   eval { $self-&gt;_open_pipes };</td></tr>
+<tr><td class="h"><a name="2776"></a>2776</td><td></td><td></td><td></td><td></td><td class="s">   if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="2777"></a>2777</td><td></td><td></td><td></td><td></td><td class="s">      push @errs, $@;</td></tr>
+<tr><td class="h"><a name="2778"></a>2778</td><td></td><td></td><td></td><td></td><td class="s">      _debug 'caught ', $@ if _debugging;</td></tr>
+<tr><td class="h"><a name="2779"></a>2779</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2780"></a>2780</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2781"></a>2781</td><td></td><td></td><td></td><td></td><td class="s">   if ( ! @errs ) {</td></tr>
+<tr><td class="h"><a name="2782"></a>2782</td><td></td><td></td><td></td><td></td><td class="s">      ## This is a bit of a hack, we should do it for all open filehandles.</td></tr>
+<tr><td class="h"><a name="2783"></a>2783</td><td></td><td></td><td></td><td></td><td class="s">      ## Since there's no way I know of to enumerate open filehandles, we</td></tr>
+<tr><td class="h"><a name="2784"></a>2784</td><td></td><td></td><td></td><td></td><td class="s">      ## autoflush STDOUT and STDERR.  This is done so that the children don't</td></tr>
+<tr><td class="h"><a name="2785"></a>2785</td><td></td><td></td><td></td><td></td><td class="s">      ## inherit output buffers chock full o' redundant data.  It's really</td></tr>
+<tr><td class="h"><a name="2786"></a>2786</td><td></td><td></td><td></td><td></td><td class="s">      ## confusing to track that down.</td></tr>
+<tr><td class="h"><a name="2787"></a>2787</td><td></td><td></td><td></td><td></td><td class="s">      { my $ofh = select STDOUT; local $| = 1; select $ofh; }</td></tr>
+<tr><td class="h"><a name="2788"></a>2788</td><td></td><td></td><td></td><td></td><td class="s">      { my $ofh = select STDERR; local $| = 1; select $ofh; }</td></tr>
+<tr><td class="h"><a name="2789"></a>2789</td><td></td><td></td><td></td><td></td><td class="s">      for my $kid ( @{$self-&gt;{KIDS}} ) {</td></tr>
+<tr><td class="h"><a name="2790"></a>2790</td><td></td><td></td><td></td><td></td><td class="s">         $kid-&gt;{RESULT} = undef;</td></tr>
+<tr><td class="h"><a name="2791"></a>2791</td><td></td><td></td><td></td><td></td><td class="s">         _debug &quot;child: &quot;,</td></tr>
+<tr><td class="h"><a name="2792"></a>2792</td><td></td><td></td><td></td><td></td><td class="s">            ref( $kid-&gt;{VAL} ) eq &quot;CODE&quot;</td></tr>
+<tr><td class="h"><a name="2793"></a>2793</td><td></td><td></td><td></td><td></td><td class="s">            ? &quot;CODE ref&quot;</td></tr>
+<tr><td class="h"><a name="2794"></a>2794</td><td></td><td></td><td></td><td></td><td class="s">            : (</td></tr>
+<tr><td class="h"><a name="2795"></a>2795</td><td></td><td></td><td></td><td></td><td class="s">               &quot;`&quot;,</td></tr>
+<tr><td class="h"><a name="2796"></a>2796</td><td></td><td></td><td></td><td></td><td class="s">               join( &quot; &quot;, map /[^\w.-]/ ? &quot;'$_'&quot; : $_, @{$kid-&gt;{VAL}} ),</td></tr>
+<tr><td class="h"><a name="2797"></a>2797</td><td></td><td></td><td></td><td></td><td class="s">               &quot;`&quot;</td></tr>
+<tr><td class="h"><a name="2798"></a>2798</td><td></td><td></td><td></td><td></td><td class="s">            ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2799"></a>2799</td><td></td><td></td><td></td><td></td><td class="s">         eval {</td></tr>
+<tr><td class="h"><a name="2800"></a>2800</td><td></td><td></td><td></td><td></td><td class="s">            croak &quot;simulated failure of fork&quot;</td></tr>
+<tr><td class="h"><a name="2801"></a>2801</td><td></td><td></td><td></td><td></td><td class="s">               if $self-&gt;{_simulate_fork_failure};</td></tr>
+<tr><td class="h"><a name="2802"></a>2802</td><td></td><td></td><td></td><td></td><td class="s">            unless ( Win32_MODE ) {</td></tr>
+<tr><td class="h"><a name="2803"></a>2803</td><td></td><td></td><td></td><td></td><td class="s">               $self-&gt;_spawn( $kid );</td></tr>
+<tr><td class="h"><a name="2804"></a>2804</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2805"></a>2805</td><td></td><td></td><td></td><td></td><td class="s">            else {</td></tr>
+<tr><td class="h"><a name="2806"></a>2806</td><td></td><td></td><td></td><td></td><td class="s">## TODO: Test and debug spawing code.  Someday.</td></tr>
+<tr><td class="h"><a name="2807"></a>2807</td><td></td><td></td><td></td><td></td><td class="s">               _debug( </td></tr>
+<tr><td class="h"><a name="2808"></a>2808</td><td></td><td></td><td></td><td></td><td class="s">                  'spawning ',</td></tr>
+<tr><td class="h"><a name="2809"></a>2809</td><td></td><td></td><td></td><td></td><td class="s">                  join(</td></tr>
+<tr><td class="h"><a name="2810"></a>2810</td><td></td><td></td><td></td><td></td><td class="s">                     ' ',</td></tr>
+<tr><td class="h"><a name="2811"></a>2811</td><td></td><td></td><td></td><td></td><td class="s">                     map(</td></tr>
+<tr><td class="h"><a name="2812"></a>2812</td><td></td><td></td><td></td><td></td><td class="s">                        &quot;'$_'&quot;,</td></tr>
+<tr><td class="h"><a name="2813"></a>2813</td><td></td><td></td><td></td><td></td><td class="s">                        ( $kid-&gt;{PATH}, @{$kid-&gt;{VAL}}[1..$#{$kid-&gt;{VAL}}] )</td></tr>
+<tr><td class="h"><a name="2814"></a>2814</td><td></td><td></td><td></td><td></td><td class="s">                     )</td></tr>
+<tr><td class="h"><a name="2815"></a>2815</td><td></td><td></td><td></td><td></td><td class="s">                  )</td></tr>
+<tr><td class="h"><a name="2816"></a>2816</td><td></td><td></td><td></td><td></td><td class="s">               ) if _debugging;</td></tr>
+<tr><td class="h"><a name="2817"></a>2817</td><td></td><td></td><td></td><td></td><td class="s">               ## The external kid wouldn't know what to do with it anyway.</td></tr>
+<tr><td class="h"><a name="2818"></a>2818</td><td></td><td></td><td></td><td></td><td class="s">               ## This is only used by the &quot;helper&quot; pump processes on Win32.</td></tr>
+<tr><td class="h"><a name="2819"></a>2819</td><td></td><td></td><td></td><td></td><td class="s">               _dont_inherit( $self-&gt;{DEBUG_FD} );</td></tr>
+<tr><td class="h"><a name="2820"></a>2820</td><td></td><td></td><td></td><td></td><td class="s">               ( $kid-&gt;{PID}, $kid-&gt;{PROCESS} ) =</td></tr>
+<tr><td class="h"><a name="2821"></a>2821</td><td></td><td></td><td></td><td></td><td class="s">                  IPC::Run::Win32Helper::win32_spawn( </td></tr>
+<tr><td class="h"><a name="2822"></a>2822</td><td></td><td></td><td></td><td></td><td class="s">                     [ $kid-&gt;{PATH}, @{$kid-&gt;{VAL}}[1..$#{$kid-&gt;{VAL}}] ],</td></tr>
+<tr><td class="h"><a name="2823"></a>2823</td><td></td><td></td><td></td><td></td><td class="s">                     $kid-&gt;{OPS},</td></tr>
+<tr><td class="h"><a name="2824"></a>2824</td><td></td><td></td><td></td><td></td><td class="s">                  );</td></tr>
+<tr><td class="h"><a name="2825"></a>2825</td><td></td><td></td><td></td><td></td><td class="s">               _debug &quot;spawn() = &quot;, $kid-&gt;{PID} if _debugging;</td></tr>
+<tr><td class="h"><a name="2826"></a>2826</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2827"></a>2827</td><td></td><td></td><td></td><td></td><td class="s">         };</td></tr>
+<tr><td class="h"><a name="2828"></a>2828</td><td></td><td></td><td></td><td></td><td class="s">         if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="2829"></a>2829</td><td></td><td></td><td></td><td></td><td class="s">            push @errs, $@;</td></tr>
+<tr><td class="h"><a name="2830"></a>2830</td><td></td><td></td><td></td><td></td><td class="s">            _debug 'caught ', $@ if _debugging;</td></tr>
+<tr><td class="h"><a name="2831"></a>2831</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2832"></a>2832</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2833"></a>2833</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2834"></a>2834</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2835"></a>2835</td><td></td><td></td><td></td><td></td><td class="s">   ## Close all those temporary filehandles that the kids needed.</td></tr>
+<tr><td class="h"><a name="2836"></a>2836</td><td></td><td></td><td></td><td></td><td class="s">   for my $pty ( values %{$self-&gt;{PTYS}} ) {</td></tr>
+<tr><td class="h"><a name="2837"></a>2837</td><td></td><td></td><td></td><td></td><td class="s">      close $pty-&gt;slave;</td></tr>
+<tr><td class="h"><a name="2838"></a>2838</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2839"></a>2839</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2840"></a>2840</td><td></td><td></td><td></td><td></td><td class="s">   my @closed;</td></tr>
+<tr><td class="h"><a name="2841"></a>2841</td><td></td><td></td><td></td><td></td><td class="s">   for my $kid ( @{$self-&gt;{KIDS}} ) {</td></tr>
+<tr><td class="h"><a name="2842"></a>2842</td><td></td><td></td><td></td><td></td><td class="s">      for ( @{$kid-&gt;{OPS}} ) {</td></tr>
+<tr><td class="h"><a name="2843"></a>2843</td><td></td><td></td><td></td><td></td><td class="s">         my $close_it = eval {</td></tr>
+<tr><td class="h"><a name="2844"></a>2844</td><td></td><td></td><td></td><td></td><td class="s">            defined $_-&gt;{TFD}</td></tr>
+<tr><td class="h"><a name="2845"></a>2845</td><td></td><td></td><td></td><td></td><td class="s">               &amp;&amp; ! $_-&gt;{DONT_CLOSE}</td></tr>
+<tr><td class="h"><a name="2846"></a>2846</td><td></td><td></td><td></td><td></td><td class="s">               &amp;&amp; ! $closed[$_-&gt;{TFD}]</td></tr>
+<tr><td class="h"><a name="2847"></a>2847</td><td></td><td></td><td></td><td></td><td class="s">               &amp;&amp; ( ! Win32_MODE || ! $_-&gt;{RECV_THROUGH_TEMP_FILE} ) ## Win32 hack</td></tr>
+<tr><td class="h"><a name="2848"></a>2848</td><td></td><td></td><td></td><td></td><td class="s">         };</td></tr>
+<tr><td class="h"><a name="2849"></a>2849</td><td></td><td></td><td></td><td></td><td class="s">         if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="2850"></a>2850</td><td></td><td></td><td></td><td></td><td class="s">            push @errs, $@;</td></tr>
+<tr><td class="h"><a name="2851"></a>2851</td><td></td><td></td><td></td><td></td><td class="s">            _debug 'caught ', $@ if _debugging;</td></tr>
+<tr><td class="h"><a name="2852"></a>2852</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2853"></a>2853</td><td></td><td></td><td></td><td></td><td class="s">         if ( $close_it || $@ ) {</td></tr>
+<tr><td class="h"><a name="2854"></a>2854</td><td></td><td></td><td></td><td></td><td class="s">            eval {</td></tr>
+<tr><td class="h"><a name="2855"></a>2855</td><td></td><td></td><td></td><td></td><td class="s">               _close( $_-&gt;{TFD} );</td></tr>
+<tr><td class="h"><a name="2856"></a>2856</td><td></td><td></td><td></td><td></td><td class="s">               $closed[$_-&gt;{TFD}] = 1;</td></tr>
+<tr><td class="h"><a name="2857"></a>2857</td><td></td><td></td><td></td><td></td><td class="s">               $_-&gt;{TFD} = undef;</td></tr>
+<tr><td class="h"><a name="2858"></a>2858</td><td></td><td></td><td></td><td></td><td class="s">            };</td></tr>
+<tr><td class="h"><a name="2859"></a>2859</td><td></td><td></td><td></td><td></td><td class="s">            if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="2860"></a>2860</td><td></td><td></td><td></td><td></td><td class="s">               push @errs, $@;</td></tr>
+<tr><td class="h"><a name="2861"></a>2861</td><td></td><td></td><td></td><td></td><td class="s">               _debug 'caught ', $@ if _debugging;</td></tr>
+<tr><td class="h"><a name="2862"></a>2862</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="2863"></a>2863</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2864"></a>2864</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2865"></a>2865</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2866"></a>2866</td><td></td><td></td><td></td><td></td><td class="s">confess &quot;gak!&quot; unless defined $self-&gt;{PIPES};</td></tr>
+<tr><td class="h"><a name="2867"></a>2867</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2868"></a>2868</td><td></td><td></td><td></td><td></td><td class="s">   if ( @errs ) {</td></tr>
+<tr><td class="h"><a name="2869"></a>2869</td><td></td><td></td><td></td><td></td><td class="s">      eval { $self-&gt;_cleanup };</td></tr>
+<tr><td class="h"><a name="2870"></a>2870</td><td></td><td></td><td></td><td></td><td class="s">      warn $@ if $@;</td></tr>
+<tr><td class="h"><a name="2871"></a>2871</td><td></td><td></td><td></td><td></td><td class="s">      die join( '', @errs );</td></tr>
+<tr><td class="h"><a name="2872"></a>2872</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2873"></a>2873</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2874"></a>2874</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{STATE} = _started;</td></tr>
+<tr><td class="h"><a name="2875"></a>2875</td><td></td><td></td><td></td><td></td><td class="s">   return $self;</td></tr>
+<tr><td class="h"><a name="2876"></a>2876</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="2877"></a>2877</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2878"></a>2878</td><td></td><td></td><td></td><td></td><td class="s">=item adopt</td></tr>
+<tr><td class="h"><a name="2879"></a>2879</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2880"></a>2880</td><td></td><td></td><td></td><td></td><td class="s">Experimental feature. NOT FUNCTIONAL YET, NEED TO CLOSE FDS BETTER IN CHILDREN.  SEE t/adopt.t for a test suite.</td></tr>
+<tr><td class="h"><a name="2881"></a>2881</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2882"></a>2882</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="2883"></a>2883</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2884"></a>2884</td><td></td><td></td><td></td><td></td><td class="s">sub adopt {</td></tr>
+<tr><td class="h"><a name="2885"></a>2885</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="2886"></a>2886</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2887"></a>2887</td><td></td><td></td><td></td><td></td><td class="s">   for my $adoptee ( @_ ) {</td></tr>
+<tr><td class="h"><a name="2888"></a>2888</td><td></td><td></td><td></td><td></td><td class="s">      push @{$self-&gt;{IOS}},    @{$adoptee-&gt;{IOS}};</td></tr>
+<tr><td class="h"><a name="2889"></a>2889</td><td></td><td></td><td></td><td></td><td class="s">      ## NEED TO RENUMBER THE KIDS!!</td></tr>
+<tr><td class="h"><a name="2890"></a>2890</td><td></td><td></td><td></td><td></td><td class="s">      push @{$self-&gt;{KIDS}},   @{$adoptee-&gt;{KIDS}};</td></tr>
+<tr><td class="h"><a name="2891"></a>2891</td><td></td><td></td><td></td><td></td><td class="s">      push @{$self-&gt;{PIPES}},  @{$adoptee-&gt;{PIPES}};</td></tr>
+<tr><td class="h"><a name="2892"></a>2892</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;{PTYS}-&gt;{$_} = $adoptee-&gt;{PTYS}-&gt;{$_}</td></tr>
+<tr><td class="h"><a name="2893"></a>2893</td><td></td><td></td><td></td><td></td><td class="s">         for keys %{$adoptee-&gt;{PYTS}};</td></tr>
+<tr><td class="h"><a name="2894"></a>2894</td><td></td><td></td><td></td><td></td><td class="s">      push @{$self-&gt;{TIMERS}}, @{$adoptee-&gt;{TIMERS}};</td></tr>
+<tr><td class="h"><a name="2895"></a>2895</td><td></td><td></td><td></td><td></td><td class="s">      $adoptee-&gt;{STATE} = _finished;</td></tr>
+<tr><td class="h"><a name="2896"></a>2896</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2897"></a>2897</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="2898"></a>2898</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2899"></a>2899</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2900"></a>2900</td><td></td><td></td><td></td><td></td><td class="s">sub _clobber {</td></tr>
+<tr><td class="h"><a name="2901"></a>2901</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="2902"></a>2902</td><td></td><td></td><td></td><td></td><td class="s">   my ( $file ) = @_;</td></tr>
+<tr><td class="h"><a name="2903"></a>2903</td><td></td><td></td><td></td><td></td><td class="s">   _debug_desc_fd( &quot;closing&quot;, $file ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2904"></a>2904</td><td></td><td></td><td></td><td></td><td class="s">   my $doomed = $file-&gt;{FD};</td></tr>
+<tr><td class="h"><a name="2905"></a>2905</td><td></td><td></td><td></td><td></td><td class="s">   my $dir = $file-&gt;{TYPE} =~ /^&lt;/ ? 'WIN' : 'RIN';</td></tr>
+<tr><td class="h"><a name="2906"></a>2906</td><td></td><td></td><td></td><td></td><td class="s">   vec( $self-&gt;{$dir}, $doomed, 1 ) = 0;</td></tr>
+<tr><td class="h"><a name="2907"></a>2907</td><td></td><td></td><td></td><td></td><td class="s">#   vec( $self-&gt;{EIN},  $doomed, 1 ) = 0;</td></tr>
+<tr><td class="h"><a name="2908"></a>2908</td><td></td><td></td><td></td><td></td><td class="s">   vec( $self-&gt;{PIN},  $doomed, 1 ) = 0;</td></tr>
+<tr><td class="h"><a name="2909"></a>2909</td><td></td><td></td><td></td><td></td><td class="s">   if ( $file-&gt;{TYPE} =~ /^(.)pty.$/ ) {</td></tr>
+<tr><td class="h"><a name="2910"></a>2910</td><td></td><td></td><td></td><td></td><td class="s">      if ( $1 eq '&gt;' ) {</td></tr>
+<tr><td class="h"><a name="2911"></a>2911</td><td></td><td></td><td></td><td></td><td class="s">         ## Only close output ptys.  This is so that ptys as inputs are</td></tr>
+<tr><td class="h"><a name="2912"></a>2912</td><td></td><td></td><td></td><td></td><td class="s">         ## never autoclosed, which would risk losing data that was</td></tr>
+<tr><td class="h"><a name="2913"></a>2913</td><td></td><td></td><td></td><td></td><td class="s">         ## in the slave-&gt;parent queue.</td></tr>
+<tr><td class="h"><a name="2914"></a>2914</td><td></td><td></td><td></td><td></td><td class="s">         _debug_desc_fd &quot;closing pty&quot;, $file if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2915"></a>2915</td><td></td><td></td><td></td><td></td><td class="s">         close $self-&gt;{PTYS}-&gt;{$file-&gt;{PTY_ID}}</td></tr>
+<tr><td class="h"><a name="2916"></a>2916</td><td></td><td></td><td></td><td></td><td class="s">            if defined $self-&gt;{PTYS}-&gt;{$file-&gt;{PTY_ID}};</td></tr>
+<tr><td class="h"><a name="2917"></a>2917</td><td></td><td></td><td></td><td></td><td class="s">         $self-&gt;{PTYS}-&gt;{$file-&gt;{PTY_ID}} = undef;</td></tr>
+<tr><td class="h"><a name="2918"></a>2918</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2919"></a>2919</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2920"></a>2920</td><td></td><td></td><td></td><td></td><td class="s">   elsif ( UNIVERSAL::isa( $file, 'IPC::Run::IO' ) ) {</td></tr>
+<tr><td class="h"><a name="2921"></a>2921</td><td></td><td></td><td></td><td></td><td class="s">      $file-&gt;close unless $file-&gt;{DONT_CLOSE};</td></tr>
+<tr><td class="h"><a name="2922"></a>2922</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2923"></a>2923</td><td></td><td></td><td></td><td></td><td class="s">   else {</td></tr>
+<tr><td class="h"><a name="2924"></a>2924</td><td></td><td></td><td></td><td></td><td class="s">      _close( $doomed );</td></tr>
+<tr><td class="h"><a name="2925"></a>2925</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="2926"></a>2926</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2927"></a>2927</td><td></td><td></td><td></td><td></td><td class="s">   @{$self-&gt;{PIPES}} = grep</td></tr>
+<tr><td class="h"><a name="2928"></a>2928</td><td></td><td></td><td></td><td></td><td class="s">      defined $_-&gt;{FD} &amp;&amp; ( $_-&gt;{TYPE} ne $file-&gt;{TYPE} || $_-&gt;{FD} ne $doomed),</td></tr>
+<tr><td class="h"><a name="2929"></a>2929</td><td></td><td></td><td></td><td></td><td class="s">      @{$self-&gt;{PIPES}};</td></tr>
+<tr><td class="h"><a name="2930"></a>2930</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2931"></a>2931</td><td></td><td></td><td></td><td></td><td class="s">   $file-&gt;{FD} = undef;</td></tr>
+<tr><td class="h"><a name="2932"></a>2932</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="2933"></a>2933</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2934"></a>2934</td><td></td><td></td><td></td><td></td><td class="s">sub _select_loop {</td></tr>
+<tr><td class="h"><a name="2935"></a>2935</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="2936"></a>2936</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2937"></a>2937</td><td></td><td></td><td></td><td></td><td class="s">   my $io_occurred;</td></tr>
+<tr><td class="h"><a name="2938"></a>2938</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2939"></a>2939</td><td></td><td></td><td></td><td></td><td class="s">   my $not_forever = 0.01;</td></tr>
+<tr><td class="h"><a name="2940"></a>2940</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2941"></a>2941</td><td></td><td></td><td></td><td></td><td class="s">SELECT:</td></tr>
+<tr><td class="h"><a name="2942"></a>2942</td><td></td><td></td><td></td><td></td><td class="s">   while ( $self-&gt;pumpable ) {</td></tr>
+<tr><td class="h"><a name="2943"></a>2943</td><td></td><td></td><td></td><td></td><td class="s">      if ( $io_occurred &amp;&amp; $self-&gt;{break_on_io} ) {</td></tr>
+<tr><td class="h"><a name="2944"></a>2944</td><td></td><td></td><td></td><td></td><td class="s">         _debug &quot;exiting _select(): io occured and break_on_io set&quot;</td></tr>
+<tr><td class="h"><a name="2945"></a>2945</td><td></td><td></td><td></td><td></td><td class="s">            if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2946"></a>2946</td><td></td><td></td><td></td><td></td><td class="s">         last;</td></tr>
+<tr><td class="h"><a name="2947"></a>2947</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2948"></a>2948</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2949"></a>2949</td><td></td><td></td><td></td><td></td><td class="s">      my $timeout = $self-&gt;{non_blocking} ? 0 : undef;</td></tr>
+<tr><td class="h"><a name="2950"></a>2950</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2951"></a>2951</td><td></td><td></td><td></td><td></td><td class="s">      if ( @{$self-&gt;{TIMERS}} ) {</td></tr>
+<tr><td class="h"><a name="2952"></a>2952</td><td></td><td></td><td></td><td></td><td class="s">         my $now = time;</td></tr>
+<tr><td class="h"><a name="2953"></a>2953</td><td></td><td></td><td></td><td></td><td class="s">         my $time_left;</td></tr>
+<tr><td class="h"><a name="2954"></a>2954</td><td></td><td></td><td></td><td></td><td class="s">         for ( @{$self-&gt;{TIMERS}} ) {</td></tr>
+<tr><td class="h"><a name="2955"></a>2955</td><td></td><td></td><td></td><td></td><td class="s">            next unless $_-&gt;is_running;</td></tr>
+<tr><td class="h"><a name="2956"></a>2956</td><td></td><td></td><td></td><td></td><td class="s">            $time_left = $_-&gt;check( $now );</td></tr>
+<tr><td class="h"><a name="2957"></a>2957</td><td></td><td></td><td></td><td></td><td class="s">            ## Return when a timer expires</td></tr>
+<tr><td class="h"><a name="2958"></a>2958</td><td></td><td></td><td></td><td></td><td class="s">            return if defined $time_left &amp;&amp; ! $time_left;</td></tr>
+<tr><td class="h"><a name="2959"></a>2959</td><td></td><td></td><td></td><td></td><td class="s">            $timeout = $time_left</td></tr>
+<tr><td class="h"><a name="2960"></a>2960</td><td></td><td></td><td></td><td></td><td class="s">               if ! defined $timeout || $time_left &lt; $timeout;</td></tr>
+<tr><td class="h"><a name="2961"></a>2961</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2962"></a>2962</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2963"></a>2963</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2964"></a>2964</td><td></td><td></td><td></td><td></td><td class="s">      ##</td></tr>
+<tr><td class="h"><a name="2965"></a>2965</td><td></td><td></td><td></td><td></td><td class="s">      ## See if we can unpause any input channels</td></tr>
+<tr><td class="h"><a name="2966"></a>2966</td><td></td><td></td><td></td><td></td><td class="s">      ##</td></tr>
+<tr><td class="h"><a name="2967"></a>2967</td><td></td><td></td><td></td><td></td><td class="s">      my $paused = 0;</td></tr>
+<tr><td class="h"><a name="2968"></a>2968</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2969"></a>2969</td><td></td><td></td><td></td><td></td><td class="s">      for my $file ( @{$self-&gt;{PIPES}} ) {</td></tr>
+<tr><td class="h"><a name="2970"></a>2970</td><td></td><td></td><td></td><td></td><td class="s">         next unless $file-&gt;{PAUSED} &amp;&amp; $file-&gt;{TYPE} =~ /^&lt;/;</td></tr>
+<tr><td class="h"><a name="2971"></a>2971</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2972"></a>2972</td><td></td><td></td><td></td><td></td><td class="s">         _debug_desc_fd( &quot;checking for more input&quot;, $file ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2973"></a>2973</td><td></td><td></td><td></td><td></td><td class="s">         my $did;</td></tr>
+<tr><td class="h"><a name="2974"></a>2974</td><td></td><td></td><td></td><td></td><td class="s">         1 while $did = $file-&gt;_do_filters( $self );</td></tr>
+<tr><td class="h"><a name="2975"></a>2975</td><td></td><td></td><td></td><td></td><td class="s">         if ( defined $file-&gt;{FD} &amp;&amp; ! defined( $did ) || $did ) {</td></tr>
+<tr><td class="h"><a name="2976"></a>2976</td><td></td><td></td><td></td><td></td><td class="s">            _debug_desc_fd( &quot;unpausing&quot;, $file ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="2977"></a>2977</td><td></td><td></td><td></td><td></td><td class="s">            $file-&gt;{PAUSED} = 0;</td></tr>
+<tr><td class="h"><a name="2978"></a>2978</td><td></td><td></td><td></td><td></td><td class="s">            vec( $self-&gt;{WIN}, $file-&gt;{FD}, 1 ) = 1;</td></tr>
+<tr><td class="h"><a name="2979"></a>2979</td><td></td><td></td><td></td><td></td><td class="s">#            vec( $self-&gt;{EIN}, $file-&gt;{FD}, 1 ) = 1;</td></tr>
+<tr><td class="h"><a name="2980"></a>2980</td><td></td><td></td><td></td><td></td><td class="s">            vec( $self-&gt;{PIN}, $file-&gt;{FD}, 1 ) = 0;</td></tr>
+<tr><td class="h"><a name="2981"></a>2981</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2982"></a>2982</td><td></td><td></td><td></td><td></td><td class="s">         else {</td></tr>
+<tr><td class="h"><a name="2983"></a>2983</td><td></td><td></td><td></td><td></td><td class="s">            ## This gets incremented occasionally when the IO channel</td></tr>
+<tr><td class="h"><a name="2984"></a>2984</td><td></td><td></td><td></td><td></td><td class="s">            ## was actually closed.  That's a bug, but it seems mostly</td></tr>
+<tr><td class="h"><a name="2985"></a>2985</td><td></td><td></td><td></td><td></td><td class="s">            ## harmless: it causes us to exit if break_on_io, or to set</td></tr>
+<tr><td class="h"><a name="2986"></a>2986</td><td></td><td></td><td></td><td></td><td class="s">            ## the timeout to not be forever.  I need to fix it, though.</td></tr>
+<tr><td class="h"><a name="2987"></a>2987</td><td></td><td></td><td></td><td></td><td class="s">            ++$paused;</td></tr>
+<tr><td class="h"><a name="2988"></a>2988</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="2989"></a>2989</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="2990"></a>2990</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="2991"></a>2991</td><td></td><td></td><td></td><td></td><td class="s">      if ( _debugging_details ) {</td></tr>
+<tr><td class="h"><a name="2992"></a>2992</td><td></td><td></td><td></td><td></td><td class="s">         my $map = join(</td></tr>
+<tr><td class="h"><a name="2993"></a>2993</td><td></td><td></td><td></td><td></td><td class="s">            '',</td></tr>
+<tr><td class="h"><a name="2994"></a>2994</td><td></td><td></td><td></td><td></td><td class="s">            map {</td></tr>
+<tr><td class="h"><a name="2995"></a>2995</td><td></td><td></td><td></td><td></td><td class="s">               my $out;</td></tr>
+<tr><td class="h"><a name="2996"></a>2996</td><td></td><td></td><td></td><td></td><td class="s">               $out = 'r'                     if vec( $self-&gt;{RIN}, $_, 1 );</td></tr>
+<tr><td class="h"><a name="2997"></a>2997</td><td></td><td></td><td></td><td></td><td class="s">               $out = $out ? 'b' : 'w'        if vec( $self-&gt;{WIN}, $_, 1 );</td></tr>
+<tr><td class="h"><a name="2998"></a>2998</td><td></td><td></td><td></td><td></td><td class="s">               $out = 'p'           if ! $out &amp;&amp; vec( $self-&gt;{PIN}, $_, 1 );</td></tr>
+<tr><td class="h"><a name="2999"></a>2999</td><td></td><td></td><td></td><td></td><td class="s">               $out = $out ? uc( $out ) : 'x' if vec( $self-&gt;{EIN}, $_, 1 );</td></tr>
+<tr><td class="h"><a name="3000"></a>3000</td><td></td><td></td><td></td><td></td><td class="s">               $out = '-' unless $out;</td></tr>
+<tr><td class="h"><a name="3001"></a>3001</td><td></td><td></td><td></td><td></td><td class="s">               $out;</td></tr>
+<tr><td class="h"><a name="3002"></a>3002</td><td></td><td></td><td></td><td></td><td class="s">            } (0..1024)</td></tr>
+<tr><td class="h"><a name="3003"></a>3003</td><td></td><td></td><td></td><td></td><td class="s">         );</td></tr>
+<tr><td class="h"><a name="3004"></a>3004</td><td></td><td></td><td></td><td></td><td class="s">         $map =~ s/((?:[a-zA-Z-]|\([^\)]*\)){12,}?)-*$/$1/;</td></tr>
+<tr><td class="h"><a name="3005"></a>3005</td><td></td><td></td><td></td><td></td><td class="s">         _debug 'fds for select: ', $map if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3006"></a>3006</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3007"></a>3007</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3008"></a>3008</td><td></td><td></td><td></td><td></td><td class="s">      ## _do_filters may have closed our last fd, and we need to see if</td></tr>
+<tr><td class="h"><a name="3009"></a>3009</td><td></td><td></td><td></td><td></td><td class="s">      ## we have I/O, or are just waiting for children to exit.</td></tr>
+<tr><td class="h"><a name="3010"></a>3010</td><td></td><td></td><td></td><td></td><td class="s">      my $p = $self-&gt;pumpable;</td></tr>
+<tr><td class="h"><a name="3011"></a>3011</td><td></td><td></td><td></td><td></td><td class="s">      last unless $p;</td></tr>
+<tr><td class="h"><a name="3012"></a>3012</td><td></td><td></td><td></td><td></td><td class="s">      if ( $p != 0  &amp;&amp; ( ! defined $timeout || $timeout &gt; 0.1 ) ) {</td></tr>
+<tr><td class="h"><a name="3013"></a>3013</td><td></td><td></td><td></td><td></td><td class="s">         ## No I/O will wake the select loop up, but we have children</td></tr>
+<tr><td class="h"><a name="3014"></a>3014</td><td></td><td></td><td></td><td></td><td class="s">         ## lingering, so we need to poll them with a short timeout.</td></tr>
+<tr><td class="h"><a name="3015"></a>3015</td><td></td><td></td><td></td><td></td><td class="s">         ## Otherwise, assume more input will be coming.</td></tr>
+<tr><td class="h"><a name="3016"></a>3016</td><td></td><td></td><td></td><td></td><td class="s">         $timeout = $not_forever;</td></tr>
+<tr><td class="h"><a name="3017"></a>3017</td><td></td><td></td><td></td><td></td><td class="s">         $not_forever *= 2;</td></tr>
+<tr><td class="h"><a name="3018"></a>3018</td><td></td><td></td><td></td><td></td><td class="s">         $not_forever = 0.5 if $not_forever &gt;= 0.5;</td></tr>
+<tr><td class="h"><a name="3019"></a>3019</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3020"></a>3020</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3021"></a>3021</td><td></td><td></td><td></td><td></td><td class="s">      ## Make sure we don't block forever in select() because inputs are</td></tr>
+<tr><td class="h"><a name="3022"></a>3022</td><td></td><td></td><td></td><td></td><td class="s">      ## paused.</td></tr>
+<tr><td class="h"><a name="3023"></a>3023</td><td></td><td></td><td></td><td></td><td class="s">      if ( ! defined $timeout &amp;&amp; ! ( @{$self-&gt;{PIPES}} - $paused ) ) {</td></tr>
+<tr><td class="h"><a name="3024"></a>3024</td><td></td><td></td><td></td><td></td><td class="s">         ## Need to return if we're in pump and all input is paused, or</td></tr>
+<tr><td class="h"><a name="3025"></a>3025</td><td></td><td></td><td></td><td></td><td class="s">         ## we'll loop until all inputs are unpaused, which is darn near</td></tr>
+<tr><td class="h"><a name="3026"></a>3026</td><td></td><td></td><td></td><td></td><td class="s">         ## forever.  And a day.</td></tr>
+<tr><td class="h"><a name="3027"></a>3027</td><td></td><td></td><td></td><td></td><td class="s">         if ( $self-&gt;{break_on_io} ) {</td></tr>
+<tr><td class="h"><a name="3028"></a>3028</td><td></td><td></td><td></td><td></td><td class="s">            _debug &quot;exiting _select(): no I/O to do and timeout=forever&quot;</td></tr>
+<tr><td class="h"><a name="3029"></a>3029</td><td></td><td></td><td></td><td></td><td class="s">               if _debugging;</td></tr>
+<tr><td class="h"><a name="3030"></a>3030</td><td></td><td></td><td></td><td></td><td class="s">            last;</td></tr>
+<tr><td class="h"><a name="3031"></a>3031</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3032"></a>3032</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3033"></a>3033</td><td></td><td></td><td></td><td></td><td class="s">         ## Otherwise, assume more input will be coming.</td></tr>
+<tr><td class="h"><a name="3034"></a>3034</td><td></td><td></td><td></td><td></td><td class="s">         $timeout = $not_forever;</td></tr>
+<tr><td class="h"><a name="3035"></a>3035</td><td></td><td></td><td></td><td></td><td class="s">         $not_forever *= 2;</td></tr>
+<tr><td class="h"><a name="3036"></a>3036</td><td></td><td></td><td></td><td></td><td class="s">         $not_forever = 0.5 if $not_forever &gt;= 0.5;</td></tr>
+<tr><td class="h"><a name="3037"></a>3037</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3038"></a>3038</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3039"></a>3039</td><td></td><td></td><td></td><td></td><td class="s">      _debug 'timeout=', defined $timeout ? $timeout : 'forever'</td></tr>
+<tr><td class="h"><a name="3040"></a>3040</td><td></td><td></td><td></td><td></td><td class="s">         if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3041"></a>3041</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3042"></a>3042</td><td></td><td></td><td></td><td></td><td class="s">      my $nfound;</td></tr>
+<tr><td class="h"><a name="3043"></a>3043</td><td></td><td></td><td></td><td></td><td class="s">      unless ( Win32_MODE ) {</td></tr>
+<tr><td class="h"><a name="3044"></a>3044</td><td></td><td></td><td></td><td></td><td class="s">         $nfound = select(</td></tr>
+<tr><td class="h"><a name="3045"></a>3045</td><td></td><td></td><td></td><td></td><td class="s">            $self-&gt;{ROUT} = $self-&gt;{RIN},</td></tr>
+<tr><td class="h"><a name="3046"></a>3046</td><td></td><td></td><td></td><td></td><td class="s">            $self-&gt;{WOUT} = $self-&gt;{WIN},</td></tr>
+<tr><td class="h"><a name="3047"></a>3047</td><td></td><td></td><td></td><td></td><td class="s">            $self-&gt;{EOUT} = $self-&gt;{EIN},</td></tr>
+<tr><td class="h"><a name="3048"></a>3048</td><td></td><td></td><td></td><td></td><td class="s">            $timeout </td></tr>
+<tr><td class="h"><a name="3049"></a>3049</td><td></td><td></td><td></td><td></td><td class="s">         );</td></tr>
+<tr><td class="h"><a name="3050"></a>3050</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3051"></a>3051</td><td></td><td></td><td></td><td></td><td class="s">      else {</td></tr>
+<tr><td class="h"><a name="3052"></a>3052</td><td></td><td></td><td></td><td></td><td class="s">         my @in = map $self-&gt;{$_}, qw( RIN WIN EIN );</td></tr>
+<tr><td class="h"><a name="3053"></a>3053</td><td></td><td></td><td></td><td></td><td class="s">         ## Win32's select() on Win32 seems to die if passed vectors of</td></tr>
+<tr><td class="h"><a name="3054"></a>3054</td><td></td><td></td><td></td><td></td><td class="s">         ## all 0's.  Need to report this when I get back online.</td></tr>
+<tr><td class="h"><a name="3055"></a>3055</td><td></td><td></td><td></td><td></td><td class="s">         for ( @in ) {</td></tr>
+<tr><td class="h"><a name="3056"></a>3056</td><td></td><td></td><td></td><td></td><td class="s">            $_ = undef unless index( ( unpack &quot;b*&quot;, $_ ), 1 ) &gt;= 0;</td></tr>
+<tr><td class="h"><a name="3057"></a>3057</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3058"></a>3058</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3059"></a>3059</td><td></td><td></td><td></td><td></td><td class="s">         $nfound = select(</td></tr>
+<tr><td class="h"><a name="3060"></a>3060</td><td></td><td></td><td></td><td></td><td class="s">            $self-&gt;{ROUT} = $in[0],</td></tr>
+<tr><td class="h"><a name="3061"></a>3061</td><td></td><td></td><td></td><td></td><td class="s">            $self-&gt;{WOUT} = $in[1],</td></tr>
+<tr><td class="h"><a name="3062"></a>3062</td><td></td><td></td><td></td><td></td><td class="s">            $self-&gt;{EOUT} = $in[2],</td></tr>
+<tr><td class="h"><a name="3063"></a>3063</td><td></td><td></td><td></td><td></td><td class="s">            $timeout </td></tr>
+<tr><td class="h"><a name="3064"></a>3064</td><td></td><td></td><td></td><td></td><td class="s">         );</td></tr>
+<tr><td class="h"><a name="3065"></a>3065</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3066"></a>3066</td><td></td><td></td><td></td><td></td><td class="s">         for ( $self-&gt;{ROUT}, $self-&gt;{WOUT}, $self-&gt;{EOUT} ) {</td></tr>
+<tr><td class="h"><a name="3067"></a>3067</td><td></td><td></td><td></td><td></td><td class="s">            $_ = &quot;&quot; unless defined $_;</td></tr>
+<tr><td class="h"><a name="3068"></a>3068</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3069"></a>3069</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3070"></a>3070</td><td></td><td></td><td></td><td></td><td class="s">      last if ! $nfound &amp;&amp; $self-&gt;{non_blocking};</td></tr>
+<tr><td class="h"><a name="3071"></a>3071</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3072"></a>3072</td><td></td><td></td><td></td><td></td><td class="s">      croak &quot;$! in select&quot; if $nfound &lt; 0 and $! != POSIX::EINTR;</td></tr>
+<tr><td class="h"><a name="3073"></a>3073</td><td></td><td></td><td></td><td></td><td class="s">          ## TODO: Analyze the EINTR failure mode and see if this patch</td></tr>
+<tr><td class="h"><a name="3074"></a>3074</td><td></td><td></td><td></td><td></td><td class="s">          ## is adequate and optimal.</td></tr>
+<tr><td class="h"><a name="3075"></a>3075</td><td></td><td></td><td></td><td></td><td class="s">          ## TODO: Add an EINTR test to the test suite.</td></tr>
+<tr><td class="h"><a name="3076"></a>3076</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3077"></a>3077</td><td></td><td></td><td></td><td></td><td class="s">      if ( _debugging_details ) {</td></tr>
+<tr><td class="h"><a name="3078"></a>3078</td><td></td><td></td><td></td><td></td><td class="s">         my $map = join(</td></tr>
+<tr><td class="h"><a name="3079"></a>3079</td><td></td><td></td><td></td><td></td><td class="s">            '',</td></tr>
+<tr><td class="h"><a name="3080"></a>3080</td><td></td><td></td><td></td><td></td><td class="s">            map {</td></tr>
+<tr><td class="h"><a name="3081"></a>3081</td><td></td><td></td><td></td><td></td><td class="s">               my $out;</td></tr>
+<tr><td class="h"><a name="3082"></a>3082</td><td></td><td></td><td></td><td></td><td class="s">               $out = 'r'                     if vec( $self-&gt;{ROUT}, $_, 1 );</td></tr>
+<tr><td class="h"><a name="3083"></a>3083</td><td></td><td></td><td></td><td></td><td class="s">               $out = $out ? 'b' : 'w'        if vec( $self-&gt;{WOUT}, $_, 1 );</td></tr>
+<tr><td class="h"><a name="3084"></a>3084</td><td></td><td></td><td></td><td></td><td class="s">               $out = $out ? uc( $out ) : 'x' if vec( $self-&gt;{EOUT}, $_, 1 );</td></tr>
+<tr><td class="h"><a name="3085"></a>3085</td><td></td><td></td><td></td><td></td><td class="s">               $out = '-' unless $out;</td></tr>
+<tr><td class="h"><a name="3086"></a>3086</td><td></td><td></td><td></td><td></td><td class="s">               $out;</td></tr>
+<tr><td class="h"><a name="3087"></a>3087</td><td></td><td></td><td></td><td></td><td class="s">            } (0..128)</td></tr>
+<tr><td class="h"><a name="3088"></a>3088</td><td></td><td></td><td></td><td></td><td class="s">         );</td></tr>
+<tr><td class="h"><a name="3089"></a>3089</td><td></td><td></td><td></td><td></td><td class="s">         $map =~ s/((?:[a-zA-Z-]|\([^\)]*\)){12,}?)-*$/$1/;</td></tr>
+<tr><td class="h"><a name="3090"></a>3090</td><td></td><td></td><td></td><td></td><td class="s">         _debug &quot;selected  &quot;, $map;</td></tr>
+<tr><td class="h"><a name="3091"></a>3091</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3092"></a>3092</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3093"></a>3093</td><td></td><td></td><td></td><td></td><td class="s">      ## Need to copy since _clobber alters @{$self-&gt;{PIPES}}.</td></tr>
+<tr><td class="h"><a name="3094"></a>3094</td><td></td><td></td><td></td><td></td><td class="s">      ## TODO: Rethink _clobber().  Rethink $file-&gt;{PAUSED}, too.</td></tr>
+<tr><td class="h"><a name="3095"></a>3095</td><td></td><td></td><td></td><td></td><td class="s">      my @pipes = @{$self-&gt;{PIPES}};</td></tr>
+<tr><td class="h"><a name="3096"></a>3096</td><td></td><td></td><td></td><td></td><td class="s">      $io_occurred = $_-&gt;poll( $self ) ? 1 : $io_occurred for @pipes;</td></tr>
+<tr><td class="h"><a name="3097"></a>3097</td><td></td><td></td><td></td><td></td><td class="s">#   FILE:</td></tr>
+<tr><td class="h"><a name="3098"></a>3098</td><td></td><td></td><td></td><td></td><td class="s">#      for my $pipe ( @pipes ) {</td></tr>
+<tr><td class="h"><a name="3099"></a>3099</td><td></td><td></td><td></td><td></td><td class="s">#         ## Pipes can be shared among kids.  If another kid closes the</td></tr>
+<tr><td class="h"><a name="3100"></a>3100</td><td></td><td></td><td></td><td></td><td class="s">#         ## pipe, then it's {FD} will be undef.  Also, on Win32, pipes can</td></tr>
+<tr><td class="h"><a name="3101"></a>3101</td><td></td><td></td><td></td><td></td><td class="s">#         ## be optimized to be files, in which case the FD is left undef</td></tr>
+<tr><td class="h"><a name="3102"></a>3102</td><td></td><td></td><td></td><td></td><td class="s">#         ## so we don't try to select() on it.</td></tr>
+<tr><td class="h"><a name="3103"></a>3103</td><td></td><td></td><td></td><td></td><td class="s">#         if ( $pipe-&gt;{TYPE} =~ /^&gt;/</td></tr>
+<tr><td class="h"><a name="3104"></a>3104</td><td></td><td></td><td></td><td></td><td class="s">#            &amp;&amp; defined $pipe-&gt;{FD}</td></tr>
+<tr><td class="h"><a name="3105"></a>3105</td><td></td><td></td><td></td><td></td><td class="s">#            &amp;&amp; vec( $self-&gt;{ROUT}, $pipe-&gt;{FD}, 1 )</td></tr>
+<tr><td class="h"><a name="3106"></a>3106</td><td></td><td></td><td></td><td></td><td class="s">#         ) {</td></tr>
+<tr><td class="h"><a name="3107"></a>3107</td><td></td><td></td><td></td><td></td><td class="s">#            _debug_desc_fd( &quot;filtering data from&quot;, $pipe ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3108"></a>3108</td><td></td><td></td><td></td><td></td><td class="s">#confess &quot;phooey&quot; unless UNIVERSAL::isa( $pipe, &quot;IPC::Run::IO&quot; );</td></tr>
+<tr><td class="h"><a name="3109"></a>3109</td><td></td><td></td><td></td><td></td><td class="s">#            $io_occurred = 1 if $pipe-&gt;_do_filters( $self );</td></tr>
+<tr><td class="h"><a name="3110"></a>3110</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3111"></a>3111</td><td></td><td></td><td></td><td></td><td class="s">#            next FILE unless defined $pipe-&gt;{FD};</td></tr>
+<tr><td class="h"><a name="3112"></a>3112</td><td></td><td></td><td></td><td></td><td class="s">#         }</td></tr>
+<tr><td class="h"><a name="3113"></a>3113</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3114"></a>3114</td><td></td><td></td><td></td><td></td><td class="s">#         ## On Win32, pipes to the child can be optimized to be files</td></tr>
+<tr><td class="h"><a name="3115"></a>3115</td><td></td><td></td><td></td><td></td><td class="s">#         ## and FD left undefined so we won't select on it.</td></tr>
+<tr><td class="h"><a name="3116"></a>3116</td><td></td><td></td><td></td><td></td><td class="s">#         if ( $pipe-&gt;{TYPE} =~ /^&lt;/</td></tr>
+<tr><td class="h"><a name="3117"></a>3117</td><td></td><td></td><td></td><td></td><td class="s">#            &amp;&amp; defined $pipe-&gt;{FD}</td></tr>
+<tr><td class="h"><a name="3118"></a>3118</td><td></td><td></td><td></td><td></td><td class="s">#            &amp;&amp; vec( $self-&gt;{WOUT}, $pipe-&gt;{FD}, 1 )</td></tr>
+<tr><td class="h"><a name="3119"></a>3119</td><td></td><td></td><td></td><td></td><td class="s">#         ) {</td></tr>
+<tr><td class="h"><a name="3120"></a>3120</td><td></td><td></td><td></td><td></td><td class="s">#            _debug_desc_fd( &quot;filtering data to&quot;, $pipe ) if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3121"></a>3121</td><td></td><td></td><td></td><td></td><td class="s">#            $io_occurred = 1 if $pipe-&gt;_do_filters( $self );</td></tr>
+<tr><td class="h"><a name="3122"></a>3122</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3123"></a>3123</td><td></td><td></td><td></td><td></td><td class="s">#            next FILE unless defined $pipe-&gt;{FD};</td></tr>
+<tr><td class="h"><a name="3124"></a>3124</td><td></td><td></td><td></td><td></td><td class="s">#         }</td></tr>
+<tr><td class="h"><a name="3125"></a>3125</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3126"></a>3126</td><td></td><td></td><td></td><td></td><td class="s">#         if ( defined $pipe-&gt;{FD} &amp;&amp; vec( $self-&gt;{EOUT}, $pipe-&gt;{FD}, 1 ) ) {</td></tr>
+<tr><td class="h"><a name="3127"></a>3127</td><td></td><td></td><td></td><td></td><td class="s">#            ## BSD seems to sometimes raise the exceptional condition flag</td></tr>
+<tr><td class="h"><a name="3128"></a>3128</td><td></td><td></td><td></td><td></td><td class="s">#            ## when a pipe is closed before we read it's last data.  This</td></tr>
+<tr><td class="h"><a name="3129"></a>3129</td><td></td><td></td><td></td><td></td><td class="s">#            ## causes spurious warnings and generally renders the exception</td></tr>
+<tr><td class="h"><a name="3130"></a>3130</td><td></td><td></td><td></td><td></td><td class="s">#            ## mechanism useless for our purposes.  The exception</td></tr>
+<tr><td class="h"><a name="3131"></a>3131</td><td></td><td></td><td></td><td></td><td class="s">#            ## flag semantics are too variable (they're device driver</td></tr>
+<tr><td class="h"><a name="3132"></a>3132</td><td></td><td></td><td></td><td></td><td class="s">#            ## specific) for me to easily map to any automatic action like</td></tr>
+<tr><td class="h"><a name="3133"></a>3133</td><td></td><td></td><td></td><td></td><td class="s">#            ## warning or croaking (try running v0.42 if you don't beleive me</td></tr>
+<tr><td class="h"><a name="3134"></a>3134</td><td></td><td></td><td></td><td></td><td class="s">#            ## :-).</td></tr>
+<tr><td class="h"><a name="3135"></a>3135</td><td></td><td></td><td></td><td></td><td class="s">#            warn &quot;Exception on descriptor $pipe-&gt;{FD}&quot;;</td></tr>
+<tr><td class="h"><a name="3136"></a>3136</td><td></td><td></td><td></td><td></td><td class="s">#         }</td></tr>
+<tr><td class="h"><a name="3137"></a>3137</td><td></td><td></td><td></td><td></td><td class="s">#      }</td></tr>
+<tr><td class="h"><a name="3138"></a>3138</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="3139"></a>3139</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3140"></a>3140</td><td></td><td></td><td></td><td></td><td class="s">   return;</td></tr>
+<tr><td class="h"><a name="3141"></a>3141</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3142"></a>3142</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3143"></a>3143</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3144"></a>3144</td><td></td><td></td><td></td><td></td><td class="s">sub _cleanup {</td></tr>
+<tr><td class="h"><a name="3145"></a>3145</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3146"></a>3146</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;cleaning up&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3147"></a>3147</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3148"></a>3148</td><td></td><td></td><td></td><td></td><td class="s">   for ( values %{$self-&gt;{PTYS}} ) {</td></tr>
+<tr><td class="h"><a name="3149"></a>3149</td><td></td><td></td><td></td><td></td><td class="s">      next unless ref $_;</td></tr>
+<tr><td class="h"><a name="3150"></a>3150</td><td></td><td></td><td></td><td></td><td class="s">      eval {</td></tr>
+<tr><td class="h"><a name="3151"></a>3151</td><td></td><td></td><td></td><td></td><td class="s">         _debug &quot;closing slave fd &quot;, fileno $_-&gt;slave if _debugging_data;</td></tr>
+<tr><td class="h"><a name="3152"></a>3152</td><td></td><td></td><td></td><td></td><td class="s">         close $_-&gt;slave;</td></tr>
+<tr><td class="h"><a name="3153"></a>3153</td><td></td><td></td><td></td><td></td><td class="s">      };</td></tr>
+<tr><td class="h"><a name="3154"></a>3154</td><td></td><td></td><td></td><td></td><td class="s">      carp $@ . &quot; while closing ptys&quot; if $@;</td></tr>
+<tr><td class="h"><a name="3155"></a>3155</td><td></td><td></td><td></td><td></td><td class="s">      eval {</td></tr>
+<tr><td class="h"><a name="3156"></a>3156</td><td></td><td></td><td></td><td></td><td class="s">         _debug &quot;closing master fd &quot;, fileno $_ if _debugging_data;</td></tr>
+<tr><td class="h"><a name="3157"></a>3157</td><td></td><td></td><td></td><td></td><td class="s">         close $_;</td></tr>
+<tr><td class="h"><a name="3158"></a>3158</td><td></td><td></td><td></td><td></td><td class="s">      };</td></tr>
+<tr><td class="h"><a name="3159"></a>3159</td><td></td><td></td><td></td><td></td><td class="s">      carp $@ . &quot; closing ptys&quot; if $@;</td></tr>
+<tr><td class="h"><a name="3160"></a>3160</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="3161"></a>3161</td><td></td><td></td><td></td><td></td><td class="s">   </td></tr>
+<tr><td class="h"><a name="3162"></a>3162</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;cleaning up pipes&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3163"></a>3163</td><td></td><td></td><td></td><td></td><td class="s">   ## _clobber modifies PIPES</td></tr>
+<tr><td class="h"><a name="3164"></a>3164</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;_clobber( $self-&gt;{PIPES}-&gt;[0] ) while @{$self-&gt;{PIPES}};</td></tr>
+<tr><td class="h"><a name="3165"></a>3165</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3166"></a>3166</td><td></td><td></td><td></td><td></td><td class="s">   for my $kid ( @{$self-&gt;{KIDS}} ) {</td></tr>
+<tr><td class="h"><a name="3167"></a>3167</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;cleaning up kid &quot;, $kid-&gt;{NUM} if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3168"></a>3168</td><td></td><td></td><td></td><td></td><td class="s">      if ( ! length $kid-&gt;{PID} ) {</td></tr>
+<tr><td class="h"><a name="3169"></a>3169</td><td></td><td></td><td></td><td></td><td class="s">         _debug 'never ran child ', $kid-&gt;{NUM}, &quot;, can't reap&quot;</td></tr>
+<tr><td class="h"><a name="3170"></a>3170</td><td></td><td></td><td></td><td></td><td class="s">            if _debugging;</td></tr>
+<tr><td class="h"><a name="3171"></a>3171</td><td></td><td></td><td></td><td></td><td class="s">         for my $op ( @{$kid-&gt;{OPS}} ) {</td></tr>
+<tr><td class="h"><a name="3172"></a>3172</td><td></td><td></td><td></td><td></td><td class="s">            _close( $op-&gt;{TFD} )</td></tr>
+<tr><td class="h"><a name="3173"></a>3173</td><td></td><td></td><td></td><td></td><td class="s">               if defined $op-&gt;{TFD} &amp;&amp; ! defined $op-&gt;{TEMP_FILE_HANDLE};</td></tr>
+<tr><td class="h"><a name="3174"></a>3174</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3175"></a>3175</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3176"></a>3176</td><td></td><td></td><td></td><td></td><td class="s">      elsif ( ! defined $kid-&gt;{RESULT} ) {</td></tr>
+<tr><td class="h"><a name="3177"></a>3177</td><td></td><td></td><td></td><td></td><td class="s">         _debug 'reaping child ', $kid-&gt;{NUM}, ' (pid ', $kid-&gt;{PID}, ')'</td></tr>
+<tr><td class="h"><a name="3178"></a>3178</td><td></td><td></td><td></td><td></td><td class="s">            if _debugging;</td></tr>
+<tr><td class="h"><a name="3179"></a>3179</td><td></td><td></td><td></td><td></td><td class="s">         my $pid = waitpid $kid-&gt;{PID}, 0;</td></tr>
+<tr><td class="h"><a name="3180"></a>3180</td><td></td><td></td><td></td><td></td><td class="s">         $kid-&gt;{RESULT} = $?;</td></tr>
+<tr><td class="h"><a name="3181"></a>3181</td><td></td><td></td><td></td><td></td><td class="s">         _debug 'reaped ', $pid, ', $?=', $kid-&gt;{RESULT}</td></tr>
+<tr><td class="h"><a name="3182"></a>3182</td><td></td><td></td><td></td><td></td><td class="s">            if _debugging;</td></tr>
+<tr><td class="h"><a name="3183"></a>3183</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3184"></a>3184</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3185"></a>3185</td><td></td><td></td><td></td><td></td><td class="s">#      if ( defined $kid-&gt;{DEBUG_FD} ) {</td></tr>
+<tr><td class="h"><a name="3186"></a>3186</td><td></td><td></td><td></td><td></td><td class="s">#         die;</td></tr>
+<tr><td class="h"><a name="3187"></a>3187</td><td></td><td></td><td></td><td></td><td class="s">#         @{$kid-&gt;{OPS}} = grep</td></tr>
+<tr><td class="h"><a name="3188"></a>3188</td><td></td><td></td><td></td><td></td><td class="s">#            ! defined $_-&gt;{KFD} || $_-&gt;{KFD} != $kid-&gt;{DEBUG_FD},</td></tr>
+<tr><td class="h"><a name="3189"></a>3189</td><td></td><td></td><td></td><td></td><td class="s">#            @{$kid-&gt;{OPS}};</td></tr>
+<tr><td class="h"><a name="3190"></a>3190</td><td></td><td></td><td></td><td></td><td class="s">#         $kid-&gt;{DEBUG_FD} = undef;</td></tr>
+<tr><td class="h"><a name="3191"></a>3191</td><td></td><td></td><td></td><td></td><td class="s">#      }</td></tr>
+<tr><td class="h"><a name="3192"></a>3192</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3193"></a>3193</td><td></td><td></td><td></td><td></td><td class="s">      _debug &quot;cleaning up filters&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3194"></a>3194</td><td></td><td></td><td></td><td></td><td class="s">      for my $op ( @{$kid-&gt;{OPS}} ) {</td></tr>
+<tr><td class="h"><a name="3195"></a>3195</td><td></td><td></td><td></td><td></td><td class="s">         @{$op-&gt;{FILTERS}} = grep {</td></tr>
+<tr><td class="h"><a name="3196"></a>3196</td><td></td><td></td><td></td><td></td><td class="s">            my $filter = $_;</td></tr>
+<tr><td class="h"><a name="3197"></a>3197</td><td></td><td></td><td></td><td></td><td class="s">            ! grep $filter == $_, @{$self-&gt;{TEMP_FILTERS}};</td></tr>
+<tr><td class="h"><a name="3198"></a>3198</td><td></td><td></td><td></td><td></td><td class="s">         } @{$op-&gt;{FILTERS}};</td></tr>
+<tr><td class="h"><a name="3199"></a>3199</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3200"></a>3200</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3201"></a>3201</td><td></td><td></td><td></td><td></td><td class="s">      for my $op ( @{$kid-&gt;{OPS}} ) {</td></tr>
+<tr><td class="h"><a name="3202"></a>3202</td><td></td><td></td><td></td><td></td><td class="s">         $op-&gt;_cleanup( $self ) if UNIVERSAL::isa( $op, &quot;IPC::Run::IO&quot; );</td></tr>
+<tr><td class="h"><a name="3203"></a>3203</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3204"></a>3204</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="3205"></a>3205</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{STATE} = _finished;</td></tr>
+<tr><td class="h"><a name="3206"></a>3206</td><td></td><td></td><td></td><td></td><td class="s">   @{$self-&gt;{TEMP_FILTERS}} = ();</td></tr>
+<tr><td class="h"><a name="3207"></a>3207</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;done cleaning up&quot; if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3208"></a>3208</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3209"></a>3209</td><td></td><td></td><td></td><td></td><td class="s">   POSIX::close $self-&gt;{DEBUG_FD} if defined $self-&gt;{DEBUG_FD};</td></tr>
+<tr><td class="h"><a name="3210"></a>3210</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{DEBUG_FD} = undef;</td></tr>
+<tr><td class="h"><a name="3211"></a>3211</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3212"></a>3212</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3213"></a>3213</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3214"></a>3214</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3215"></a>3215</td><td></td><td></td><td></td><td></td><td class="s">=item pump</td></tr>
+<tr><td class="h"><a name="3216"></a>3216</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3217"></a>3217</td><td></td><td></td><td></td><td></td><td class="s">   pump $h;</td></tr>
+<tr><td class="h"><a name="3218"></a>3218</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;pump;</td></tr>
+<tr><td class="h"><a name="3219"></a>3219</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3220"></a>3220</td><td></td><td></td><td></td><td></td><td class="s">Pump accepts a single parameter harness.  It blocks until it delivers some</td></tr>
+<tr><td class="h"><a name="3221"></a>3221</td><td></td><td></td><td></td><td></td><td class="s">input or recieves some output.  It returns TRUE if there is still input or</td></tr>
+<tr><td class="h"><a name="3222"></a>3222</td><td></td><td></td><td></td><td></td><td class="s">output to be done, FALSE otherwise.</td></tr>
+<tr><td class="h"><a name="3223"></a>3223</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3224"></a>3224</td><td></td><td></td><td></td><td></td><td class="s">pump() will automatically call start() if need be, so you may call harness()</td></tr>
+<tr><td class="h"><a name="3225"></a>3225</td><td></td><td></td><td></td><td></td><td class="s">then proceed to pump() if that helps you structure your application.</td></tr>
+<tr><td class="h"><a name="3226"></a>3226</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3227"></a>3227</td><td></td><td></td><td></td><td></td><td class="s">If pump() is called after all harnessed activities have completed, a &quot;process</td></tr>
+<tr><td class="h"><a name="3228"></a>3228</td><td></td><td></td><td></td><td></td><td class="s">ended prematurely&quot; exception to be thrown.  This allows for simple scripting</td></tr>
+<tr><td class="h"><a name="3229"></a>3229</td><td></td><td></td><td></td><td></td><td class="s">of external applications without having to add lots of error handling code at</td></tr>
+<tr><td class="h"><a name="3230"></a>3230</td><td></td><td></td><td></td><td></td><td class="s">each step of the script:</td></tr>
+<tr><td class="h"><a name="3231"></a>3231</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3232"></a>3232</td><td></td><td></td><td></td><td></td><td class="s">   $h = harness \@smbclient, \$in, \$out, $err;</td></tr>
+<tr><td class="h"><a name="3233"></a>3233</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3234"></a>3234</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;cd /foo\n&quot;;</td></tr>
+<tr><td class="h"><a name="3235"></a>3235</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;pump until $out =~ /^smb.*&gt; \Z/m;</td></tr>
+<tr><td class="h"><a name="3236"></a>3236</td><td></td><td></td><td></td><td></td><td class="s">   die &quot;error cding to /foo:\n$out&quot; if $out =~ &quot;ERR&quot;;</td></tr>
+<tr><td class="h"><a name="3237"></a>3237</td><td></td><td></td><td></td><td></td><td class="s">   $out = '';</td></tr>
+<tr><td class="h"><a name="3238"></a>3238</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3239"></a>3239</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;mget *\n&quot;;</td></tr>
+<tr><td class="h"><a name="3240"></a>3240</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;pump until $out =~ /^smb.*&gt; \Z/m;</td></tr>
+<tr><td class="h"><a name="3241"></a>3241</td><td></td><td></td><td></td><td></td><td class="s">   die &quot;error retrieving files:\n$out&quot; if $out =~ &quot;ERR&quot;;</td></tr>
+<tr><td class="h"><a name="3242"></a>3242</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3243"></a>3243</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;finish;</td></tr>
+<tr><td class="h"><a name="3244"></a>3244</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3245"></a>3245</td><td></td><td></td><td></td><td></td><td class="s">   warn $err if $err;</td></tr>
+<tr><td class="h"><a name="3246"></a>3246</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3247"></a>3247</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3248"></a>3248</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3249"></a>3249</td><td></td><td></td><td></td><td></td><td class="s">sub pump {</td></tr>
+<tr><td class="h"><a name="3250"></a>3250</td><td></td><td></td><td></td><td></td><td class="s">   die &quot;pump() takes only a a single harness as a parameter&quot;</td></tr>
+<tr><td class="h"><a name="3251"></a>3251</td><td></td><td></td><td></td><td></td><td class="s">      unless @_ == 1 &amp;&amp; UNIVERSAL::isa( $_[0], __PACKAGE__ );</td></tr>
+<tr><td class="h"><a name="3252"></a>3252</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3253"></a>3253</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3254"></a>3254</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3255"></a>3255</td><td></td><td></td><td></td><td></td><td class="s">   local $cur_self = $self;</td></tr>
+<tr><td class="h"><a name="3256"></a>3256</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3257"></a>3257</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;** pumping&quot; </td></tr>
+<tr><td class="h"><a name="3258"></a>3258</td><td></td><td></td><td></td><td></td><td class="s">      if _debugging;</td></tr>
+<tr><td class="h"><a name="3259"></a>3259</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3260"></a>3260</td><td></td><td></td><td></td><td></td><td class="s">#   my $r = eval {</td></tr>
+<tr><td class="h"><a name="3261"></a>3261</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;start if $self-&gt;{STATE} &lt; _started;</td></tr>
+<tr><td class="h"><a name="3262"></a>3262</td><td></td><td></td><td></td><td></td><td class="s">      croak &quot;process ended prematurely&quot; unless $self-&gt;pumpable;</td></tr>
+<tr><td class="h"><a name="3263"></a>3263</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3264"></a>3264</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;{auto_close_ins} = 0;</td></tr>
+<tr><td class="h"><a name="3265"></a>3265</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;{break_on_io}    = 1;</td></tr>
+<tr><td class="h"><a name="3266"></a>3266</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;_select_loop;</td></tr>
+<tr><td class="h"><a name="3267"></a>3267</td><td></td><td></td><td></td><td></td><td class="s">      return $self-&gt;pumpable;</td></tr>
+<tr><td class="h"><a name="3268"></a>3268</td><td></td><td></td><td></td><td></td><td class="s">#   };</td></tr>
+<tr><td class="h"><a name="3269"></a>3269</td><td></td><td></td><td></td><td></td><td class="s">#   if ( $@ ) {</td></tr>
+<tr><td class="h"><a name="3270"></a>3270</td><td></td><td></td><td></td><td></td><td class="s">#      my $x = $@;</td></tr>
+<tr><td class="h"><a name="3271"></a>3271</td><td></td><td></td><td></td><td></td><td class="s">#      _debug $x if _debugging &amp;&amp; $x;</td></tr>
+<tr><td class="h"><a name="3272"></a>3272</td><td></td><td></td><td></td><td></td><td class="s">#      eval { $self-&gt;_cleanup };</td></tr>
+<tr><td class="h"><a name="3273"></a>3273</td><td></td><td></td><td></td><td></td><td class="s">#      warn $@ if $@;</td></tr>
+<tr><td class="h"><a name="3274"></a>3274</td><td></td><td></td><td></td><td></td><td class="s">#      die $x;</td></tr>
+<tr><td class="h"><a name="3275"></a>3275</td><td></td><td></td><td></td><td></td><td class="s">#   }</td></tr>
+<tr><td class="h"><a name="3276"></a>3276</td><td></td><td></td><td></td><td></td><td class="s">#   return $r;</td></tr>
+<tr><td class="h"><a name="3277"></a>3277</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3278"></a>3278</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3279"></a>3279</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3280"></a>3280</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3281"></a>3281</td><td></td><td></td><td></td><td></td><td class="s">=item pump_nb</td></tr>
+<tr><td class="h"><a name="3282"></a>3282</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3283"></a>3283</td><td></td><td></td><td></td><td></td><td class="s">   pump_nb $h;</td></tr>
+<tr><td class="h"><a name="3284"></a>3284</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;pump_nb;</td></tr>
+<tr><td class="h"><a name="3285"></a>3285</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3286"></a>3286</td><td></td><td></td><td></td><td></td><td class="s">&quot;pump() non-blocking&quot;, pumps if anything's ready to be pumped, returns</td></tr>
+<tr><td class="h"><a name="3287"></a>3287</td><td></td><td></td><td></td><td></td><td class="s">immediately otherwise.  This is useful if you're doing some long-running</td></tr>
+<tr><td class="h"><a name="3288"></a>3288</td><td></td><td></td><td></td><td></td><td class="s">task in the foreground, but don't want to starve any child processes.</td></tr>
+<tr><td class="h"><a name="3289"></a>3289</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3290"></a>3290</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3291"></a>3291</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3292"></a>3292</td><td></td><td></td><td></td><td></td><td class="s">sub pump_nb {</td></tr>
+<tr><td class="h"><a name="3293"></a>3293</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3294"></a>3294</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3295"></a>3295</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{non_blocking} = 1;</td></tr>
+<tr><td class="h"><a name="3296"></a>3296</td><td></td><td></td><td></td><td></td><td class="s">   my $r = eval { $self-&gt;pump };</td></tr>
+<tr><td class="h"><a name="3297"></a>3297</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{non_blocking} = 0;</td></tr>
+<tr><td class="h"><a name="3298"></a>3298</td><td></td><td></td><td></td><td></td><td class="s">   die $@ if $@;</td></tr>
+<tr><td class="h"><a name="3299"></a>3299</td><td></td><td></td><td></td><td></td><td class="s">   return $r;</td></tr>
+<tr><td class="h"><a name="3300"></a>3300</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3301"></a>3301</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3302"></a>3302</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3303"></a>3303</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3304"></a>3304</td><td></td><td></td><td></td><td></td><td class="s">=item pumpable</td></tr>
+<tr><td class="h"><a name="3305"></a>3305</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3306"></a>3306</td><td></td><td></td><td></td><td></td><td class="s">Returns TRUE if calling pump() won't throw an immediate &quot;process ended</td></tr>
+<tr><td class="h"><a name="3307"></a>3307</td><td></td><td></td><td></td><td></td><td class="s">prematurely&quot; exception.  This means that there are open I/O channels or</td></tr>
+<tr><td class="h"><a name="3308"></a>3308</td><td></td><td></td><td></td><td></td><td class="s">active processes. May yield the parent processes' time slice for 0.01</td></tr>
+<tr><td class="h"><a name="3309"></a>3309</td><td></td><td></td><td></td><td></td><td class="s">second if all pipes are to the child and all are paused.  In this case</td></tr>
+<tr><td class="h"><a name="3310"></a>3310</td><td></td><td></td><td></td><td></td><td class="s">we can't tell if the child is dead, so we yield the processor and</td></tr>
+<tr><td class="h"><a name="3311"></a>3311</td><td></td><td></td><td></td><td></td><td class="s">then attempt to reap the child in a nonblocking way.</td></tr>
+<tr><td class="h"><a name="3312"></a>3312</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3313"></a>3313</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3314"></a>3314</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3315"></a>3315</td><td></td><td></td><td></td><td></td><td class="s">## Undocumented feature (don't depend on it outside this module):</td></tr>
+<tr><td class="h"><a name="3316"></a>3316</td><td></td><td></td><td></td><td></td><td class="s">## returns -1 if we have I/O channels open, or &gt;0 if no I/O channels</td></tr>
+<tr><td class="h"><a name="3317"></a>3317</td><td></td><td></td><td></td><td></td><td class="s">## open, but we have kids running.  This allows the select loop</td></tr>
+<tr><td class="h"><a name="3318"></a>3318</td><td></td><td></td><td></td><td></td><td class="s">## to poll for child exit.</td></tr>
+<tr><td class="h"><a name="3319"></a>3319</td><td></td><td></td><td></td><td></td><td class="s">sub pumpable {</td></tr>
+<tr><td class="h"><a name="3320"></a>3320</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3321"></a>3321</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3322"></a>3322</td><td></td><td></td><td></td><td></td><td class="s">   ## There's a catch-22 we can get in to if there is only one pipe left</td></tr>
+<tr><td class="h"><a name="3323"></a>3323</td><td></td><td></td><td></td><td></td><td class="s">   ## open to the child and it's paused (ie the SCALAR it's tied to</td></tr>
+<tr><td class="h"><a name="3324"></a>3324</td><td></td><td></td><td></td><td></td><td class="s">   ## is '').  It's paused, so we're not select()ing on it, so we don't</td></tr>
+<tr><td class="h"><a name="3325"></a>3325</td><td></td><td></td><td></td><td></td><td class="s">   ## check it to see if the child attached to it is alive and it stays</td></tr>
+<tr><td class="h"><a name="3326"></a>3326</td><td></td><td></td><td></td><td></td><td class="s">   ## in @{$self-&gt;{PIPES}} forever.  So, if all pipes are paused, see if</td></tr>
+<tr><td class="h"><a name="3327"></a>3327</td><td></td><td></td><td></td><td></td><td class="s">   ## we can reap the child.</td></tr>
+<tr><td class="h"><a name="3328"></a>3328</td><td></td><td></td><td></td><td></td><td class="s">   return -1 if grep !$_-&gt;{PAUSED}, @{$self-&gt;{PIPES}};</td></tr>
+<tr><td class="h"><a name="3329"></a>3329</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3330"></a>3330</td><td></td><td></td><td></td><td></td><td class="s">   ## See if the child is dead.</td></tr>
+<tr><td class="h"><a name="3331"></a>3331</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;reap_nb;</td></tr>
+<tr><td class="h"><a name="3332"></a>3332</td><td></td><td></td><td></td><td></td><td class="s">   return 0 unless $self-&gt;_running_kids;</td></tr>
+<tr><td class="h"><a name="3333"></a>3333</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3334"></a>3334</td><td></td><td></td><td></td><td></td><td class="s">   ## If we reap_nb and it's not dead yet, yield to it to see if it</td></tr>
+<tr><td class="h"><a name="3335"></a>3335</td><td></td><td></td><td></td><td></td><td class="s">   ## exits.</td></tr>
+<tr><td class="h"><a name="3336"></a>3336</td><td></td><td></td><td></td><td></td><td class="s">   ##</td></tr>
+<tr><td class="h"><a name="3337"></a>3337</td><td></td><td></td><td></td><td></td><td class="s">   ## A better solution would be to unpause all the pipes, but I tried that</td></tr>
+<tr><td class="h"><a name="3338"></a>3338</td><td></td><td></td><td></td><td></td><td class="s">   ## and it never errored on linux.  Sigh.  </td></tr>
+<tr><td class="h"><a name="3339"></a>3339</td><td></td><td></td><td></td><td></td><td class="s">   select undef, undef, undef, 0.0001;</td></tr>
+<tr><td class="h"><a name="3340"></a>3340</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3341"></a>3341</td><td></td><td></td><td></td><td></td><td class="s">   ## try again</td></tr>
+<tr><td class="h"><a name="3342"></a>3342</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;reap_nb;</td></tr>
+<tr><td class="h"><a name="3343"></a>3343</td><td></td><td></td><td></td><td></td><td class="s">   return 0 unless $self-&gt;_running_kids;</td></tr>
+<tr><td class="h"><a name="3344"></a>3344</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3345"></a>3345</td><td></td><td></td><td></td><td></td><td class="s">   return -1; ## There are pipes waiting</td></tr>
+<tr><td class="h"><a name="3346"></a>3346</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3347"></a>3347</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3348"></a>3348</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3349"></a>3349</td><td></td><td></td><td></td><td></td><td class="s">sub _running_kids {</td></tr>
+<tr><td class="h"><a name="3350"></a>3350</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3351"></a>3351</td><td></td><td></td><td></td><td></td><td class="s">   return grep</td></tr>
+<tr><td class="h"><a name="3352"></a>3352</td><td></td><td></td><td></td><td></td><td class="s">      defined $_-&gt;{PID} &amp;&amp; ! defined $_-&gt;{RESULT},</td></tr>
+<tr><td class="h"><a name="3353"></a>3353</td><td></td><td></td><td></td><td></td><td class="s">      @{$self-&gt;{KIDS}};</td></tr>
+<tr><td class="h"><a name="3354"></a>3354</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3355"></a>3355</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3356"></a>3356</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3357"></a>3357</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3358"></a>3358</td><td></td><td></td><td></td><td></td><td class="s">=item reap_nb</td></tr>
+<tr><td class="h"><a name="3359"></a>3359</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3360"></a>3360</td><td></td><td></td><td></td><td></td><td class="s">Attempts to reap child processes, but does not block.</td></tr>
+<tr><td class="h"><a name="3361"></a>3361</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3362"></a>3362</td><td></td><td></td><td></td><td></td><td class="s">Does not currently take any parameters, one day it will allow specific</td></tr>
+<tr><td class="h"><a name="3363"></a>3363</td><td></td><td></td><td></td><td></td><td class="s">children to be reaped.</td></tr>
+<tr><td class="h"><a name="3364"></a>3364</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3365"></a>3365</td><td></td><td></td><td></td><td></td><td class="s">Only call this from a signal handler if your C&lt;perl&gt; is recent enough</td></tr>
+<tr><td class="h"><a name="3366"></a>3366</td><td></td><td></td><td></td><td></td><td class="s">to have safe signal handling (5.6.1 did not, IIRC, but it was beign discussed</td></tr>
+<tr><td class="h"><a name="3367"></a>3367</td><td></td><td></td><td></td><td></td><td class="s">on perl5-porters).  Calling this (or doing any significant work) in a signal</td></tr>
+<tr><td class="h"><a name="3368"></a>3368</td><td></td><td></td><td></td><td></td><td class="s">handler on older C&lt;perl&gt;s is asking for seg faults.</td></tr>
+<tr><td class="h"><a name="3369"></a>3369</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3370"></a>3370</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3371"></a>3371</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3372"></a>3372</td><td class="c3">1</td><td class="c3"><span title="Avg 100ns">100ns</span></td><td></td><td></td><td class="s">my $still_runnings;</td></tr>
+<tr><td class="h"><a name="3373"></a>3373</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3374"></a>3374</td><td></td><td></td><td></td><td></td><td class="s">sub reap_nb {</td></tr>
+<tr><td class="h"><a name="3375"></a>3375</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3376"></a>3376</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3377"></a>3377</td><td></td><td></td><td></td><td></td><td class="s">   local $cur_self = $self;</td></tr>
+<tr><td class="h"><a name="3378"></a>3378</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3379"></a>3379</td><td></td><td></td><td></td><td></td><td class="s">   ## No more pipes, look to see if all the kids yet live, reaping those</td></tr>
+<tr><td class="h"><a name="3380"></a>3380</td><td></td><td></td><td></td><td></td><td class="s">   ## that haven't.  I'd use $SIG{CHLD}/$SIG{CLD}, but that's broken</td></tr>
+<tr><td class="h"><a name="3381"></a>3381</td><td></td><td></td><td></td><td></td><td class="s">   ## on older (SYSV) platforms and perhaps less portable than waitpid().</td></tr>
+<tr><td class="h"><a name="3382"></a>3382</td><td></td><td></td><td></td><td></td><td class="s">   ## This could be slow with a lot of kids, but that's rare and, well,</td></tr>
+<tr><td class="h"><a name="3383"></a>3383</td><td></td><td></td><td></td><td></td><td class="s">   ## a lot of kids is slow in the first place.</td></tr>
+<tr><td class="h"><a name="3384"></a>3384</td><td></td><td></td><td></td><td></td><td class="s">   ## Oh, and this keeps us from reaping other children the process</td></tr>
+<tr><td class="h"><a name="3385"></a>3385</td><td></td><td></td><td></td><td></td><td class="s">   ## may have spawned.</td></tr>
+<tr><td class="h"><a name="3386"></a>3386</td><td></td><td></td><td></td><td></td><td class="s">   for my $kid ( @{$self-&gt;{KIDS}} ) {</td></tr>
+<tr><td class="h"><a name="3387"></a>3387</td><td></td><td></td><td></td><td></td><td class="s">      if ( Win32_MODE ) {</td></tr>
+<tr><td class="h"><a name="3388"></a>3388</td><td></td><td></td><td></td><td></td><td class="s">         next if ! defined $kid-&gt;{PROCESS} || defined $kid-&gt;{RESULT};</td></tr>
+<tr><td class="h"><a name="3389"></a>3389</td><td></td><td></td><td></td><td></td><td class="s">         unless ( $kid-&gt;{PROCESS}-&gt;Wait( 0 ) ) {</td></tr>
+<tr><td class="h"><a name="3390"></a>3390</td><td></td><td></td><td></td><td></td><td class="s">            _debug &quot;kid $kid-&gt;{NUM} ($kid-&gt;{PID}) still running&quot;</td></tr>
+<tr><td class="h"><a name="3391"></a>3391</td><td></td><td></td><td></td><td></td><td class="s">               if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3392"></a>3392</td><td></td><td></td><td></td><td></td><td class="s">            next;</td></tr>
+<tr><td class="h"><a name="3393"></a>3393</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3394"></a>3394</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3395"></a>3395</td><td></td><td></td><td></td><td></td><td class="s">         _debug &quot;kid $kid-&gt;{NUM} ($kid-&gt;{PID}) exited&quot;</td></tr>
+<tr><td class="h"><a name="3396"></a>3396</td><td></td><td></td><td></td><td></td><td class="s">            if _debugging;</td></tr>
+<tr><td class="h"><a name="3397"></a>3397</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3398"></a>3398</td><td></td><td></td><td></td><td></td><td class="s">         $kid-&gt;{PROCESS}-&gt;GetExitCode( $kid-&gt;{RESULT} )</td></tr>
+<tr><td class="h"><a name="3399"></a>3399</td><td></td><td></td><td></td><td></td><td class="s">            or croak &quot;$! while GetExitCode()ing for Win32 process&quot;;</td></tr>
+<tr><td class="h"><a name="3400"></a>3400</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3401"></a>3401</td><td></td><td></td><td></td><td></td><td class="s">         unless ( defined $kid-&gt;{RESULT} ) {</td></tr>
+<tr><td class="h"><a name="3402"></a>3402</td><td></td><td></td><td></td><td></td><td class="s">            $kid-&gt;{RESULT} = &quot;0 but true&quot;;</td></tr>
+<tr><td class="h"><a name="3403"></a>3403</td><td></td><td></td><td></td><td></td><td class="s">            $? = $kid-&gt;{RESULT} = 0x0F;</td></tr>
+<tr><td class="h"><a name="3404"></a>3404</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3405"></a>3405</td><td></td><td></td><td></td><td></td><td class="s">         else {</td></tr>
+<tr><td class="h"><a name="3406"></a>3406</td><td></td><td></td><td></td><td></td><td class="s">            $? = $kid-&gt;{RESULT} &lt;&lt; 8;</td></tr>
+<tr><td class="h"><a name="3407"></a>3407</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3408"></a>3408</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3409"></a>3409</td><td></td><td></td><td></td><td></td><td class="s">      else {</td></tr>
+<tr><td class="h"><a name="3410"></a>3410</td><td></td><td></td><td></td><td></td><td class="s">         next if ! defined $kid-&gt;{PID} || defined $kid-&gt;{RESULT};</td></tr>
+<tr><td class="h"><a name="3411"></a>3411</td><td></td><td></td><td></td><td></td><td class="s">         my $pid = waitpid $kid-&gt;{PID}, POSIX::WNOHANG();</td></tr>
+<tr><td class="h"><a name="3412"></a>3412</td><td></td><td></td><td></td><td></td><td class="s">         unless ( $pid ) {</td></tr>
+<tr><td class="h"><a name="3413"></a>3413</td><td></td><td></td><td></td><td></td><td class="s">            _debug &quot;$kid-&gt;{NUM} ($kid-&gt;{PID}) still running&quot;</td></tr>
+<tr><td class="h"><a name="3414"></a>3414</td><td></td><td></td><td></td><td></td><td class="s">               if _debugging_details;</td></tr>
+<tr><td class="h"><a name="3415"></a>3415</td><td></td><td></td><td></td><td></td><td class="s">            next;</td></tr>
+<tr><td class="h"><a name="3416"></a>3416</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3417"></a>3417</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3418"></a>3418</td><td></td><td></td><td></td><td></td><td class="s">         if ( $pid &lt; 0 ) {</td></tr>
+<tr><td class="h"><a name="3419"></a>3419</td><td></td><td></td><td></td><td></td><td class="s">            _debug &quot;No such process: $kid-&gt;{PID}\n&quot; if _debugging;</td></tr>
+<tr><td class="h"><a name="3420"></a>3420</td><td></td><td></td><td></td><td></td><td class="s">            $kid-&gt;{RESULT} = &quot;unknown result, unknown PID&quot;;</td></tr>
+<tr><td class="h"><a name="3421"></a>3421</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3422"></a>3422</td><td></td><td></td><td></td><td></td><td class="s">         else {</td></tr>
+<tr><td class="h"><a name="3423"></a>3423</td><td></td><td></td><td></td><td></td><td class="s">            _debug &quot;kid $kid-&gt;{NUM} ($kid-&gt;{PID}) exited&quot;</td></tr>
+<tr><td class="h"><a name="3424"></a>3424</td><td></td><td></td><td></td><td></td><td class="s">               if _debugging;</td></tr>
+<tr><td class="h"><a name="3425"></a>3425</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3426"></a>3426</td><td></td><td></td><td></td><td></td><td class="s">            confess &quot;waitpid returned the wrong PID: $pid instead of $kid-&gt;{PID}&quot;</td></tr>
+<tr><td class="h"><a name="3427"></a>3427</td><td></td><td></td><td></td><td></td><td class="s">               unless $pid = $kid-&gt;{PID};</td></tr>
+<tr><td class="h"><a name="3428"></a>3428</td><td></td><td></td><td></td><td></td><td class="s">            _debug &quot;$kid-&gt;{PID} returned $?\n&quot; if _debugging;</td></tr>
+<tr><td class="h"><a name="3429"></a>3429</td><td></td><td></td><td></td><td></td><td class="s">            $kid-&gt;{RESULT} = $?;</td></tr>
+<tr><td class="h"><a name="3430"></a>3430</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3431"></a>3431</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3432"></a>3432</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="3433"></a>3433</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3434"></a>3434</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3435"></a>3435</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3436"></a>3436</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3437"></a>3437</td><td></td><td></td><td></td><td></td><td class="s">=item finish</td></tr>
+<tr><td class="h"><a name="3438"></a>3438</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3439"></a>3439</td><td></td><td></td><td></td><td></td><td class="s">This must be called after the last start() or pump() call for a harness,</td></tr>
+<tr><td class="h"><a name="3440"></a>3440</td><td></td><td></td><td></td><td></td><td class="s">or your system will accumulate defunct processes and you may &quot;leak&quot;</td></tr>
+<tr><td class="h"><a name="3441"></a>3441</td><td></td><td></td><td></td><td></td><td class="s">file descriptors.</td></tr>
+<tr><td class="h"><a name="3442"></a>3442</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3443"></a>3443</td><td></td><td></td><td></td><td></td><td class="s">finish() returns TRUE if all children returned 0 (and were not signaled and did</td></tr>
+<tr><td class="h"><a name="3444"></a>3444</td><td></td><td></td><td></td><td></td><td class="s">not coredump, ie ! $?), and FALSE otherwise (this is like run(), and the</td></tr>
+<tr><td class="h"><a name="3445"></a>3445</td><td></td><td></td><td></td><td></td><td class="s">opposite of system()).</td></tr>
+<tr><td class="h"><a name="3446"></a>3446</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3447"></a>3447</td><td></td><td></td><td></td><td></td><td class="s">Once a harness has been finished, it may be run() or start()ed again,</td></tr>
+<tr><td class="h"><a name="3448"></a>3448</td><td></td><td></td><td></td><td></td><td class="s">including by pump()s auto-start.</td></tr>
+<tr><td class="h"><a name="3449"></a>3449</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3450"></a>3450</td><td></td><td></td><td></td><td></td><td class="s">If this throws an exception rather than a normal exit, the harness may</td></tr>
+<tr><td class="h"><a name="3451"></a>3451</td><td></td><td></td><td></td><td></td><td class="s">be left in an unstable state, it's best to kill the harness to get rid</td></tr>
+<tr><td class="h"><a name="3452"></a>3452</td><td></td><td></td><td></td><td></td><td class="s">of all the child processes, etc.</td></tr>
+<tr><td class="h"><a name="3453"></a>3453</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3454"></a>3454</td><td></td><td></td><td></td><td></td><td class="s">Specifically, if a timeout expires in finish(), finish() will not</td></tr>
+<tr><td class="h"><a name="3455"></a>3455</td><td></td><td></td><td></td><td></td><td class="s">kill all the children.  Call C&lt;&lt;$h-&gt;kill_kill&gt;&gt; in this case if you care.</td></tr>
+<tr><td class="h"><a name="3456"></a>3456</td><td></td><td></td><td></td><td></td><td class="s">This differs from the behavior of L&lt;/run&gt;.</td></tr>
+<tr><td class="h"><a name="3457"></a>3457</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3458"></a>3458</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3459"></a>3459</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3460"></a>3460</td><td></td><td></td><td></td><td></td><td class="s">sub finish {</td></tr>
+<tr><td class="h"><a name="3461"></a>3461</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3462"></a>3462</td><td></td><td></td><td></td><td></td><td class="s">   my $options = @_ &amp;&amp; ref $_[-1] eq 'HASH' ? pop : {};</td></tr>
+<tr><td class="h"><a name="3463"></a>3463</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3464"></a>3464</td><td></td><td></td><td></td><td></td><td class="s">   local $cur_self = $self;</td></tr>
+<tr><td class="h"><a name="3465"></a>3465</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3466"></a>3466</td><td></td><td></td><td></td><td></td><td class="s">   _debug &quot;** finishing&quot; if _debugging;</td></tr>
+<tr><td class="h"><a name="3467"></a>3467</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3468"></a>3468</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{non_blocking}   = 0;</td></tr>
+<tr><td class="h"><a name="3469"></a>3469</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{auto_close_ins} = 1;</td></tr>
+<tr><td class="h"><a name="3470"></a>3470</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;{break_on_io}    = 0;</td></tr>
+<tr><td class="h"><a name="3471"></a>3471</td><td></td><td></td><td></td><td></td><td class="s">   # We don't alter $self-&gt;{clear_ins}, start() and run() control it.</td></tr>
+<tr><td class="h"><a name="3472"></a>3472</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3473"></a>3473</td><td></td><td></td><td></td><td></td><td class="s">   while ( $self-&gt;pumpable ) {</td></tr>
+<tr><td class="h"><a name="3474"></a>3474</td><td></td><td></td><td></td><td></td><td class="s">      $self-&gt;_select_loop( $options );</td></tr>
+<tr><td class="h"><a name="3475"></a>3475</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="3476"></a>3476</td><td></td><td></td><td></td><td></td><td class="s">   $self-&gt;_cleanup;</td></tr>
+<tr><td class="h"><a name="3477"></a>3477</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3478"></a>3478</td><td></td><td></td><td></td><td></td><td class="s">   return ! $self-&gt;full_result;</td></tr>
+<tr><td class="h"><a name="3479"></a>3479</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3480"></a>3480</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3481"></a>3481</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3482"></a>3482</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3483"></a>3483</td><td></td><td></td><td></td><td></td><td class="s">=item result</td></tr>
+<tr><td class="h"><a name="3484"></a>3484</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3485"></a>3485</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;result;</td></tr>
+<tr><td class="h"><a name="3486"></a>3486</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3487"></a>3487</td><td></td><td></td><td></td><td></td><td class="s">Returns the first non-zero result code (ie $? &gt;&gt; 8).  See L&lt;/full_result&gt; to </td></tr>
+<tr><td class="h"><a name="3488"></a>3488</td><td></td><td></td><td></td><td></td><td class="s">get the $? value for a child process.</td></tr>
+<tr><td class="h"><a name="3489"></a>3489</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3490"></a>3490</td><td></td><td></td><td></td><td></td><td class="s">To get the result of a particular child, do:</td></tr>
+<tr><td class="h"><a name="3491"></a>3491</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3492"></a>3492</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;result( 0 );  # first child's $? &gt;&gt; 8</td></tr>
+<tr><td class="h"><a name="3493"></a>3493</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;result( 1 );  # second child</td></tr>
+<tr><td class="h"><a name="3494"></a>3494</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3495"></a>3495</td><td></td><td></td><td></td><td></td><td class="s">or</td></tr>
+<tr><td class="h"><a name="3496"></a>3496</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3497"></a>3497</td><td></td><td></td><td></td><td></td><td class="s">   ($h-&gt;results)[0]</td></tr>
+<tr><td class="h"><a name="3498"></a>3498</td><td></td><td></td><td></td><td></td><td class="s">   ($h-&gt;results)[1]</td></tr>
+<tr><td class="h"><a name="3499"></a>3499</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3500"></a>3500</td><td></td><td></td><td></td><td></td><td class="s">Returns undef if no child processes were spawned and no child number was</td></tr>
+<tr><td class="h"><a name="3501"></a>3501</td><td></td><td></td><td></td><td></td><td class="s">specified.  Throws an exception if an out-of-range child number is passed.</td></tr>
+<tr><td class="h"><a name="3502"></a>3502</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3503"></a>3503</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3504"></a>3504</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3505"></a>3505</td><td></td><td></td><td></td><td></td><td class="s">sub _assert_finished {</td></tr>
+<tr><td class="h"><a name="3506"></a>3506</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = $_[0];</td></tr>
+<tr><td class="h"><a name="3507"></a>3507</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3508"></a>3508</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;Harness not run&quot; unless $self-&gt;{STATE} &gt;= _finished;</td></tr>
+<tr><td class="h"><a name="3509"></a>3509</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;Harness not finished running&quot; unless $self-&gt;{STATE} == _finished;</td></tr>
+<tr><td class="h"><a name="3510"></a>3510</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3511"></a>3511</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3512"></a>3512</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3513"></a>3513</td><td></td><td></td><td></td><td></td><td class="s">sub result {</td></tr>
+<tr><td class="h"><a name="3514"></a>3514</td><td></td><td></td><td></td><td></td><td class="s">   &amp;_assert_finished;</td></tr>
+<tr><td class="h"><a name="3515"></a>3515</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3516"></a>3516</td><td></td><td></td><td></td><td></td><td class="s">   </td></tr>
+<tr><td class="h"><a name="3517"></a>3517</td><td></td><td></td><td></td><td></td><td class="s">   if ( @_ ) {</td></tr>
+<tr><td class="h"><a name="3518"></a>3518</td><td></td><td></td><td></td><td></td><td class="s">      my ( $which ) = @_;</td></tr>
+<tr><td class="h"><a name="3519"></a>3519</td><td></td><td></td><td></td><td></td><td class="s">      croak(</td></tr>
+<tr><td class="h"><a name="3520"></a>3520</td><td></td><td></td><td></td><td></td><td class="s">         &quot;Only &quot;,</td></tr>
+<tr><td class="h"><a name="3521"></a>3521</td><td></td><td></td><td></td><td></td><td class="s">         scalar( @{$self-&gt;{KIDS}} ),</td></tr>
+<tr><td class="h"><a name="3522"></a>3522</td><td></td><td></td><td></td><td></td><td class="s">         &quot; child processes, no process $which&quot;</td></tr>
+<tr><td class="h"><a name="3523"></a>3523</td><td></td><td></td><td></td><td></td><td class="s">      )</td></tr>
+<tr><td class="h"><a name="3524"></a>3524</td><td></td><td></td><td></td><td></td><td class="s">         unless $which &gt;= 0 &amp;&amp; $which &lt;= $#{$self-&gt;{KIDS}};</td></tr>
+<tr><td class="h"><a name="3525"></a>3525</td><td></td><td></td><td></td><td></td><td class="s">      return $self-&gt;{KIDS}-&gt;[$which]-&gt;{RESULT} &gt;&gt; 8;</td></tr>
+<tr><td class="h"><a name="3526"></a>3526</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="3527"></a>3527</td><td></td><td></td><td></td><td></td><td class="s">   else {</td></tr>
+<tr><td class="h"><a name="3528"></a>3528</td><td></td><td></td><td></td><td></td><td class="s">      return undef unless @{$self-&gt;{KIDS}};</td></tr>
+<tr><td class="h"><a name="3529"></a>3529</td><td></td><td></td><td></td><td></td><td class="s">      for ( @{$self-&gt;{KIDS}} ) {</td></tr>
+<tr><td class="h"><a name="3530"></a>3530</td><td></td><td></td><td></td><td></td><td class="s">         return $_-&gt;{RESULT} &gt;&gt; 8 if $_-&gt;{RESULT} &gt;&gt; 8;</td></tr>
+<tr><td class="h"><a name="3531"></a>3531</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3532"></a>3532</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="3533"></a>3533</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3534"></a>3534</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3535"></a>3535</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3536"></a>3536</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3537"></a>3537</td><td></td><td></td><td></td><td></td><td class="s">=item results</td></tr>
+<tr><td class="h"><a name="3538"></a>3538</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3539"></a>3539</td><td></td><td></td><td></td><td></td><td class="s">Returns a list of child exit values.  See L&lt;/full_results&gt; if you want to</td></tr>
+<tr><td class="h"><a name="3540"></a>3540</td><td></td><td></td><td></td><td></td><td class="s">know if a signal killed the child.</td></tr>
+<tr><td class="h"><a name="3541"></a>3541</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3542"></a>3542</td><td></td><td></td><td></td><td></td><td class="s">Throws an exception if the harness is not in a finished state.</td></tr>
+<tr><td class="h"><a name="3543"></a>3543</td><td></td><td></td><td></td><td></td><td class="s"> </td></tr>
+<tr><td class="h"><a name="3544"></a>3544</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3545"></a>3545</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3546"></a>3546</td><td></td><td></td><td></td><td></td><td class="s">sub results {</td></tr>
+<tr><td class="h"><a name="3547"></a>3547</td><td></td><td></td><td></td><td></td><td class="s">   &amp;_assert_finished;</td></tr>
+<tr><td class="h"><a name="3548"></a>3548</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3549"></a>3549</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3550"></a>3550</td><td></td><td></td><td></td><td></td><td class="s">   # we add 0 here to stop warnings associated with &quot;unknown result, unknown PID&quot;</td></tr>
+<tr><td class="h"><a name="3551"></a>3551</td><td></td><td></td><td></td><td></td><td class="s">   return map { (0+$_-&gt;{RESULT}) &gt;&gt; 8 } @{$self-&gt;{KIDS}};</td></tr>
+<tr><td class="h"><a name="3552"></a>3552</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3553"></a>3553</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3554"></a>3554</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3555"></a>3555</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3556"></a>3556</td><td></td><td></td><td></td><td></td><td class="s">=item full_result</td></tr>
+<tr><td class="h"><a name="3557"></a>3557</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3558"></a>3558</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;full_result;</td></tr>
+<tr><td class="h"><a name="3559"></a>3559</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3560"></a>3560</td><td></td><td></td><td></td><td></td><td class="s">Returns the first non-zero $?.  See L&lt;/result&gt; to get the first $? &gt;&gt; 8 </td></tr>
+<tr><td class="h"><a name="3561"></a>3561</td><td></td><td></td><td></td><td></td><td class="s">value for a child process.</td></tr>
+<tr><td class="h"><a name="3562"></a>3562</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3563"></a>3563</td><td></td><td></td><td></td><td></td><td class="s">To get the result of a particular child, do:</td></tr>
+<tr><td class="h"><a name="3564"></a>3564</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3565"></a>3565</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;full_result( 0 );  # first child's $? &gt;&gt; 8</td></tr>
+<tr><td class="h"><a name="3566"></a>3566</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;full_result( 1 );  # second child</td></tr>
+<tr><td class="h"><a name="3567"></a>3567</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3568"></a>3568</td><td></td><td></td><td></td><td></td><td class="s">or</td></tr>
+<tr><td class="h"><a name="3569"></a>3569</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3570"></a>3570</td><td></td><td></td><td></td><td></td><td class="s">   ($h-&gt;full_results)[0]</td></tr>
+<tr><td class="h"><a name="3571"></a>3571</td><td></td><td></td><td></td><td></td><td class="s">   ($h-&gt;full_results)[1]</td></tr>
+<tr><td class="h"><a name="3572"></a>3572</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3573"></a>3573</td><td></td><td></td><td></td><td></td><td class="s">Returns undef if no child processes were spawned and no child number was</td></tr>
+<tr><td class="h"><a name="3574"></a>3574</td><td></td><td></td><td></td><td></td><td class="s">specified.  Throws an exception if an out-of-range child number is passed.</td></tr>
+<tr><td class="h"><a name="3575"></a>3575</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3576"></a>3576</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3577"></a>3577</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3578"></a>3578</td><td></td><td></td><td></td><td></td><td class="s">sub full_result {</td></tr>
+<tr><td class="h"><a name="3579"></a>3579</td><td></td><td></td><td></td><td></td><td class="s">   goto &amp;result if @_ &gt; 1;</td></tr>
+<tr><td class="h"><a name="3580"></a>3580</td><td></td><td></td><td></td><td></td><td class="s">   &amp;_assert_finished;</td></tr>
+<tr><td class="h"><a name="3581"></a>3581</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3582"></a>3582</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3583"></a>3583</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3584"></a>3584</td><td></td><td></td><td></td><td></td><td class="s">   return undef unless @{$self-&gt;{KIDS}};</td></tr>
+<tr><td class="h"><a name="3585"></a>3585</td><td></td><td></td><td></td><td></td><td class="s">   for ( @{$self-&gt;{KIDS}} ) {</td></tr>
+<tr><td class="h"><a name="3586"></a>3586</td><td></td><td></td><td></td><td></td><td class="s">      return $_-&gt;{RESULT} if $_-&gt;{RESULT};</td></tr>
+<tr><td class="h"><a name="3587"></a>3587</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="3588"></a>3588</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3589"></a>3589</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3590"></a>3590</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3591"></a>3591</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3592"></a>3592</td><td></td><td></td><td></td><td></td><td class="s">=item full_results</td></tr>
+<tr><td class="h"><a name="3593"></a>3593</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3594"></a>3594</td><td></td><td></td><td></td><td></td><td class="s">Returns a list of child exit values as returned by C&lt;wait&gt;.  See L&lt;/results&gt;</td></tr>
+<tr><td class="h"><a name="3595"></a>3595</td><td></td><td></td><td></td><td></td><td class="s">if you don't care about coredumps or signals.</td></tr>
+<tr><td class="h"><a name="3596"></a>3596</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3597"></a>3597</td><td></td><td></td><td></td><td></td><td class="s">Throws an exception if the harness is not in a finished state.</td></tr>
+<tr><td class="h"><a name="3598"></a>3598</td><td></td><td></td><td></td><td></td><td class="s"> </td></tr>
+<tr><td class="h"><a name="3599"></a>3599</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3600"></a>3600</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3601"></a>3601</td><td></td><td></td><td></td><td></td><td class="s">sub full_results {</td></tr>
+<tr><td class="h"><a name="3602"></a>3602</td><td></td><td></td><td></td><td></td><td class="s">   &amp;_assert_finished;</td></tr>
+<tr><td class="h"><a name="3603"></a>3603</td><td></td><td></td><td></td><td></td><td class="s">   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3604"></a>3604</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3605"></a>3605</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;Harness not run&quot; unless $self-&gt;{STATE} &gt;= _finished;</td></tr>
+<tr><td class="h"><a name="3606"></a>3606</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;Harness not finished running&quot; unless $self-&gt;{STATE} == _finished;</td></tr>
+<tr><td class="h"><a name="3607"></a>3607</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3608"></a>3608</td><td></td><td></td><td></td><td></td><td class="s">   return map $_-&gt;{RESULT}, @{$self-&gt;{KIDS}};</td></tr>
+<tr><td class="h"><a name="3609"></a>3609</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3610"></a>3610</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3611"></a>3611</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3612"></a>3612</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="3613"></a>3613</td><td></td><td></td><td></td><td></td><td class="s">## Filter Scaffolding</td></tr>
+<tr><td class="h"><a name="3614"></a>3614</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="3615"></a>3615</td><td></td><td></td><td></td><td></td><td class="s"><div class="calls"><div class="calls_in"># spent 59&micro;s (13+46) within IPC::Run::BEGIN@3615 which was called:
+#    once (13&micro;s+46&micro;s) by Text::Tradition::Collation::BEGIN@7 at <a href="IPC-Run-pm-733-sub.html#3618">line 3618</a></div></div>use vars (</td></tr>
+<tr><td class="h"><a name="3616"></a>3616</td><td class="c3">2</td><td class="c3"><span title="Avg 4&micro;s">7&micro;s</span></td><td></td><td></td><td class="s">   '$filter_op',        ## The op running a filter chain right now</td></tr>
+<tr><td class="h"><a name="3617"></a>3617</td><td></td><td></td><td></td><td></td><td class="s">   '$filter_num',       ## Which filter is being run right now.</td></tr>
+<tr><td class="h"><a name="3618"></a>3618</td><td class="c3">1</td><td class="c0"><span title="Avg 911&micro;s">911&micro;s</span></td><td class="c3">2</td><td class="c1">105&micro;s</td><td class="s">);<div class="calls"><div class="calls_out"># spent    59&micro;s making 1 call to <a href="IPC-Run-pm-733-sub.html#3615">IPC::Run::BEGIN@3615</a>
+# spent    46&micro;s making 1 call to <a href="vars-pm-6-sub.html#10">vars::import</a></div></div></td></tr>
+<tr><td class="h"><a name="3619"></a>3619</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3620"></a>3620</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="3621"></a>3621</td><td></td><td></td><td></td><td></td><td class="s">## A few filters and filter constructors</td></tr>
+<tr><td class="h"><a name="3622"></a>3622</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="3623"></a>3623</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3624"></a>3624</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3625"></a>3625</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3626"></a>3626</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="3627"></a>3627</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3628"></a>3628</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="3629"></a>3629</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3630"></a>3630</td><td></td><td></td><td></td><td></td><td class="s">=head1 FILTERS</td></tr>
+<tr><td class="h"><a name="3631"></a>3631</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3632"></a>3632</td><td></td><td></td><td></td><td></td><td class="s">These filters are used to modify input our output between a child</td></tr>
+<tr><td class="h"><a name="3633"></a>3633</td><td></td><td></td><td></td><td></td><td class="s">process and a scalar or subroutine endpoint.</td></tr>
+<tr><td class="h"><a name="3634"></a>3634</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3635"></a>3635</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="3636"></a>3636</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3637"></a>3637</td><td></td><td></td><td></td><td></td><td class="s">=item binary</td></tr>
+<tr><td class="h"><a name="3638"></a>3638</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3639"></a>3639</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, &quot;&gt;&quot;, binary, \$out;</td></tr>
+<tr><td class="h"><a name="3640"></a>3640</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, &quot;&gt;&quot;, binary, \$out;  ## Any TRUE value to enable</td></tr>
+<tr><td class="h"><a name="3641"></a>3641</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, &quot;&gt;&quot;, binary 0, \$out;  ## Any FALSE value to disable</td></tr>
+<tr><td class="h"><a name="3642"></a>3642</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3643"></a>3643</td><td></td><td></td><td></td><td></td><td class="s">This is a constructor for a &quot;binmode&quot; &quot;filter&quot; that tells IPC::Run to keep</td></tr>
+<tr><td class="h"><a name="3644"></a>3644</td><td></td><td></td><td></td><td></td><td class="s">the carriage returns that would ordinarily be edited out for you (binmode</td></tr>
+<tr><td class="h"><a name="3645"></a>3645</td><td></td><td></td><td></td><td></td><td class="s">is usually off).  This is not a real filter, but an option masquerading as</td></tr>
+<tr><td class="h"><a name="3646"></a>3646</td><td></td><td></td><td></td><td></td><td class="s">a filter.</td></tr>
+<tr><td class="h"><a name="3647"></a>3647</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3648"></a>3648</td><td></td><td></td><td></td><td></td><td class="s">It's not named &quot;binmode&quot; because you're likely to want to call Perl's binmode</td></tr>
+<tr><td class="h"><a name="3649"></a>3649</td><td></td><td></td><td></td><td></td><td class="s">in programs that are piping binary data around.</td></tr>
+<tr><td class="h"><a name="3650"></a>3650</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3651"></a>3651</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3652"></a>3652</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3653"></a>3653</td><td></td><td></td><td></td><td></td><td class="s">sub binary(;$) {</td></tr>
+<tr><td class="h"><a name="3654"></a>3654</td><td></td><td></td><td></td><td></td><td class="s">   my $enable = @_ ? shift : 1;</td></tr>
+<tr><td class="h"><a name="3655"></a>3655</td><td></td><td></td><td></td><td></td><td class="s">   return bless sub { $enable }, &quot;IPC::Run::binmode_pseudo_filter&quot;;</td></tr>
+<tr><td class="h"><a name="3656"></a>3656</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3657"></a>3657</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3658"></a>3658</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3659"></a>3659</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3660"></a>3660</td><td></td><td></td><td></td><td></td><td class="s">=item new_chunker</td></tr>
+<tr><td class="h"><a name="3661"></a>3661</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3662"></a>3662</td><td></td><td></td><td></td><td></td><td class="s">This breaks a stream of data in to chunks, based on an optional</td></tr>
+<tr><td class="h"><a name="3663"></a>3663</td><td></td><td></td><td></td><td></td><td class="s">scalar or regular expression parameter.  The default is the Perl</td></tr>
+<tr><td class="h"><a name="3664"></a>3664</td><td></td><td></td><td></td><td></td><td class="s">input record separator in $/, which is a newline be default.</td></tr>
+<tr><td class="h"><a name="3665"></a>3665</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3666"></a>3666</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, '&gt;', new_chunker, \&amp;lines_handler;</td></tr>
+<tr><td class="h"><a name="3667"></a>3667</td><td></td><td></td><td></td><td></td><td class="s">   run \@cmd, '&gt;', new_chunker( &quot;\r\n&quot; ), \&amp;lines_handler;</td></tr>
+<tr><td class="h"><a name="3668"></a>3668</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3669"></a>3669</td><td></td><td></td><td></td><td></td><td class="s">Because this uses $/ by default, you should always pass in a parameter</td></tr>
+<tr><td class="h"><a name="3670"></a>3670</td><td></td><td></td><td></td><td></td><td class="s">if you are worried about other code (modules, etc) modifying $/.</td></tr>
+<tr><td class="h"><a name="3671"></a>3671</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3672"></a>3672</td><td></td><td></td><td></td><td></td><td class="s">If this filter is last in a filter chain that dumps in to a scalar,</td></tr>
+<tr><td class="h"><a name="3673"></a>3673</td><td></td><td></td><td></td><td></td><td class="s">the scalar must be set to '' before a new chunk will be written to it.</td></tr>
+<tr><td class="h"><a name="3674"></a>3674</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3675"></a>3675</td><td></td><td></td><td></td><td></td><td class="s">As an example of how a filter like this can be written, here's a</td></tr>
+<tr><td class="h"><a name="3676"></a>3676</td><td></td><td></td><td></td><td></td><td class="s">chunker that splits on newlines:</td></tr>
+<tr><td class="h"><a name="3677"></a>3677</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3678"></a>3678</td><td></td><td></td><td></td><td></td><td class="s">   sub line_splitter {</td></tr>
+<tr><td class="h"><a name="3679"></a>3679</td><td></td><td></td><td></td><td></td><td class="s">      my ( $in_ref, $out_ref ) = @_;</td></tr>
+<tr><td class="h"><a name="3680"></a>3680</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3681"></a>3681</td><td></td><td></td><td></td><td></td><td class="s">      return 0 if length $$out_ref;</td></tr>
+<tr><td class="h"><a name="3682"></a>3682</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3683"></a>3683</td><td></td><td></td><td></td><td></td><td class="s">      return input_avail &amp;&amp; do {</td></tr>
+<tr><td class="h"><a name="3684"></a>3684</td><td></td><td></td><td></td><td></td><td class="s">         while (1) {</td></tr>
+<tr><td class="h"><a name="3685"></a>3685</td><td></td><td></td><td></td><td></td><td class="s">            if ( $$in_ref =~ s/\A(.*?\n)// ) {</td></tr>
+<tr><td class="h"><a name="3686"></a>3686</td><td></td><td></td><td></td><td></td><td class="s">               $$out_ref .= $1;</td></tr>
+<tr><td class="h"><a name="3687"></a>3687</td><td></td><td></td><td></td><td></td><td class="s">               return 1;</td></tr>
+<tr><td class="h"><a name="3688"></a>3688</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="3689"></a>3689</td><td></td><td></td><td></td><td></td><td class="s">            my $hmm = get_more_input;</td></tr>
+<tr><td class="h"><a name="3690"></a>3690</td><td></td><td></td><td></td><td></td><td class="s">            unless ( defined $hmm ) {</td></tr>
+<tr><td class="h"><a name="3691"></a>3691</td><td></td><td></td><td></td><td></td><td class="s">               $$out_ref = $$in_ref;</td></tr>
+<tr><td class="h"><a name="3692"></a>3692</td><td></td><td></td><td></td><td></td><td class="s">               $$in_ref = '';</td></tr>
+<tr><td class="h"><a name="3693"></a>3693</td><td></td><td></td><td></td><td></td><td class="s">               return length $$out_ref ? 1 : 0;</td></tr>
+<tr><td class="h"><a name="3694"></a>3694</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="3695"></a>3695</td><td></td><td></td><td></td><td></td><td class="s">            return 0 if $hmm eq 0;</td></tr>
+<tr><td class="h"><a name="3696"></a>3696</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3697"></a>3697</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3698"></a>3698</td><td></td><td></td><td></td><td></td><td class="s">   };</td></tr>
+<tr><td class="h"><a name="3699"></a>3699</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3700"></a>3700</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3701"></a>3701</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3702"></a>3702</td><td></td><td></td><td></td><td></td><td class="s">sub new_chunker(;$) {</td></tr>
+<tr><td class="h"><a name="3703"></a>3703</td><td></td><td></td><td></td><td></td><td class="s">   my ( $re ) = @_;</td></tr>
+<tr><td class="h"><a name="3704"></a>3704</td><td></td><td></td><td></td><td></td><td class="s">   $re = $/ if _empty $re;</td></tr>
+<tr><td class="h"><a name="3705"></a>3705</td><td></td><td></td><td></td><td></td><td class="s">   $re = quotemeta( $re ) unless ref $re eq 'Regexp';</td></tr>
+<tr><td class="h"><a name="3706"></a>3706</td><td></td><td></td><td></td><td></td><td class="s">   $re = qr/\A(.*?$re)/s;</td></tr>
+<tr><td class="h"><a name="3707"></a>3707</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3708"></a>3708</td><td></td><td></td><td></td><td></td><td class="s">   return sub {</td></tr>
+<tr><td class="h"><a name="3709"></a>3709</td><td></td><td></td><td></td><td></td><td class="s">      my ( $in_ref, $out_ref ) = @_;</td></tr>
+<tr><td class="h"><a name="3710"></a>3710</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3711"></a>3711</td><td></td><td></td><td></td><td></td><td class="s">      return 0 if length $$out_ref;</td></tr>
+<tr><td class="h"><a name="3712"></a>3712</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3713"></a>3713</td><td></td><td></td><td></td><td></td><td class="s">      return input_avail &amp;&amp; do {</td></tr>
+<tr><td class="h"><a name="3714"></a>3714</td><td></td><td></td><td></td><td></td><td class="s">         while (1) {</td></tr>
+<tr><td class="h"><a name="3715"></a>3715</td><td></td><td></td><td></td><td></td><td class="s">            if ( $$in_ref =~ s/$re// ) {</td></tr>
+<tr><td class="h"><a name="3716"></a>3716</td><td></td><td></td><td></td><td></td><td class="s">               $$out_ref .= $1;</td></tr>
+<tr><td class="h"><a name="3717"></a>3717</td><td></td><td></td><td></td><td></td><td class="s">               return 1;</td></tr>
+<tr><td class="h"><a name="3718"></a>3718</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="3719"></a>3719</td><td></td><td></td><td></td><td></td><td class="s">            my $hmm = get_more_input;</td></tr>
+<tr><td class="h"><a name="3720"></a>3720</td><td></td><td></td><td></td><td></td><td class="s">            unless ( defined $hmm ) {</td></tr>
+<tr><td class="h"><a name="3721"></a>3721</td><td></td><td></td><td></td><td></td><td class="s">               $$out_ref = $$in_ref;</td></tr>
+<tr><td class="h"><a name="3722"></a>3722</td><td></td><td></td><td></td><td></td><td class="s">               $$in_ref = '';</td></tr>
+<tr><td class="h"><a name="3723"></a>3723</td><td></td><td></td><td></td><td></td><td class="s">               return length $$out_ref ? 1 : 0;</td></tr>
+<tr><td class="h"><a name="3724"></a>3724</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="3725"></a>3725</td><td></td><td></td><td></td><td></td><td class="s">            return 0 if $hmm eq 0;</td></tr>
+<tr><td class="h"><a name="3726"></a>3726</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="3727"></a>3727</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3728"></a>3728</td><td></td><td></td><td></td><td></td><td class="s">   };</td></tr>
+<tr><td class="h"><a name="3729"></a>3729</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3730"></a>3730</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3731"></a>3731</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3732"></a>3732</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3733"></a>3733</td><td></td><td></td><td></td><td></td><td class="s">=item new_appender</td></tr>
+<tr><td class="h"><a name="3734"></a>3734</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3735"></a>3735</td><td></td><td></td><td></td><td></td><td class="s">This appends a fixed string to each chunk of data read from the source</td></tr>
+<tr><td class="h"><a name="3736"></a>3736</td><td></td><td></td><td></td><td></td><td class="s">scalar or sub.  This might be useful if you're writing commands to a</td></tr>
+<tr><td class="h"><a name="3737"></a>3737</td><td></td><td></td><td></td><td></td><td class="s">child process that always must end in a fixed string, like &quot;\n&quot;:</td></tr>
+<tr><td class="h"><a name="3738"></a>3738</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3739"></a>3739</td><td></td><td></td><td></td><td></td><td class="s">   run( \@cmd,</td></tr>
+<tr><td class="h"><a name="3740"></a>3740</td><td></td><td></td><td></td><td></td><td class="s">      '&lt;', new_appender( &quot;\n&quot; ), \&amp;commands,</td></tr>
+<tr><td class="h"><a name="3741"></a>3741</td><td></td><td></td><td></td><td></td><td class="s">   );</td></tr>
+<tr><td class="h"><a name="3742"></a>3742</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3743"></a>3743</td><td></td><td></td><td></td><td></td><td class="s">Here's a typical filter sub that might be created by new_appender():</td></tr>
+<tr><td class="h"><a name="3744"></a>3744</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3745"></a>3745</td><td></td><td></td><td></td><td></td><td class="s">   sub newline_appender {</td></tr>
+<tr><td class="h"><a name="3746"></a>3746</td><td></td><td></td><td></td><td></td><td class="s">      my ( $in_ref, $out_ref ) = @_;</td></tr>
+<tr><td class="h"><a name="3747"></a>3747</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3748"></a>3748</td><td></td><td></td><td></td><td></td><td class="s">      return input_avail &amp;&amp; do {</td></tr>
+<tr><td class="h"><a name="3749"></a>3749</td><td></td><td></td><td></td><td></td><td class="s">         $$out_ref = join( '', $$out_ref, $$in_ref, &quot;\n&quot; );</td></tr>
+<tr><td class="h"><a name="3750"></a>3750</td><td></td><td></td><td></td><td></td><td class="s">         $$in_ref = '';</td></tr>
+<tr><td class="h"><a name="3751"></a>3751</td><td></td><td></td><td></td><td></td><td class="s">         1;</td></tr>
+<tr><td class="h"><a name="3752"></a>3752</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3753"></a>3753</td><td></td><td></td><td></td><td></td><td class="s">   };</td></tr>
+<tr><td class="h"><a name="3754"></a>3754</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3755"></a>3755</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3756"></a>3756</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3757"></a>3757</td><td></td><td></td><td></td><td></td><td class="s">sub new_appender($) {</td></tr>
+<tr><td class="h"><a name="3758"></a>3758</td><td></td><td></td><td></td><td></td><td class="s">   my ( $suffix ) = @_;</td></tr>
+<tr><td class="h"><a name="3759"></a>3759</td><td></td><td></td><td></td><td></td><td class="s">   croak &quot;\$suffix undefined&quot; unless defined $suffix;</td></tr>
+<tr><td class="h"><a name="3760"></a>3760</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3761"></a>3761</td><td></td><td></td><td></td><td></td><td class="s">   return sub {</td></tr>
+<tr><td class="h"><a name="3762"></a>3762</td><td></td><td></td><td></td><td></td><td class="s">      my ( $in_ref, $out_ref ) = @_;</td></tr>
+<tr><td class="h"><a name="3763"></a>3763</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3764"></a>3764</td><td></td><td></td><td></td><td></td><td class="s">      return input_avail &amp;&amp; do {</td></tr>
+<tr><td class="h"><a name="3765"></a>3765</td><td></td><td></td><td></td><td></td><td class="s">         $$out_ref = join( '', $$out_ref, $$in_ref, $suffix );</td></tr>
+<tr><td class="h"><a name="3766"></a>3766</td><td></td><td></td><td></td><td></td><td class="s">         $$in_ref = '';</td></tr>
+<tr><td class="h"><a name="3767"></a>3767</td><td></td><td></td><td></td><td></td><td class="s">         1;</td></tr>
+<tr><td class="h"><a name="3768"></a>3768</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3769"></a>3769</td><td></td><td></td><td></td><td></td><td class="s">   };</td></tr>
+<tr><td class="h"><a name="3770"></a>3770</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3771"></a>3771</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3772"></a>3772</td><td></td><td></td><td></td><td></td><td class="s">=item new_string_source</td></tr>
+<tr><td class="h"><a name="3773"></a>3773</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3774"></a>3774</td><td></td><td></td><td></td><td></td><td class="s">TODO: Needs confirmation. Was previously undocumented. in this module.</td></tr>
+<tr><td class="h"><a name="3775"></a>3775</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3776"></a>3776</td><td></td><td></td><td></td><td></td><td class="s">This is a filter which is exportable. Returns a sub which appends the data passed in to the output buffer and returns 1 if data was appended. 0 if it was an empty string and undef if no data was passed. </td></tr>
+<tr><td class="h"><a name="3777"></a>3777</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3778"></a>3778</td><td></td><td></td><td></td><td></td><td class="s">NOTE: Any additional variables passed to new_string_source will be passed to the sub every time it's called and appended to the output. </td></tr>
+<tr><td class="h"><a name="3779"></a>3779</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3780"></a>3780</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3781"></a>3781</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3782"></a>3782</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3783"></a>3783</td><td></td><td></td><td></td><td></td><td class="s">sub new_string_source {</td></tr>
+<tr><td class="h"><a name="3784"></a>3784</td><td></td><td></td><td></td><td></td><td class="s">   my $ref;</td></tr>
+<tr><td class="h"><a name="3785"></a>3785</td><td></td><td></td><td></td><td></td><td class="s">   if ( @_ &gt; 1 ) {</td></tr>
+<tr><td class="h"><a name="3786"></a>3786</td><td></td><td></td><td></td><td></td><td class="s">      $ref = [ @_ ],</td></tr>
+<tr><td class="h"><a name="3787"></a>3787</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="3788"></a>3788</td><td></td><td></td><td></td><td></td><td class="s">   else {</td></tr>
+<tr><td class="h"><a name="3789"></a>3789</td><td></td><td></td><td></td><td></td><td class="s">      $ref = shift;</td></tr>
+<tr><td class="h"><a name="3790"></a>3790</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="3791"></a>3791</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3792"></a>3792</td><td></td><td></td><td></td><td></td><td class="s">   return ref $ref eq 'SCALAR'</td></tr>
+<tr><td class="h"><a name="3793"></a>3793</td><td></td><td></td><td></td><td></td><td class="s">      ? sub {</td></tr>
+<tr><td class="h"><a name="3794"></a>3794</td><td></td><td></td><td></td><td></td><td class="s">         my ( $in_ref, $out_ref ) = @_;</td></tr>
+<tr><td class="h"><a name="3795"></a>3795</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3796"></a>3796</td><td></td><td></td><td></td><td></td><td class="s">         return defined $$ref</td></tr>
+<tr><td class="h"><a name="3797"></a>3797</td><td></td><td></td><td></td><td></td><td class="s">            ? do {</td></tr>
+<tr><td class="h"><a name="3798"></a>3798</td><td></td><td></td><td></td><td></td><td class="s">               $$out_ref .= $$ref;</td></tr>
+<tr><td class="h"><a name="3799"></a>3799</td><td></td><td></td><td></td><td></td><td class="s">               my $r = length $$ref ? 1 : 0;</td></tr>
+<tr><td class="h"><a name="3800"></a>3800</td><td></td><td></td><td></td><td></td><td class="s">               $$ref = undef;</td></tr>
+<tr><td class="h"><a name="3801"></a>3801</td><td></td><td></td><td></td><td></td><td class="s">               $r;</td></tr>
+<tr><td class="h"><a name="3802"></a>3802</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="3803"></a>3803</td><td></td><td></td><td></td><td></td><td class="s">            : undef</td></tr>
+<tr><td class="h"><a name="3804"></a>3804</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3805"></a>3805</td><td></td><td></td><td></td><td></td><td class="s">      : sub {</td></tr>
+<tr><td class="h"><a name="3806"></a>3806</td><td></td><td></td><td></td><td></td><td class="s">         my ( $in_ref, $out_ref ) = @_;</td></tr>
+<tr><td class="h"><a name="3807"></a>3807</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3808"></a>3808</td><td></td><td></td><td></td><td></td><td class="s">         return @$ref</td></tr>
+<tr><td class="h"><a name="3809"></a>3809</td><td></td><td></td><td></td><td></td><td class="s">            ? do {</td></tr>
+<tr><td class="h"><a name="3810"></a>3810</td><td></td><td></td><td></td><td></td><td class="s">               my $s = shift @$ref;</td></tr>
+<tr><td class="h"><a name="3811"></a>3811</td><td></td><td></td><td></td><td></td><td class="s">               $$out_ref .= $s;</td></tr>
+<tr><td class="h"><a name="3812"></a>3812</td><td></td><td></td><td></td><td></td><td class="s">               length $s ? 1 : 0;</td></tr>
+<tr><td class="h"><a name="3813"></a>3813</td><td></td><td></td><td></td><td></td><td class="s">            }</td></tr>
+<tr><td class="h"><a name="3814"></a>3814</td><td></td><td></td><td></td><td></td><td class="s">            : undef;</td></tr>
+<tr><td class="h"><a name="3815"></a>3815</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3816"></a>3816</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3817"></a>3817</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3818"></a>3818</td><td></td><td></td><td></td><td></td><td class="s">=item new_string_sink</td></tr>
+<tr><td class="h"><a name="3819"></a>3819</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3820"></a>3820</td><td></td><td></td><td></td><td></td><td class="s">TODO: Needs confirmation. Was previously undocumented.</td></tr>
+<tr><td class="h"><a name="3821"></a>3821</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3822"></a>3822</td><td></td><td></td><td></td><td></td><td class="s">This is a filter which is exportable. Returns a sub which pops the data out of the input stream and pushes it onto the string.</td></tr>
+<tr><td class="h"><a name="3823"></a>3823</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3824"></a>3824</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3825"></a>3825</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3826"></a>3826</td><td></td><td></td><td></td><td></td><td class="s">sub new_string_sink {</td></tr>
+<tr><td class="h"><a name="3827"></a>3827</td><td></td><td></td><td></td><td></td><td class="s">   my ( $string_ref ) = @_;</td></tr>
+<tr><td class="h"><a name="3828"></a>3828</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3829"></a>3829</td><td></td><td></td><td></td><td></td><td class="s">   return sub {</td></tr>
+<tr><td class="h"><a name="3830"></a>3830</td><td></td><td></td><td></td><td></td><td class="s">      my ( $in_ref, $out_ref ) = @_;</td></tr>
+<tr><td class="h"><a name="3831"></a>3831</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3832"></a>3832</td><td></td><td></td><td></td><td></td><td class="s">      return input_avail &amp;&amp; do {</td></tr>
+<tr><td class="h"><a name="3833"></a>3833</td><td></td><td></td><td></td><td></td><td class="s">         $$string_ref .= $$in_ref;</td></tr>
+<tr><td class="h"><a name="3834"></a>3834</td><td></td><td></td><td></td><td></td><td class="s">         $$in_ref = '';</td></tr>
+<tr><td class="h"><a name="3835"></a>3835</td><td></td><td></td><td></td><td></td><td class="s">         1;</td></tr>
+<tr><td class="h"><a name="3836"></a>3836</td><td></td><td></td><td></td><td></td><td class="s">      }</td></tr>
+<tr><td class="h"><a name="3837"></a>3837</td><td></td><td></td><td></td><td></td><td class="s">   };</td></tr>
+<tr><td class="h"><a name="3838"></a>3838</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3839"></a>3839</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3840"></a>3840</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3841"></a>3841</td><td></td><td></td><td></td><td></td><td class="s">#=item timeout</td></tr>
+<tr><td class="h"><a name="3842"></a>3842</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3843"></a>3843</td><td></td><td></td><td></td><td></td><td class="s">#This function defines a time interval, starting from when start() is</td></tr>
+<tr><td class="h"><a name="3844"></a>3844</td><td></td><td></td><td></td><td></td><td class="s">#called, or when timeout() is called.  If all processes have not finished</td></tr>
+<tr><td class="h"><a name="3845"></a>3845</td><td></td><td></td><td></td><td></td><td class="s">#by the end of the timeout period, then a &quot;process timed out&quot; exception</td></tr>
+<tr><td class="h"><a name="3846"></a>3846</td><td></td><td></td><td></td><td></td><td class="s">#is thrown.</td></tr>
+<tr><td class="h"><a name="3847"></a>3847</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3848"></a>3848</td><td></td><td></td><td></td><td></td><td class="s">#The time interval may be passed in seconds, or as an end time in</td></tr>
+<tr><td class="h"><a name="3849"></a>3849</td><td></td><td></td><td></td><td></td><td class="s">#&quot;HH:MM:SS&quot; format (any non-digit other than '.' may be used as</td></tr>
+<tr><td class="h"><a name="3850"></a>3850</td><td></td><td></td><td></td><td></td><td class="s">#spacing and puctuation).  This is probably best shown by example:</td></tr>
+<tr><td class="h"><a name="3851"></a>3851</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3852"></a>3852</td><td></td><td></td><td></td><td></td><td class="s">#   $h-&gt;timeout( $val );</td></tr>
+<tr><td class="h"><a name="3853"></a>3853</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3854"></a>3854</td><td></td><td></td><td></td><td></td><td class="s">#   $val                     Effect</td></tr>
+<tr><td class="h"><a name="3855"></a>3855</td><td></td><td></td><td></td><td></td><td class="s">#   ======================== =====================================</td></tr>
+<tr><td class="h"><a name="3856"></a>3856</td><td></td><td></td><td></td><td></td><td class="s">#   undef                    Timeout timer disabled</td></tr>
+<tr><td class="h"><a name="3857"></a>3857</td><td></td><td></td><td></td><td></td><td class="s">#   ''                       Almost immediate timeout</td></tr>
+<tr><td class="h"><a name="3858"></a>3858</td><td></td><td></td><td></td><td></td><td class="s">#   0                        Almost immediate timeout</td></tr>
+<tr><td class="h"><a name="3859"></a>3859</td><td></td><td></td><td></td><td></td><td class="s">#   0.000001                 timeout &gt; 0.0000001 seconds</td></tr>
+<tr><td class="h"><a name="3860"></a>3860</td><td></td><td></td><td></td><td></td><td class="s">#   30                       timeout &gt; 30 seconds</td></tr>
+<tr><td class="h"><a name="3861"></a>3861</td><td></td><td></td><td></td><td></td><td class="s">#   30.0000001               timeout &gt; 30 seconds</td></tr>
+<tr><td class="h"><a name="3862"></a>3862</td><td></td><td></td><td></td><td></td><td class="s">#   10:30                    timeout &gt; 10 minutes, 30 seconds</td></tr>
+<tr><td class="h"><a name="3863"></a>3863</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3864"></a>3864</td><td></td><td></td><td></td><td></td><td class="s">#Timeouts are currently evaluated with a 1 second resolution, though</td></tr>
+<tr><td class="h"><a name="3865"></a>3865</td><td></td><td></td><td></td><td></td><td class="s">#this may change in the future.  This means that setting</td></tr>
+<tr><td class="h"><a name="3866"></a>3866</td><td></td><td></td><td></td><td></td><td class="s">#timeout($h,1) will cause a pokey child to be aborted sometime after</td></tr>
+<tr><td class="h"><a name="3867"></a>3867</td><td></td><td></td><td></td><td></td><td class="s">#one second has elapsed and typically before two seconds have elapsed.</td></tr>
+<tr><td class="h"><a name="3868"></a>3868</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3869"></a>3869</td><td></td><td></td><td></td><td></td><td class="s">#This sub does not check whether or not the timeout has expired already.</td></tr>
+<tr><td class="h"><a name="3870"></a>3870</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3871"></a>3871</td><td></td><td></td><td></td><td></td><td class="s">#Returns the number of seconds set as the timeout (this does not change</td></tr>
+<tr><td class="h"><a name="3872"></a>3872</td><td></td><td></td><td></td><td></td><td class="s">#as time passes, unless you call timeout( val ) again).</td></tr>
+<tr><td class="h"><a name="3873"></a>3873</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3874"></a>3874</td><td></td><td></td><td></td><td></td><td class="s">#The timeout does not include the time needed to fork() or spawn()</td></tr>
+<tr><td class="h"><a name="3875"></a>3875</td><td></td><td></td><td></td><td></td><td class="s">#the child processes, though some setup time for the child processes can</td></tr>
+<tr><td class="h"><a name="3876"></a>3876</td><td></td><td></td><td></td><td></td><td class="s">#included.  It also does not include the length of time it takes for</td></tr>
+<tr><td class="h"><a name="3877"></a>3877</td><td></td><td></td><td></td><td></td><td class="s">#the children to exit after they've closed all their pipes to the</td></tr>
+<tr><td class="h"><a name="3878"></a>3878</td><td></td><td></td><td></td><td></td><td class="s">#parent process.</td></tr>
+<tr><td class="h"><a name="3879"></a>3879</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3880"></a>3880</td><td></td><td></td><td></td><td></td><td class="s">#=cut</td></tr>
+<tr><td class="h"><a name="3881"></a>3881</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3882"></a>3882</td><td></td><td></td><td></td><td></td><td class="s">#sub timeout {</td></tr>
+<tr><td class="h"><a name="3883"></a>3883</td><td></td><td></td><td></td><td></td><td class="s">#   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3884"></a>3884</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3885"></a>3885</td><td></td><td></td><td></td><td></td><td class="s">#   if ( @_ ) {</td></tr>
+<tr><td class="h"><a name="3886"></a>3886</td><td></td><td></td><td></td><td></td><td class="s">#      ( $self-&gt;{TIMEOUT} ) = @_;</td></tr>
+<tr><td class="h"><a name="3887"></a>3887</td><td></td><td></td><td></td><td></td><td class="s">#      $self-&gt;{TIMEOUT_END} = undef;</td></tr>
+<tr><td class="h"><a name="3888"></a>3888</td><td></td><td></td><td></td><td></td><td class="s">#      if ( defined $self-&gt;{TIMEOUT} ) {</td></tr>
+<tr><td class="h"><a name="3889"></a>3889</td><td></td><td></td><td></td><td></td><td class="s">#         if ( $self-&gt;{TIMEOUT} =~ /[^\d.]/ ) {</td></tr>
+<tr><td class="h"><a name="3890"></a>3890</td><td></td><td></td><td></td><td></td><td class="s">#            my @f = split( /[^\d\.]+/i, $self-&gt;{TIMEOUT} );</td></tr>
+<tr><td class="h"><a name="3891"></a>3891</td><td></td><td></td><td></td><td></td><td class="s">#            unshift @f, 0 while @f &lt; 3;</td></tr>
+<tr><td class="h"><a name="3892"></a>3892</td><td></td><td></td><td></td><td></td><td class="s">#            $self-&gt;{TIMEOUT} = (($f[0]*60)+$f[1])*60+$f[2];</td></tr>
+<tr><td class="h"><a name="3893"></a>3893</td><td></td><td></td><td></td><td></td><td class="s">#         }</td></tr>
+<tr><td class="h"><a name="3894"></a>3894</td><td></td><td></td><td></td><td></td><td class="s">#         elsif ( $self-&gt;{TIMEOUT} =~ /^(\d*)(?:\.(\d*))/ ) {</td></tr>
+<tr><td class="h"><a name="3895"></a>3895</td><td></td><td></td><td></td><td></td><td class="s">#            $self-&gt;{TIMEOUT} = $1 + 1;</td></tr>
+<tr><td class="h"><a name="3896"></a>3896</td><td></td><td></td><td></td><td></td><td class="s">#         }</td></tr>
+<tr><td class="h"><a name="3897"></a>3897</td><td></td><td></td><td></td><td></td><td class="s">#         $self-&gt;_calc_timeout_end if $self-&gt;{STATE} &gt;= _started;</td></tr>
+<tr><td class="h"><a name="3898"></a>3898</td><td></td><td></td><td></td><td></td><td class="s">#      }</td></tr>
+<tr><td class="h"><a name="3899"></a>3899</td><td></td><td></td><td></td><td></td><td class="s">#   }</td></tr>
+<tr><td class="h"><a name="3900"></a>3900</td><td></td><td></td><td></td><td></td><td class="s">#   return $self-&gt;{TIMEOUT};</td></tr>
+<tr><td class="h"><a name="3901"></a>3901</td><td></td><td></td><td></td><td></td><td class="s">#}</td></tr>
+<tr><td class="h"><a name="3902"></a>3902</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3903"></a>3903</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3904"></a>3904</td><td></td><td></td><td></td><td></td><td class="s">#sub _calc_timeout_end {</td></tr>
+<tr><td class="h"><a name="3905"></a>3905</td><td></td><td></td><td></td><td></td><td class="s">#   my IPC::Run $self = shift;</td></tr>
+<tr><td class="h"><a name="3906"></a>3906</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3907"></a>3907</td><td></td><td></td><td></td><td></td><td class="s">#   $self-&gt;{TIMEOUT_END} = defined $self-&gt;{TIMEOUT} </td></tr>
+<tr><td class="h"><a name="3908"></a>3908</td><td></td><td></td><td></td><td></td><td class="s">#      ? time + $self-&gt;{TIMEOUT}</td></tr>
+<tr><td class="h"><a name="3909"></a>3909</td><td></td><td></td><td></td><td></td><td class="s">#      : undef;</td></tr>
+<tr><td class="h"><a name="3910"></a>3910</td><td></td><td></td><td></td><td></td><td class="s">#</td></tr>
+<tr><td class="h"><a name="3911"></a>3911</td><td></td><td></td><td></td><td></td><td class="s">#   ## We add a second because we might be at the very end of the current</td></tr>
+<tr><td class="h"><a name="3912"></a>3912</td><td></td><td></td><td></td><td></td><td class="s">#   ## second, and we want to guarantee that we don't have a timeout even</td></tr>
+<tr><td class="h"><a name="3913"></a>3913</td><td></td><td></td><td></td><td></td><td class="s">#   ## one second less then the timeout period.</td></tr>
+<tr><td class="h"><a name="3914"></a>3914</td><td></td><td></td><td></td><td></td><td class="s">#   ++$self-&gt;{TIMEOUT_END} if $self-&gt;{TIMEOUT};</td></tr>
+<tr><td class="h"><a name="3915"></a>3915</td><td></td><td></td><td></td><td></td><td class="s">#}</td></tr>
+<tr><td class="h"><a name="3916"></a>3916</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3917"></a>3917</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3918"></a>3918</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3919"></a>3919</td><td></td><td></td><td></td><td></td><td class="s">=item io</td></tr>
+<tr><td class="h"><a name="3920"></a>3920</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3921"></a>3921</td><td></td><td></td><td></td><td></td><td class="s">Takes a filename or filehandle, a redirection operator, optional filters,</td></tr>
+<tr><td class="h"><a name="3922"></a>3922</td><td></td><td></td><td></td><td></td><td class="s">and a source or destination (depends on the redirection operator).  Returns</td></tr>
+<tr><td class="h"><a name="3923"></a>3923</td><td></td><td></td><td></td><td></td><td class="s">an IPC::Run::IO object suitable for harness()ing (including via start()</td></tr>
+<tr><td class="h"><a name="3924"></a>3924</td><td></td><td></td><td></td><td></td><td class="s">or run()).</td></tr>
+<tr><td class="h"><a name="3925"></a>3925</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3926"></a>3926</td><td></td><td></td><td></td><td></td><td class="s">This is shorthand for </td></tr>
+<tr><td class="h"><a name="3927"></a>3927</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3928"></a>3928</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3929"></a>3929</td><td></td><td></td><td></td><td></td><td class="s">   require IPC::Run::IO;</td></tr>
+<tr><td class="h"><a name="3930"></a>3930</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3931"></a>3931</td><td></td><td></td><td></td><td></td><td class="s">      ... IPC::Run::IO-&gt;new(...) ...</td></tr>
+<tr><td class="h"><a name="3932"></a>3932</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3933"></a>3933</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3934"></a>3934</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3935"></a>3935</td><td></td><td></td><td></td><td></td><td class="s">sub io {</td></tr>
+<tr><td class="h"><a name="3936"></a>3936</td><td></td><td></td><td></td><td></td><td class="s">   require IPC::Run::IO;</td></tr>
+<tr><td class="h"><a name="3937"></a>3937</td><td></td><td></td><td></td><td></td><td class="s">   IPC::Run::IO-&gt;new( @_ );</td></tr>
+<tr><td class="h"><a name="3938"></a>3938</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="3939"></a>3939</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3940"></a>3940</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3941"></a>3941</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3942"></a>3942</td><td></td><td></td><td></td><td></td><td class="s">=item timer</td></tr>
+<tr><td class="h"><a name="3943"></a>3943</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3944"></a>3944</td><td></td><td></td><td></td><td></td><td class="s">   $h = start( \@cmd, \$in, \$out, $t = timer( 5 ) );</td></tr>
+<tr><td class="h"><a name="3945"></a>3945</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3946"></a>3946</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until $out =~ /expected stuff/ || $t-&gt;is_expired;</td></tr>
+<tr><td class="h"><a name="3947"></a>3947</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3948"></a>3948</td><td></td><td></td><td></td><td></td><td class="s">Instantiates a non-fatal timer.  pump() returns once each time a timer</td></tr>
+<tr><td class="h"><a name="3949"></a>3949</td><td></td><td></td><td></td><td></td><td class="s">expires.  Has no direct effect on run(), but you can pass a subroutine</td></tr>
+<tr><td class="h"><a name="3950"></a>3950</td><td></td><td></td><td></td><td></td><td class="s">to fire when the timer expires. </td></tr>
+<tr><td class="h"><a name="3951"></a>3951</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3952"></a>3952</td><td></td><td></td><td></td><td></td><td class="s">See L&lt;/timeout&gt; for building timers that throw exceptions on</td></tr>
+<tr><td class="h"><a name="3953"></a>3953</td><td></td><td></td><td></td><td></td><td class="s">expiration.</td></tr>
+<tr><td class="h"><a name="3954"></a>3954</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3955"></a>3955</td><td></td><td></td><td></td><td></td><td class="s">See L&lt;IPC::Run::Timer/timer&gt; for details.</td></tr>
+<tr><td class="h"><a name="3956"></a>3956</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3957"></a>3957</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="3958"></a>3958</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3959"></a>3959</td><td></td><td></td><td></td><td></td><td class="s"># Doing the prototype suppresses 'only used once' on older perls.</td></tr>
+<tr><td class="h"><a name="3960"></a>3960</td><td></td><td></td><td></td><td></td><td class="s">sub timer;</td></tr>
+<tr><td class="h"><a name="3961"></a>3961</td><td class="c3">1</td><td class="c3"><span title="Avg 3&micro;s">3&micro;s</span></td><td></td><td></td><td class="s">*timer = \&amp;IPC::Run::Timer::timer;</td></tr>
+<tr><td class="h"><a name="3962"></a>3962</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3963"></a>3963</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="3964"></a>3964</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3965"></a>3965</td><td></td><td></td><td></td><td></td><td class="s">=item timeout</td></tr>
+<tr><td class="h"><a name="3966"></a>3966</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3967"></a>3967</td><td></td><td></td><td></td><td></td><td class="s">   $h = start( \@cmd, \$in, \$out, $t = timeout( 5 ) );</td></tr>
+<tr><td class="h"><a name="3968"></a>3968</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3969"></a>3969</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until $out =~ /expected stuff/;</td></tr>
+<tr><td class="h"><a name="3970"></a>3970</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3971"></a>3971</td><td></td><td></td><td></td><td></td><td class="s">Instantiates a timer that throws an exception when it expires.</td></tr>
+<tr><td class="h"><a name="3972"></a>3972</td><td></td><td></td><td></td><td></td><td class="s">If you don't provide an exception, a default exception that matches</td></tr>
+<tr><td class="h"><a name="3973"></a>3973</td><td></td><td></td><td></td><td></td><td class="s">/^IPC::Run: .*timed out/ is thrown by default.  You can pass in your own</td></tr>
+<tr><td class="h"><a name="3974"></a>3974</td><td></td><td></td><td></td><td></td><td class="s">exception scalar or reference:</td></tr>
+<tr><td class="h"><a name="3975"></a>3975</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3976"></a>3976</td><td></td><td></td><td></td><td></td><td class="s">   $h = start(</td></tr>
+<tr><td class="h"><a name="3977"></a>3977</td><td></td><td></td><td></td><td></td><td class="s">      \@cmd, \$in, \$out,</td></tr>
+<tr><td class="h"><a name="3978"></a>3978</td><td></td><td></td><td></td><td></td><td class="s">      $t = timeout( 5, exception =&gt; 'slowpoke' ),</td></tr>
+<tr><td class="h"><a name="3979"></a>3979</td><td></td><td></td><td></td><td></td><td class="s">   );</td></tr>
+<tr><td class="h"><a name="3980"></a>3980</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3981"></a>3981</td><td></td><td></td><td></td><td></td><td class="s">or set the name used in debugging message and in the default exception</td></tr>
+<tr><td class="h"><a name="3982"></a>3982</td><td></td><td></td><td></td><td></td><td class="s">string:</td></tr>
+<tr><td class="h"><a name="3983"></a>3983</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3984"></a>3984</td><td></td><td></td><td></td><td></td><td class="s">   $h = start(</td></tr>
+<tr><td class="h"><a name="3985"></a>3985</td><td></td><td></td><td></td><td></td><td class="s">      \@cmd, \$in, \$out,</td></tr>
+<tr><td class="h"><a name="3986"></a>3986</td><td></td><td></td><td></td><td></td><td class="s">      timeout( 50, name =&gt; 'process timer' ),</td></tr>
+<tr><td class="h"><a name="3987"></a>3987</td><td></td><td></td><td></td><td></td><td class="s">      $stall_timer = timeout( 5, name =&gt; 'stall timer' ),</td></tr>
+<tr><td class="h"><a name="3988"></a>3988</td><td></td><td></td><td></td><td></td><td class="s">   );</td></tr>
+<tr><td class="h"><a name="3989"></a>3989</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3990"></a>3990</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until $out =~ /started/;</td></tr>
+<tr><td class="h"><a name="3991"></a>3991</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3992"></a>3992</td><td></td><td></td><td></td><td></td><td class="s">   $in = 'command 1';</td></tr>
+<tr><td class="h"><a name="3993"></a>3993</td><td></td><td></td><td></td><td></td><td class="s">   $stall_timer-&gt;start;</td></tr>
+<tr><td class="h"><a name="3994"></a>3994</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until $out =~ /command 1 finished/;</td></tr>
+<tr><td class="h"><a name="3995"></a>3995</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="3996"></a>3996</td><td></td><td></td><td></td><td></td><td class="s">   $in = 'command 2';</td></tr>
+<tr><td class="h"><a name="3997"></a>3997</td><td></td><td></td><td></td><td></td><td class="s">   $stall_timer-&gt;start;</td></tr>
+<tr><td class="h"><a name="3998"></a>3998</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until $out =~ /command 2 finished/;</td></tr>
+<tr><td class="h"><a name="3999"></a>3999</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4000"></a>4000</td><td></td><td></td><td></td><td></td><td class="s">   $in = 'very slow command 3';</td></tr>
+<tr><td class="h"><a name="4001"></a>4001</td><td></td><td></td><td></td><td></td><td class="s">   $stall_timer-&gt;start( 10 );</td></tr>
+<tr><td class="h"><a name="4002"></a>4002</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until $out =~ /command 3 finished/;</td></tr>
+<tr><td class="h"><a name="4003"></a>4003</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4004"></a>4004</td><td></td><td></td><td></td><td></td><td class="s">   $stall_timer-&gt;start( 5 );</td></tr>
+<tr><td class="h"><a name="4005"></a>4005</td><td></td><td></td><td></td><td></td><td class="s">   $in = 'command 4';</td></tr>
+<tr><td class="h"><a name="4006"></a>4006</td><td></td><td></td><td></td><td></td><td class="s">   pump $h until $out =~ /command 4 finished/;</td></tr>
+<tr><td class="h"><a name="4007"></a>4007</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4008"></a>4008</td><td></td><td></td><td></td><td></td><td class="s">   $stall_timer-&gt;reset; # Prevent restarting or expirng</td></tr>
+<tr><td class="h"><a name="4009"></a>4009</td><td></td><td></td><td></td><td></td><td class="s">   finish $h;</td></tr>
+<tr><td class="h"><a name="4010"></a>4010</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4011"></a>4011</td><td></td><td></td><td></td><td></td><td class="s">See L&lt;/timer&gt; for building non-fatal timers.</td></tr>
+<tr><td class="h"><a name="4012"></a>4012</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4013"></a>4013</td><td></td><td></td><td></td><td></td><td class="s">See L&lt;IPC::Run::Timer/timer&gt; for details.</td></tr>
+<tr><td class="h"><a name="4014"></a>4014</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4015"></a>4015</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="4016"></a>4016</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4017"></a>4017</td><td></td><td></td><td></td><td></td><td class="s"># Doing the prototype suppresses 'only used once' on older perls.</td></tr>
+<tr><td class="h"><a name="4018"></a>4018</td><td></td><td></td><td></td><td></td><td class="s">sub timeout;</td></tr>
+<tr><td class="h"><a name="4019"></a>4019</td><td class="c3">1</td><td class="c3"><span title="Avg 1&micro;s">1&micro;s</span></td><td></td><td></td><td class="s">*timeout = \&amp;IPC::Run::Timer::timeout;</td></tr>
+<tr><td class="h"><a name="4020"></a>4020</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4021"></a>4021</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="4022"></a>4022</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4023"></a>4023</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="4024"></a>4024</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4025"></a>4025</td><td></td><td></td><td></td><td></td><td class="s">=head1 FILTER IMPLEMENTATION FUNCTIONS</td></tr>
+<tr><td class="h"><a name="4026"></a>4026</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4027"></a>4027</td><td></td><td></td><td></td><td></td><td class="s">These functions are for use from within filters.</td></tr>
+<tr><td class="h"><a name="4028"></a>4028</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4029"></a>4029</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="4030"></a>4030</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4031"></a>4031</td><td></td><td></td><td></td><td></td><td class="s">=item input_avail</td></tr>
+<tr><td class="h"><a name="4032"></a>4032</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4033"></a>4033</td><td></td><td></td><td></td><td></td><td class="s">Returns TRUE if input is available.  If none is available, then </td></tr>
+<tr><td class="h"><a name="4034"></a>4034</td><td></td><td></td><td></td><td></td><td class="s">&amp;get_more_input is called and its result is returned.</td></tr>
+<tr><td class="h"><a name="4035"></a>4035</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4036"></a>4036</td><td></td><td></td><td></td><td></td><td class="s">This is usually used in preference to &amp;get_more_input so that the</td></tr>
+<tr><td class="h"><a name="4037"></a>4037</td><td></td><td></td><td></td><td></td><td class="s">calling filter removes all data from the $in_ref before more data</td></tr>
+<tr><td class="h"><a name="4038"></a>4038</td><td></td><td></td><td></td><td></td><td class="s">gets read in to $in_ref.</td></tr>
+<tr><td class="h"><a name="4039"></a>4039</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4040"></a>4040</td><td></td><td></td><td></td><td></td><td class="s">C&lt;input_avail&gt; is usually used as part of a return expression:</td></tr>
+<tr><td class="h"><a name="4041"></a>4041</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4042"></a>4042</td><td></td><td></td><td></td><td></td><td class="s">   return input_avail &amp;&amp; do {</td></tr>
+<tr><td class="h"><a name="4043"></a>4043</td><td></td><td></td><td></td><td></td><td class="s">      ## process the input just gotten</td></tr>
+<tr><td class="h"><a name="4044"></a>4044</td><td></td><td></td><td></td><td></td><td class="s">      1;</td></tr>
+<tr><td class="h"><a name="4045"></a>4045</td><td></td><td></td><td></td><td></td><td class="s">   };</td></tr>
+<tr><td class="h"><a name="4046"></a>4046</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4047"></a>4047</td><td></td><td></td><td></td><td></td><td class="s">This technique allows input_avail to return the undef or 0 that a</td></tr>
+<tr><td class="h"><a name="4048"></a>4048</td><td></td><td></td><td></td><td></td><td class="s">filter normally returns when there's no input to process.  If a filter</td></tr>
+<tr><td class="h"><a name="4049"></a>4049</td><td></td><td></td><td></td><td></td><td class="s">stores intermediate values, however, it will need to react to an</td></tr>
+<tr><td class="h"><a name="4050"></a>4050</td><td></td><td></td><td></td><td></td><td class="s">undef:</td></tr>
+<tr><td class="h"><a name="4051"></a>4051</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4052"></a>4052</td><td></td><td></td><td></td><td></td><td class="s">   my $got = input_avail;</td></tr>
+<tr><td class="h"><a name="4053"></a>4053</td><td></td><td></td><td></td><td></td><td class="s">   if ( ! defined $got ) {</td></tr>
+<tr><td class="h"><a name="4054"></a>4054</td><td></td><td></td><td></td><td></td><td class="s">      ## No more input ever, flush internal buffers to $out_ref</td></tr>
+<tr><td class="h"><a name="4055"></a>4055</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="4056"></a>4056</td><td></td><td></td><td></td><td></td><td class="s">   return $got unless $got;</td></tr>
+<tr><td class="h"><a name="4057"></a>4057</td><td></td><td></td><td></td><td></td><td class="s">   ## Got some input, move as much as need be</td></tr>
+<tr><td class="h"><a name="4058"></a>4058</td><td></td><td></td><td></td><td></td><td class="s">   return 1 if $added_to_out_ref;</td></tr>
+<tr><td class="h"><a name="4059"></a>4059</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4060"></a>4060</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="4061"></a>4061</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4062"></a>4062</td><td></td><td></td><td></td><td></td><td class="s">sub input_avail() {</td></tr>
+<tr><td class="h"><a name="4063"></a>4063</td><td></td><td></td><td></td><td></td><td class="s">   confess &quot;Undefined FBUF ref for $filter_num+1&quot;</td></tr>
+<tr><td class="h"><a name="4064"></a>4064</td><td></td><td></td><td></td><td></td><td class="s">      unless defined $filter_op-&gt;{FBUFS}-&gt;[$filter_num+1];</td></tr>
+<tr><td class="h"><a name="4065"></a>4065</td><td></td><td></td><td></td><td></td><td class="s">   length ${$filter_op-&gt;{FBUFS}-&gt;[$filter_num+1]} || get_more_input;</td></tr>
+<tr><td class="h"><a name="4066"></a>4066</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="4067"></a>4067</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4068"></a>4068</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="4069"></a>4069</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4070"></a>4070</td><td></td><td></td><td></td><td></td><td class="s">=item get_more_input</td></tr>
+<tr><td class="h"><a name="4071"></a>4071</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4072"></a>4072</td><td></td><td></td><td></td><td></td><td class="s">This is used to fetch more input in to the input variable.  It returns</td></tr>
+<tr><td class="h"><a name="4073"></a>4073</td><td></td><td></td><td></td><td></td><td class="s">undef if there will never be any more input, 0 if there is none now,</td></tr>
+<tr><td class="h"><a name="4074"></a>4074</td><td></td><td></td><td></td><td></td><td class="s">but there might be in the future, and TRUE if more input was gotten.</td></tr>
+<tr><td class="h"><a name="4075"></a>4075</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4076"></a>4076</td><td></td><td></td><td></td><td></td><td class="s">C&lt;get_more_input&gt; is usually used as part of a return expression,</td></tr>
+<tr><td class="h"><a name="4077"></a>4077</td><td></td><td></td><td></td><td></td><td class="s">see L&lt;/input_avail&gt; for more information.</td></tr>
+<tr><td class="h"><a name="4078"></a>4078</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4079"></a>4079</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="h"><a name="4080"></a>4080</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4081"></a>4081</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="4082"></a>4082</td><td></td><td></td><td></td><td></td><td class="s">## Filter implementation interface</td></tr>
+<tr><td class="h"><a name="4083"></a>4083</td><td></td><td></td><td></td><td></td><td class="s">##</td></tr>
+<tr><td class="h"><a name="4084"></a>4084</td><td></td><td></td><td></td><td></td><td class="s">sub get_more_input() {</td></tr>
+<tr><td class="h"><a name="4085"></a>4085</td><td></td><td></td><td></td><td></td><td class="s">   ++$filter_num;</td></tr>
+<tr><td class="h"><a name="4086"></a>4086</td><td></td><td></td><td></td><td></td><td class="s">   my $r = eval {</td></tr>
+<tr><td class="h"><a name="4087"></a>4087</td><td></td><td></td><td></td><td></td><td class="s">      confess &quot;get_more_input() called and no more filters in chain&quot;</td></tr>
+<tr><td class="h"><a name="4088"></a>4088</td><td></td><td></td><td></td><td></td><td class="s">         unless defined $filter_op-&gt;{FILTERS}-&gt;[$filter_num];</td></tr>
+<tr><td class="h"><a name="4089"></a>4089</td><td></td><td></td><td></td><td></td><td class="s">      $filter_op-&gt;{FILTERS}-&gt;[$filter_num]-&gt;(</td></tr>
+<tr><td class="h"><a name="4090"></a>4090</td><td></td><td></td><td></td><td></td><td class="s">         $filter_op-&gt;{FBUFS}-&gt;[$filter_num+1],</td></tr>
+<tr><td class="h"><a name="4091"></a>4091</td><td></td><td></td><td></td><td></td><td class="s">         $filter_op-&gt;{FBUFS}-&gt;[$filter_num],</td></tr>
+<tr><td class="h"><a name="4092"></a>4092</td><td></td><td></td><td></td><td></td><td class="s">      ); # if defined ${$filter_op-&gt;{FBUFS}-&gt;[$filter_num+1]};</td></tr>
+<tr><td class="h"><a name="4093"></a>4093</td><td></td><td></td><td></td><td></td><td class="s">   };</td></tr>
+<tr><td class="h"><a name="4094"></a>4094</td><td></td><td></td><td></td><td></td><td class="s">   --$filter_num;</td></tr>
+<tr><td class="h"><a name="4095"></a>4095</td><td></td><td></td><td></td><td></td><td class="s">   die $@ if $@;</td></tr>
+<tr><td class="h"><a name="4096"></a>4096</td><td></td><td></td><td></td><td></td><td class="s">   return $r;</td></tr>
+<tr><td class="h"><a name="4097"></a>4097</td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
+<tr><td class="h"><a name="4098"></a>4098</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4099"></a>4099</td><td class="c3">1</td><td class="c3"><span title="Avg 9&micro;s">9&micro;s</span></td><td></td><td></td><td class="s">1;</td></tr>
+<tr><td class="h"><a name="4100"></a>4100</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4101"></a>4101</td><td></td><td></td><td></td><td></td><td class="s">=pod</td></tr>
+<tr><td class="h"><a name="4102"></a>4102</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4103"></a>4103</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="4104"></a>4104</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4105"></a>4105</td><td></td><td></td><td></td><td></td><td class="s">=head1 TODO</td></tr>
+<tr><td class="h"><a name="4106"></a>4106</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4107"></a>4107</td><td></td><td></td><td></td><td></td><td class="s">These will be addressed as needed and as time allows.</td></tr>
+<tr><td class="h"><a name="4108"></a>4108</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4109"></a>4109</td><td></td><td></td><td></td><td></td><td class="s">Stall timeout.</td></tr>
+<tr><td class="h"><a name="4110"></a>4110</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4111"></a>4111</td><td></td><td></td><td></td><td></td><td class="s">Expose a list of child process objects.  When I do this,</td></tr>
+<tr><td class="h"><a name="4112"></a>4112</td><td></td><td></td><td></td><td></td><td class="s">each child process is likely to be blessed into IPC::Run::Proc.</td></tr>
+<tr><td class="h"><a name="4113"></a>4113</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4114"></a>4114</td><td></td><td></td><td></td><td></td><td class="s">$kid-&gt;abort(), $kid-&gt;kill(), $kid-&gt;signal( $num_or_name ).</td></tr>
+<tr><td class="h"><a name="4115"></a>4115</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4116"></a>4116</td><td></td><td></td><td></td><td></td><td class="s">Write tests for /(full_)?results?/ subs.</td></tr>
+<tr><td class="h"><a name="4117"></a>4117</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4118"></a>4118</td><td></td><td></td><td></td><td></td><td class="s">Currently, pump() and run() only work on systems where select() works on the</td></tr>
+<tr><td class="h"><a name="4119"></a>4119</td><td></td><td></td><td></td><td></td><td class="s">filehandles returned by pipe().  This does *not* include ActiveState on Win32,</td></tr>
+<tr><td class="h"><a name="4120"></a>4120</td><td></td><td></td><td></td><td></td><td class="s">although it does work on cygwin under Win32 (thought the tests whine a bit).</td></tr>
+<tr><td class="h"><a name="4121"></a>4121</td><td></td><td></td><td></td><td></td><td class="s">I'd like to rectify that, suggestions and patches welcome.</td></tr>
+<tr><td class="h"><a name="4122"></a>4122</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4123"></a>4123</td><td></td><td></td><td></td><td></td><td class="s">Likewise start() only fully works on fork()/exec() machines (well, just</td></tr>
+<tr><td class="h"><a name="4124"></a>4124</td><td></td><td></td><td></td><td></td><td class="s">fork() if you only ever pass perl subs as subprocesses).  There's</td></tr>
+<tr><td class="h"><a name="4125"></a>4125</td><td></td><td></td><td></td><td></td><td class="s">some scaffolding for calling Open3::spawn_with_handles(), but that's</td></tr>
+<tr><td class="h"><a name="4126"></a>4126</td><td></td><td></td><td></td><td></td><td class="s">untested, and not that useful with limited select().</td></tr>
+<tr><td class="h"><a name="4127"></a>4127</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4128"></a>4128</td><td></td><td></td><td></td><td></td><td class="s">Support for C&lt;\@sub_cmd&gt; as an argument to a command which</td></tr>
+<tr><td class="h"><a name="4129"></a>4129</td><td></td><td></td><td></td><td></td><td class="s">gets replaced with /dev/fd or the name of a temporary file containing foo's</td></tr>
+<tr><td class="h"><a name="4130"></a>4130</td><td></td><td></td><td></td><td></td><td class="s">output.  This is like &lt;(sub_cmd ...) found in bash and csh (IIRC).</td></tr>
+<tr><td class="h"><a name="4131"></a>4131</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4132"></a>4132</td><td></td><td></td><td></td><td></td><td class="s">Allow multiple harnesses to be combined as independent sets of processes</td></tr>
+<tr><td class="h"><a name="4133"></a>4133</td><td></td><td></td><td></td><td></td><td class="s">in to one 'meta-harness'.</td></tr>
+<tr><td class="h"><a name="4134"></a>4134</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4135"></a>4135</td><td></td><td></td><td></td><td></td><td class="s">Allow a harness to be passed in place of an \@cmd.  This would allow</td></tr>
+<tr><td class="h"><a name="4136"></a>4136</td><td></td><td></td><td></td><td></td><td class="s">multiple harnesses to be aggregated.</td></tr>
+<tr><td class="h"><a name="4137"></a>4137</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4138"></a>4138</td><td></td><td></td><td></td><td></td><td class="s">Ability to add external file descriptors w/ filter chains and endpoints.</td></tr>
+<tr><td class="h"><a name="4139"></a>4139</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4140"></a>4140</td><td></td><td></td><td></td><td></td><td class="s">Ability to add timeouts and timing generators (i.e. repeating timeouts).</td></tr>
+<tr><td class="h"><a name="4141"></a>4141</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4142"></a>4142</td><td></td><td></td><td></td><td></td><td class="s">High resolution timeouts.</td></tr>
+<tr><td class="h"><a name="4143"></a>4143</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4144"></a>4144</td><td></td><td></td><td></td><td></td><td class="s">=head1 Win32 LIMITATIONS</td></tr>
+<tr><td class="h"><a name="4145"></a>4145</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4146"></a>4146</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="4147"></a>4147</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4148"></a>4148</td><td></td><td></td><td></td><td></td><td class="s">=item Fails on Win9X</td></tr>
+<tr><td class="h"><a name="4149"></a>4149</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4150"></a>4150</td><td></td><td></td><td></td><td></td><td class="s">If you want Win9X support, you'll have to debug it or fund me because I</td></tr>
+<tr><td class="h"><a name="4151"></a>4151</td><td></td><td></td><td></td><td></td><td class="s">don't use that system any more.  The Win32 subsysem has been extended to</td></tr>
+<tr><td class="h"><a name="4152"></a>4152</td><td></td><td></td><td></td><td></td><td class="s">use temporary files in simple run() invocations and these may actually</td></tr>
+<tr><td class="h"><a name="4153"></a>4153</td><td></td><td></td><td></td><td></td><td class="s">work on Win9X too, but I don't have time to work on it.</td></tr>
+<tr><td class="h"><a name="4154"></a>4154</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4155"></a>4155</td><td></td><td></td><td></td><td></td><td class="s">=item May deadlock on Win2K (but not WinNT4 or WinXPPro)</td></tr>
+<tr><td class="h"><a name="4156"></a>4156</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4157"></a>4157</td><td></td><td></td><td></td><td></td><td class="s">Spawning more than one subprocess on Win2K causes a deadlock I haven't</td></tr>
+<tr><td class="h"><a name="4158"></a>4158</td><td></td><td></td><td></td><td></td><td class="s">figured out yet, but simple uses of run() often work.  Passes all tests</td></tr>
+<tr><td class="h"><a name="4159"></a>4159</td><td></td><td></td><td></td><td></td><td class="s">on WinXPPro and WinNT.</td></tr>
+<tr><td class="h"><a name="4160"></a>4160</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4161"></a>4161</td><td></td><td></td><td></td><td></td><td class="s">=item no support yet for &lt;pty&lt; and &gt;pty&gt;</td></tr>
+<tr><td class="h"><a name="4162"></a>4162</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4163"></a>4163</td><td></td><td></td><td></td><td></td><td class="s">These are likely to be implemented as &quot;&lt;&quot; and &quot;&gt;&quot; with binmode on, not</td></tr>
+<tr><td class="h"><a name="4164"></a>4164</td><td></td><td></td><td></td><td></td><td class="s">sure.</td></tr>
+<tr><td class="h"><a name="4165"></a>4165</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4166"></a>4166</td><td></td><td></td><td></td><td></td><td class="s">=item no support for file descriptors higher than 2 (stderr)</td></tr>
+<tr><td class="h"><a name="4167"></a>4167</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4168"></a>4168</td><td></td><td></td><td></td><td></td><td class="s">Win32 only allows passing explicit fds 0, 1, and 2.  If you really, really need to pass file handles, us Win32API:: GetOsFHandle() or ::FdGetOsFHandle() to</td></tr>
+<tr><td class="h"><a name="4169"></a>4169</td><td></td><td></td><td></td><td></td><td class="s">get the integer handle and pass it to the child process using the command</td></tr>
+<tr><td class="h"><a name="4170"></a>4170</td><td></td><td></td><td></td><td></td><td class="s">line, environment, stdin, intermediary file, or other IPC mechnism.  Then</td></tr>
+<tr><td class="h"><a name="4171"></a>4171</td><td></td><td></td><td></td><td></td><td class="s">use that handle in the child (Win32API.pm provides ways to reconstitute</td></tr>
+<tr><td class="h"><a name="4172"></a>4172</td><td></td><td></td><td></td><td></td><td class="s">Perl file handles from Win32 file handles).</td></tr>
+<tr><td class="h"><a name="4173"></a>4173</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4174"></a>4174</td><td></td><td></td><td></td><td></td><td class="s">=item no support for subroutine subprocesses (CODE refs)</td></tr>
+<tr><td class="h"><a name="4175"></a>4175</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4176"></a>4176</td><td></td><td></td><td></td><td></td><td class="s">Can't fork(), so the subroutines would have no context, and closures certainly</td></tr>
+<tr><td class="h"><a name="4177"></a>4177</td><td></td><td></td><td></td><td></td><td class="s">have no meaning</td></tr>
+<tr><td class="h"><a name="4178"></a>4178</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4179"></a>4179</td><td></td><td></td><td></td><td></td><td class="s">Perhaps with Win32 fork() emulation, this can be supported in a limited</td></tr>
+<tr><td class="h"><a name="4180"></a>4180</td><td></td><td></td><td></td><td></td><td class="s">fashion, but there are other very serious problems with that: all parent</td></tr>
+<tr><td class="h"><a name="4181"></a>4181</td><td></td><td></td><td></td><td></td><td class="s">fds get dup()ed in to the thread emulating the forked process, and that</td></tr>
+<tr><td class="h"><a name="4182"></a>4182</td><td></td><td></td><td></td><td></td><td class="s">keeps the parent from being able to close all of the appropriate fds.</td></tr>
+<tr><td class="h"><a name="4183"></a>4183</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4184"></a>4184</td><td></td><td></td><td></td><td></td><td class="s">=item no support for init =&gt; sub {} routines.</td></tr>
+<tr><td class="h"><a name="4185"></a>4185</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4186"></a>4186</td><td></td><td></td><td></td><td></td><td class="s">Win32 processes are created from scratch, there is no way to do an init</td></tr>
+<tr><td class="h"><a name="4187"></a>4187</td><td></td><td></td><td></td><td></td><td class="s">routine that will affect the running child.  Some limited support might</td></tr>
+<tr><td class="h"><a name="4188"></a>4188</td><td></td><td></td><td></td><td></td><td class="s">be implemented one day, do chdir() and %ENV changes can be made.</td></tr>
+<tr><td class="h"><a name="4189"></a>4189</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4190"></a>4190</td><td></td><td></td><td></td><td></td><td class="s">=item signals</td></tr>
+<tr><td class="h"><a name="4191"></a>4191</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4192"></a>4192</td><td></td><td></td><td></td><td></td><td class="s">Win32 does not fully support signals.  signal() is likely to cause errors</td></tr>
+<tr><td class="h"><a name="4193"></a>4193</td><td></td><td></td><td></td><td></td><td class="s">unless sending a signal that Perl emulates, and C&lt;kill_kill()&gt; is immediately</td></tr>
+<tr><td class="h"><a name="4194"></a>4194</td><td></td><td></td><td></td><td></td><td class="s">fatal (there is no grace period).</td></tr>
+<tr><td class="h"><a name="4195"></a>4195</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4196"></a>4196</td><td></td><td></td><td></td><td></td><td class="s">=item helper processes</td></tr>
+<tr><td class="h"><a name="4197"></a>4197</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4198"></a>4198</td><td></td><td></td><td></td><td></td><td class="s">IPC::Run uses helper processes, one per redirected file, to adapt between the</td></tr>
+<tr><td class="h"><a name="4199"></a>4199</td><td></td><td></td><td></td><td></td><td class="s">anonymous pipe connected to the child and the TCP socket connected to the</td></tr>
+<tr><td class="h"><a name="4200"></a>4200</td><td></td><td></td><td></td><td></td><td class="s">parent.  This is a waste of resources and will change in the future to either</td></tr>
+<tr><td class="h"><a name="4201"></a>4201</td><td></td><td></td><td></td><td></td><td class="s">use threads (instead of helper processes) or a WaitForMultipleObjects call</td></tr>
+<tr><td class="h"><a name="4202"></a>4202</td><td></td><td></td><td></td><td></td><td class="s">(instead of select).  Please contact me if you can help with the</td></tr>
+<tr><td class="h"><a name="4203"></a>4203</td><td></td><td></td><td></td><td></td><td class="s">WaitForMultipleObjects() approach; I haven't figured out how to get at it</td></tr>
+<tr><td class="h"><a name="4204"></a>4204</td><td></td><td></td><td></td><td></td><td class="s">without C code.</td></tr>
+<tr><td class="h"><a name="4205"></a>4205</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4206"></a>4206</td><td></td><td></td><td></td><td></td><td class="s">=item shutdown pause</td></tr>
+<tr><td class="h"><a name="4207"></a>4207</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4208"></a>4208</td><td></td><td></td><td></td><td></td><td class="s">There seems to be a pause of up to 1 second between when a child program exits</td></tr>
+<tr><td class="h"><a name="4209"></a>4209</td><td></td><td></td><td></td><td></td><td class="s">and the corresponding sockets indicate that they are closed in the parent.</td></tr>
+<tr><td class="h"><a name="4210"></a>4210</td><td></td><td></td><td></td><td></td><td class="s">Not sure why.</td></tr>
+<tr><td class="h"><a name="4211"></a>4211</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4212"></a>4212</td><td></td><td></td><td></td><td></td><td class="s">=item binmode</td></tr>
+<tr><td class="h"><a name="4213"></a>4213</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4214"></a>4214</td><td></td><td></td><td></td><td></td><td class="s">binmode is not supported yet.  The underpinnings are implemented, just ask</td></tr>
+<tr><td class="h"><a name="4215"></a>4215</td><td></td><td></td><td></td><td></td><td class="s">if you need it.</td></tr>
+<tr><td class="h"><a name="4216"></a>4216</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4217"></a>4217</td><td></td><td></td><td></td><td></td><td class="s">=item IPC::Run::IO</td></tr>
+<tr><td class="h"><a name="4218"></a>4218</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4219"></a>4219</td><td></td><td></td><td></td><td></td><td class="s">IPC::Run::IO objects can be used on Unix to read or write arbitrary files.  On</td></tr>
+<tr><td class="h"><a name="4220"></a>4220</td><td></td><td></td><td></td><td></td><td class="s">Win32, they will need to use the same helper processes to adapt from</td></tr>
+<tr><td class="h"><a name="4221"></a>4221</td><td></td><td></td><td></td><td></td><td class="s">non-select()able filehandles to select()able ones (or perhaps</td></tr>
+<tr><td class="h"><a name="4222"></a>4222</td><td></td><td></td><td></td><td></td><td class="s">WaitForMultipleObjects() will work with them, not sure).</td></tr>
+<tr><td class="h"><a name="4223"></a>4223</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4224"></a>4224</td><td></td><td></td><td></td><td></td><td class="s">=item startup race conditions</td></tr>
+<tr><td class="h"><a name="4225"></a>4225</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4226"></a>4226</td><td></td><td></td><td></td><td></td><td class="s">There seems to be an occasional race condition between child process startup</td></tr>
+<tr><td class="h"><a name="4227"></a>4227</td><td></td><td></td><td></td><td></td><td class="s">and pipe closings.  It seems like if the child is not fully created by the time</td></tr>
+<tr><td class="h"><a name="4228"></a>4228</td><td></td><td></td><td></td><td></td><td class="s">CreateProcess returns and we close the TCP socket being handed to it, the</td></tr>
+<tr><td class="h"><a name="4229"></a>4229</td><td></td><td></td><td></td><td></td><td class="s">parent socket can also get closed.  This is seen with the Win32 pumper</td></tr>
+<tr><td class="h"><a name="4230"></a>4230</td><td></td><td></td><td></td><td></td><td class="s">applications, not the &quot;real&quot; child process being spawned.</td></tr>
+<tr><td class="h"><a name="4231"></a>4231</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4232"></a>4232</td><td></td><td></td><td></td><td></td><td class="s">I assume this is because the kernel hasn't gotten around to incrementing the</td></tr>
+<tr><td class="h"><a name="4233"></a>4233</td><td></td><td></td><td></td><td></td><td class="s">reference count on the child's end (since the child was slow in starting), so</td></tr>
+<tr><td class="h"><a name="4234"></a>4234</td><td></td><td></td><td></td><td></td><td class="s">the parent's closing of the child end causes the socket to be closed, thus</td></tr>
+<tr><td class="h"><a name="4235"></a>4235</td><td></td><td></td><td></td><td></td><td class="s">closing the parent socket.</td></tr>
+<tr><td class="h"><a name="4236"></a>4236</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4237"></a>4237</td><td></td><td></td><td></td><td></td><td class="s">Being a race condition, it's hard to reproduce, but I encountered it while</td></tr>
+<tr><td class="h"><a name="4238"></a>4238</td><td></td><td></td><td></td><td></td><td class="s">testing this code on a drive share to a samba box.  In this case, it takes</td></tr>
+<tr><td class="h"><a name="4239"></a>4239</td><td></td><td></td><td></td><td></td><td class="s">t/run.t a long time to spawn it's chile processes (the parent hangs in the</td></tr>
+<tr><td class="h"><a name="4240"></a>4240</td><td></td><td></td><td></td><td></td><td class="s">first select for several seconds until the child emits any debugging output).</td></tr>
+<tr><td class="h"><a name="4241"></a>4241</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4242"></a>4242</td><td></td><td></td><td></td><td></td><td class="s">I have not seen it on local drives, and can't reproduce it at will,</td></tr>
+<tr><td class="h"><a name="4243"></a>4243</td><td></td><td></td><td></td><td></td><td class="s">unfortunately.  The symptom is a &quot;bad file descriptor in select()&quot; error, and,</td></tr>
+<tr><td class="h"><a name="4244"></a>4244</td><td></td><td></td><td></td><td></td><td class="s">by turning on debugging, it's possible to see that select() is being called on</td></tr>
+<tr><td class="h"><a name="4245"></a>4245</td><td></td><td></td><td></td><td></td><td class="s">a no longer open file descriptor that was returned from the _socket() routine</td></tr>
+<tr><td class="h"><a name="4246"></a>4246</td><td></td><td></td><td></td><td></td><td class="s">in Win32Helper.  There's a new confess() that checks for this (&quot;PARENT_HANDLE</td></tr>
+<tr><td class="h"><a name="4247"></a>4247</td><td></td><td></td><td></td><td></td><td class="s">no longer open&quot;), but I haven't been able to reproduce it (typically).</td></tr>
+<tr><td class="h"><a name="4248"></a>4248</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4249"></a>4249</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="4250"></a>4250</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4251"></a>4251</td><td></td><td></td><td></td><td></td><td class="s">=head1 LIMITATIONS</td></tr>
+<tr><td class="h"><a name="4252"></a>4252</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4253"></a>4253</td><td></td><td></td><td></td><td></td><td class="s">On Unix, requires a system that supports C&lt;waitpid( $pid, WNOHANG )&gt; so</td></tr>
+<tr><td class="h"><a name="4254"></a>4254</td><td></td><td></td><td></td><td></td><td class="s">it can tell if a child process is still running.</td></tr>
+<tr><td class="h"><a name="4255"></a>4255</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4256"></a>4256</td><td></td><td></td><td></td><td></td><td class="s">PTYs don't seem to be non-blocking on some versions of Solaris. Here's a</td></tr>
+<tr><td class="h"><a name="4257"></a>4257</td><td></td><td></td><td></td><td></td><td class="s">test script contributed by Borislav Deianov &lt;borislav@ensim.com&gt; to see</td></tr>
+<tr><td class="h"><a name="4258"></a>4258</td><td></td><td></td><td></td><td></td><td class="s">if you have the problem.  If it dies, you have the problem.</td></tr>
+<tr><td class="h"><a name="4259"></a>4259</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4260"></a>4260</td><td></td><td></td><td></td><td></td><td class="s">   #!/usr/bin/perl</td></tr>
+<tr><td class="h"><a name="4261"></a>4261</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4262"></a>4262</td><td></td><td></td><td></td><td></td><td class="s">   use IPC::Run qw(run);</td></tr>
+<tr><td class="h"><a name="4263"></a>4263</td><td></td><td></td><td></td><td></td><td class="s">   use Fcntl;</td></tr>
+<tr><td class="h"><a name="4264"></a>4264</td><td></td><td></td><td></td><td></td><td class="s">   use IO::Pty;</td></tr>
+<tr><td class="h"><a name="4265"></a>4265</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4266"></a>4266</td><td></td><td></td><td></td><td></td><td class="s">   sub makecmd {</td></tr>
+<tr><td class="h"><a name="4267"></a>4267</td><td></td><td></td><td></td><td></td><td class="s">       return ['perl', '-e', </td></tr>
+<tr><td class="h"><a name="4268"></a>4268</td><td></td><td></td><td></td><td></td><td class="s">               '&lt;STDIN&gt;, print &quot;\n&quot; x '.$_[0].'; while(&lt;STDIN&gt;){last if /end/}'];</td></tr>
+<tr><td class="h"><a name="4269"></a>4269</td><td></td><td></td><td></td><td></td><td class="s">   }</td></tr>
+<tr><td class="h"><a name="4270"></a>4270</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4271"></a>4271</td><td></td><td></td><td></td><td></td><td class="s">   #pipe R, W;</td></tr>
+<tr><td class="h"><a name="4272"></a>4272</td><td></td><td></td><td></td><td></td><td class="s">   #fcntl(W, F_SETFL, O_NONBLOCK);</td></tr>
+<tr><td class="h"><a name="4273"></a>4273</td><td></td><td></td><td></td><td></td><td class="s">   #while (syswrite(W, &quot;\n&quot;, 1)) { $pipebuf++ };</td></tr>
+<tr><td class="h"><a name="4274"></a>4274</td><td></td><td></td><td></td><td></td><td class="s">   #print &quot;pipe buffer size is $pipebuf\n&quot;;</td></tr>
+<tr><td class="h"><a name="4275"></a>4275</td><td></td><td></td><td></td><td></td><td class="s">   my $pipebuf=4096;</td></tr>
+<tr><td class="h"><a name="4276"></a>4276</td><td></td><td></td><td></td><td></td><td class="s">   my $in = &quot;\n&quot; x ($pipebuf * 2) . &quot;end\n&quot;;</td></tr>
+<tr><td class="h"><a name="4277"></a>4277</td><td></td><td></td><td></td><td></td><td class="s">   my $out;</td></tr>
+<tr><td class="h"><a name="4278"></a>4278</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4279"></a>4279</td><td></td><td></td><td></td><td></td><td class="s">   $SIG{ALRM} = sub { die &quot;Never completed!\n&quot; };</td></tr>
+<tr><td class="h"><a name="4280"></a>4280</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4281"></a>4281</td><td></td><td></td><td></td><td></td><td class="s">   print &quot;reading from scalar via pipe...&quot;;</td></tr>
+<tr><td class="h"><a name="4282"></a>4282</td><td></td><td></td><td></td><td></td><td class="s">   alarm( 2 );</td></tr>
+<tr><td class="h"><a name="4283"></a>4283</td><td></td><td></td><td></td><td></td><td class="s">   run(makecmd($pipebuf * 2), '&lt;', \$in, '&gt;', \$out);</td></tr>
+<tr><td class="h"><a name="4284"></a>4284</td><td></td><td></td><td></td><td></td><td class="s">   alarm( 0 );</td></tr>
+<tr><td class="h"><a name="4285"></a>4285</td><td></td><td></td><td></td><td></td><td class="s">   print &quot;done\n&quot;;</td></tr>
+<tr><td class="h"><a name="4286"></a>4286</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4287"></a>4287</td><td></td><td></td><td></td><td></td><td class="s">   print &quot;reading from code via pipe... &quot;;</td></tr>
+<tr><td class="h"><a name="4288"></a>4288</td><td></td><td></td><td></td><td></td><td class="s">   alarm( 2 );</td></tr>
+<tr><td class="h"><a name="4289"></a>4289</td><td></td><td></td><td></td><td></td><td class="s">   run(makecmd($pipebuf * 3), '&lt;', sub { $t = $in; undef $in; $t}, '&gt;', \$out);</td></tr>
+<tr><td class="h"><a name="4290"></a>4290</td><td></td><td></td><td></td><td></td><td class="s">   alarm( 0 );</td></tr>
+<tr><td class="h"><a name="4291"></a>4291</td><td></td><td></td><td></td><td></td><td class="s">   print &quot;done\n&quot;;</td></tr>
+<tr><td class="h"><a name="4292"></a>4292</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4293"></a>4293</td><td></td><td></td><td></td><td></td><td class="s">   $pty = IO::Pty-&gt;new();</td></tr>
+<tr><td class="h"><a name="4294"></a>4294</td><td></td><td></td><td></td><td></td><td class="s">   $pty-&gt;blocking(0);</td></tr>
+<tr><td class="h"><a name="4295"></a>4295</td><td></td><td></td><td></td><td></td><td class="s">   $slave = $pty-&gt;slave();</td></tr>
+<tr><td class="h"><a name="4296"></a>4296</td><td></td><td></td><td></td><td></td><td class="s">   while ($pty-&gt;syswrite(&quot;\n&quot;, 1)) { $ptybuf++ };</td></tr>
+<tr><td class="h"><a name="4297"></a>4297</td><td></td><td></td><td></td><td></td><td class="s">   print &quot;pty buffer size is $ptybuf\n&quot;;</td></tr>
+<tr><td class="h"><a name="4298"></a>4298</td><td></td><td></td><td></td><td></td><td class="s">   $in = &quot;\n&quot; x ($ptybuf * 3) . &quot;end\n&quot;;</td></tr>
+<tr><td class="h"><a name="4299"></a>4299</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4300"></a>4300</td><td></td><td></td><td></td><td></td><td class="s">   print &quot;reading via pty... &quot;;</td></tr>
+<tr><td class="h"><a name="4301"></a>4301</td><td></td><td></td><td></td><td></td><td class="s">   alarm( 2 );</td></tr>
+<tr><td class="h"><a name="4302"></a>4302</td><td></td><td></td><td></td><td></td><td class="s">   run(makecmd($ptybuf * 3), '&lt;pty&lt;', \$in, '&gt;', \$out);</td></tr>
+<tr><td class="h"><a name="4303"></a>4303</td><td></td><td></td><td></td><td></td><td class="s">   alarm(0);</td></tr>
+<tr><td class="h"><a name="4304"></a>4304</td><td></td><td></td><td></td><td></td><td class="s">   print &quot;done\n&quot;;</td></tr>
+<tr><td class="h"><a name="4305"></a>4305</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4306"></a>4306</td><td></td><td></td><td></td><td></td><td class="s">No support for ';', '&amp;&amp;', '||', '{ ... }', etc: use perl's, since run()</td></tr>
+<tr><td class="h"><a name="4307"></a>4307</td><td></td><td></td><td></td><td></td><td class="s">returns TRUE when the command exits with a 0 result code.</td></tr>
+<tr><td class="h"><a name="4308"></a>4308</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4309"></a>4309</td><td></td><td></td><td></td><td></td><td class="s">Does not provide shell-like string interpolation.</td></tr>
+<tr><td class="h"><a name="4310"></a>4310</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4311"></a>4311</td><td></td><td></td><td></td><td></td><td class="s">No support for C&lt;cd&gt;, C&lt;setenv&gt;, or C&lt;export&gt;: do these in an init() sub</td></tr>
+<tr><td class="h"><a name="4312"></a>4312</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4313"></a>4313</td><td></td><td></td><td></td><td></td><td class="s">   run(</td></tr>
+<tr><td class="h"><a name="4314"></a>4314</td><td></td><td></td><td></td><td></td><td class="s">      \cmd,</td></tr>
+<tr><td class="h"><a name="4315"></a>4315</td><td></td><td></td><td></td><td></td><td class="s">         ...</td></tr>
+<tr><td class="h"><a name="4316"></a>4316</td><td></td><td></td><td></td><td></td><td class="s">         init =&gt; sub {</td></tr>
+<tr><td class="h"><a name="4317"></a>4317</td><td></td><td></td><td></td><td></td><td class="s">            chdir $dir or die $!;</td></tr>
+<tr><td class="h"><a name="4318"></a>4318</td><td></td><td></td><td></td><td></td><td class="s">            $ENV{FOO}='BAR'</td></tr>
+<tr><td class="h"><a name="4319"></a>4319</td><td></td><td></td><td></td><td></td><td class="s">         }</td></tr>
+<tr><td class="h"><a name="4320"></a>4320</td><td></td><td></td><td></td><td></td><td class="s">   );</td></tr>
+<tr><td class="h"><a name="4321"></a>4321</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4322"></a>4322</td><td></td><td></td><td></td><td></td><td class="s">Timeout calculation does not allow absolute times, or specification of</td></tr>
+<tr><td class="h"><a name="4323"></a>4323</td><td></td><td></td><td></td><td></td><td class="s">days, months, etc.</td></tr>
+<tr><td class="h"><a name="4324"></a>4324</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4325"></a>4325</td><td></td><td></td><td></td><td></td><td class="s">B&lt;WARNING:&gt; Function coprocesses (C&lt;run \&amp;foo, ...&gt;) suffer from two</td></tr>
+<tr><td class="h"><a name="4326"></a>4326</td><td></td><td></td><td></td><td></td><td class="s">limitations.  The first is that it is difficult to close all filehandles the</td></tr>
+<tr><td class="h"><a name="4327"></a>4327</td><td></td><td></td><td></td><td></td><td class="s">child inherits from the parent, since there is no way to scan all open</td></tr>
+<tr><td class="h"><a name="4328"></a>4328</td><td></td><td></td><td></td><td></td><td class="s">FILEHANDLEs in Perl and it both painful and a bit dangerous to close all open</td></tr>
+<tr><td class="h"><a name="4329"></a>4329</td><td></td><td></td><td></td><td></td><td class="s">file descriptors with C&lt;POSIX::close()&gt;. Painful because we can't tell which</td></tr>
+<tr><td class="h"><a name="4330"></a>4330</td><td></td><td></td><td></td><td></td><td class="s">fds are open at the POSIX level, either, so we'd have to scan all possible fds</td></tr>
+<tr><td class="h"><a name="4331"></a>4331</td><td></td><td></td><td></td><td></td><td class="s">and close any that we don't want open (normally C&lt;exec()&gt; closes any</td></tr>
+<tr><td class="h"><a name="4332"></a>4332</td><td></td><td></td><td></td><td></td><td class="s">non-inheritable but we don't C&lt;exec()&gt; for &amp;sub processes.</td></tr>
+<tr><td class="h"><a name="4333"></a>4333</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4334"></a>4334</td><td></td><td></td><td></td><td></td><td class="s">The second problem is that Perl's DESTROY subs and other on-exit cleanup gets</td></tr>
+<tr><td class="h"><a name="4335"></a>4335</td><td></td><td></td><td></td><td></td><td class="s">run in the child process.  If objects are instantiated in the parent before the</td></tr>
+<tr><td class="h"><a name="4336"></a>4336</td><td></td><td></td><td></td><td></td><td class="s">child is forked, the the DESTROY will get run once in the parent and once in</td></tr>
+<tr><td class="h"><a name="4337"></a>4337</td><td></td><td></td><td></td><td></td><td class="s">the child.  When coprocess subs exit, POSIX::exit is called to work around this,</td></tr>
+<tr><td class="h"><a name="4338"></a>4338</td><td></td><td></td><td></td><td></td><td class="s">but it means that objects that are still referred to at that time are not</td></tr>
+<tr><td class="h"><a name="4339"></a>4339</td><td></td><td></td><td></td><td></td><td class="s">cleaned up.  So setting package vars or closure vars to point to objects that</td></tr>
+<tr><td class="h"><a name="4340"></a>4340</td><td></td><td></td><td></td><td></td><td class="s">rely on DESTROY to affect things outside the process (files, etc), will</td></tr>
+<tr><td class="h"><a name="4341"></a>4341</td><td></td><td></td><td></td><td></td><td class="s">lead to bugs.</td></tr>
+<tr><td class="h"><a name="4342"></a>4342</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4343"></a>4343</td><td></td><td></td><td></td><td></td><td class="s">I goofed on the syntax: &quot;&lt;pipe&quot; vs. &quot;&lt;pty&lt;&quot; and &quot;&gt;filename&quot; are both</td></tr>
+<tr><td class="h"><a name="4344"></a>4344</td><td></td><td></td><td></td><td></td><td class="s">oddities.</td></tr>
+<tr><td class="h"><a name="4345"></a>4345</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4346"></a>4346</td><td></td><td></td><td></td><td></td><td class="s">=head1 TODO</td></tr>
+<tr><td class="h"><a name="4347"></a>4347</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4348"></a>4348</td><td></td><td></td><td></td><td></td><td class="s">=over</td></tr>
+<tr><td class="h"><a name="4349"></a>4349</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4350"></a>4350</td><td></td><td></td><td></td><td></td><td class="s">=item Allow one harness to &quot;adopt&quot; another:</td></tr>
+<tr><td class="h"><a name="4351"></a>4351</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4352"></a>4352</td><td></td><td></td><td></td><td></td><td class="s">   $new_h = harness \@cmd2;</td></tr>
+<tr><td class="h"><a name="4353"></a>4353</td><td></td><td></td><td></td><td></td><td class="s">   $h-&gt;adopt( $new_h );</td></tr>
+<tr><td class="h"><a name="4354"></a>4354</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4355"></a>4355</td><td></td><td></td><td></td><td></td><td class="s">=item Close all filehandles not explicitly marked to stay open.</td></tr>
+<tr><td class="h"><a name="4356"></a>4356</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4357"></a>4357</td><td></td><td></td><td></td><td></td><td class="s">The problem with this one is that there's no good way to scan all open</td></tr>
+<tr><td class="h"><a name="4358"></a>4358</td><td></td><td></td><td></td><td></td><td class="s">FILEHANDLEs in Perl, yet you don't want child processes inheriting handles</td></tr>
+<tr><td class="h"><a name="4359"></a>4359</td><td></td><td></td><td></td><td></td><td class="s">willy-nilly.</td></tr>
+<tr><td class="h"><a name="4360"></a>4360</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4361"></a>4361</td><td></td><td></td><td></td><td></td><td class="s">=back</td></tr>
+<tr><td class="h"><a name="4362"></a>4362</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4363"></a>4363</td><td></td><td></td><td></td><td></td><td class="s">=head1 INSPIRATION</td></tr>
+<tr><td class="h"><a name="4364"></a>4364</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4365"></a>4365</td><td></td><td></td><td></td><td></td><td class="s">Well, select() and waitpid() badly needed wrapping, and open3() isn't</td></tr>
+<tr><td class="h"><a name="4366"></a>4366</td><td></td><td></td><td></td><td></td><td class="s">open-minded enough for me.</td></tr>
+<tr><td class="h"><a name="4367"></a>4367</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4368"></a>4368</td><td></td><td></td><td></td><td></td><td class="s">The shell-like API inspired by a message Russ Allbery sent to perl5-porters,</td></tr>
+<tr><td class="h"><a name="4369"></a>4369</td><td></td><td></td><td></td><td></td><td class="s">which included:</td></tr>
+<tr><td class="h"><a name="4370"></a>4370</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4371"></a>4371</td><td></td><td></td><td></td><td></td><td class="s">   I've thought for some time that it would be</td></tr>
+<tr><td class="h"><a name="4372"></a>4372</td><td></td><td></td><td></td><td></td><td class="s">   nice to have a module that could handle full Bourne shell pipe syntax</td></tr>
+<tr><td class="h"><a name="4373"></a>4373</td><td></td><td></td><td></td><td></td><td class="s">   internally, with fork and exec, without ever invoking a shell.  Something</td></tr>
+<tr><td class="h"><a name="4374"></a>4374</td><td></td><td></td><td></td><td></td><td class="s">   that you could give things like:</td></tr>
+<tr><td class="h"><a name="4375"></a>4375</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4376"></a>4376</td><td></td><td></td><td></td><td></td><td class="s">   pipeopen (PIPE, [ qw/cat file/ ], '|', [ 'analyze', @args ], '&gt;&amp;3');</td></tr>
+<tr><td class="h"><a name="4377"></a>4377</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4378"></a>4378</td><td></td><td></td><td></td><td></td><td class="s">Message ylln51p2b6.fsf@windlord.stanford.edu, on 2000/02/04.</td></tr>
+<tr><td class="h"><a name="4379"></a>4379</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4380"></a>4380</td><td></td><td></td><td></td><td></td><td class="s">=head1 SUPPORT</td></tr>
+<tr><td class="h"><a name="4381"></a>4381</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4382"></a>4382</td><td></td><td></td><td></td><td></td><td class="s">Bugs should always be submitted via the CPAN bug tracker</td></tr>
+<tr><td class="h"><a name="4383"></a>4383</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4384"></a>4384</td><td></td><td></td><td></td><td></td><td class="s">L&lt;http://rt.cpan.org/NoAuth/ReportBug.html?Queue=IPC-Run&gt;</td></tr>
+<tr><td class="h"><a name="4385"></a>4385</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4386"></a>4386</td><td></td><td></td><td></td><td></td><td class="s">For other issues, contact the maintainer (the first listed author)</td></tr>
+<tr><td class="h"><a name="4387"></a>4387</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4388"></a>4388</td><td></td><td></td><td></td><td></td><td class="s">=head1 AUTHORS</td></tr>
+<tr><td class="h"><a name="4389"></a>4389</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4390"></a>4390</td><td></td><td></td><td></td><td></td><td class="s">Adam Kennedy &lt;adamk@cpan.org&gt;</td></tr>
+<tr><td class="h"><a name="4391"></a>4391</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4392"></a>4392</td><td></td><td></td><td></td><td></td><td class="s">Barrie Slaymaker &lt;barries@slaysys.com&gt;</td></tr>
+<tr><td class="h"><a name="4393"></a>4393</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4394"></a>4394</td><td></td><td></td><td></td><td></td><td class="s">=head1 COPYRIGHT</td></tr>
+<tr><td class="h"><a name="4395"></a>4395</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4396"></a>4396</td><td></td><td></td><td></td><td></td><td class="s">Some parts copyright 2008 - 2009 Adam Kennedy.</td></tr>
+<tr><td class="h"><a name="4397"></a>4397</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4398"></a>4398</td><td></td><td></td><td></td><td></td><td class="s">Copyright 1999 Barrie Slaymaker.</td></tr>
+<tr><td class="h"><a name="4399"></a>4399</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4400"></a>4400</td><td></td><td></td><td></td><td></td><td class="s">You may distribute under the terms of either the GNU General Public</td></tr>
+<tr><td class="h"><a name="4401"></a>4401</td><td></td><td></td><td></td><td></td><td class="s">License or the Artistic License, as specified in the README file.</td></tr>
+<tr><td class="h"><a name="4402"></a>4402</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="4403"></a>4403</td><td></td><td></td><td></td><td></td><td class="s">=cut</td></tr>
+<tr><td class="s"><a name=""></a>&nbsp;</td><td></td><td></td><td></td><td></td><td class="s"></td></tr>
+<tr><td class="h"><a name="IPC__Run__CORE_match"></a></td><td></td><td></td><td></td><td></td><td class="s"><div class="calls"><div class="calls_in"># spent 4&micro;s within IPC::Run::CORE:match which was called:
+#    once (4&micro;s+0s) by IPC::Run::BEGIN@1061 at <a href="IPC-Run-pm-733-sub.html#1061">line 1061</a></div></div>sub IPC::Run::CORE:match; # opcode<br />        </td></tr>
+<tr><td class="h"><a name="IPC__Run__CORE_qr"></a></td><td></td><td></td><td></td><td></td><td class="s"><div class="calls"><div class="calls_in"># spent 6&micro;s within IPC::Run::CORE:qr which was called 2 times, avg 3&micro;s/call:
+#    once (5&micro;s+0s) by IPC::Run::BEGIN@1082 at <a href="IPC-Run-pm-733-sub.html#1084">line 1084</a>
+#    once (1&micro;s+0s) by IPC::Run::BEGIN@1082 at <a href="IPC-Run-pm-733-sub.html#1085">line 1085</a></div></div>sub IPC::Run::CORE:qr; # opcode<br />        </td></tr>
+<tr><td class="h"><a name="IPC__Run__CORE_regcomp"></a></td><td></td><td></td><td></td><td></td><td class="s"><div class="calls"><div class="calls_in"># spent 16&micro;s within IPC::Run::CORE:regcomp which was called 2 times, avg 8&micro;s/call:
+#    once (10&micro;s+0s) by IPC::Run::BEGIN@1082 at <a href="IPC-Run-pm-733-sub.html#1084">line 1084</a>
+#    once (7&micro;s+0s) by IPC::Run::BEGIN@1082 at <a href="IPC-Run-pm-733-sub.html#1085">line 1085</a></div></div>sub IPC::Run::CORE:regcomp; # opcode<br />        </td></tr>
+</tbody></table></div>
+        
+            <script type="text/javascript"> $(document).ready(function() { 
+
+        $("#subs_table").tablesorter({
+            sortList: [[3,1]],
+            headers: {
+                3: { sorter: 'fmt_time' },
+                4: { sorter: 'fmt_time' }
+            }
+        });
+    
+ } ); </script>
+        
+        <div class="footer">Report produced by the
+        <a href="http://search.cpan.org/dist/Devel-NYTProf/">NYTProf 4.06</a>
+        Perl profiler, developed by
+        <a href="http://www.linkedin.com/in/timbunce">Tim Bunce</a> and
+        <a href="http://code.nytimes.com">Adam Kaplan</a>.
+        </div>
+        <br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
+    </body></html>
\ No newline at end of file