perlipc.html
来自「perl教程」· HTML 代码 · 共 765 行 · 第 1/5 页
HTML
765 行
<?xml version="1.0" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<!-- saved from url=(0017)http://localhost/ -->
<script language="JavaScript" src="../../displayToc.js"></script>
<script language="JavaScript" src="../../tocParas.js"></script>
<script language="JavaScript" src="../../tocTab.js"></script>
<link rel="stylesheet" type="text/css" href="../../scineplex.css">
<title>perlipc - Perl interprocess communication</title>
<link rel="stylesheet" href="../../Active.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:" />
</head>
<body>
<script>writelinks('__top__',2);</script>
<h1><a>perlipc - Perl interprocess communication</a></h1>
<p><a name="__index__"></a></p>
<!-- INDEX BEGIN -->
<ul>
<li><a href="#name">NAME</a></li>
<li><a href="#description">DESCRIPTION</a></li>
<li><a href="#signals">Signals</a></li>
<ul>
<li><a href="#handling_the_sighup_signal_in_daemons">Handling the SIGHUP Signal in Daemons</a></li>
</ul>
<li><a href="#named_pipes">Named Pipes</a></li>
<ul>
<li><a href="#deferred_signals__safe_signals_">Deferred Signals (Safe Signals)</a></li>
</ul>
<li><a href="#using_open___for_ipc">Using <a href="../../lib/Pod/perlfunc.html#item_open"><code>open()</code></a> for IPC</a></li>
<ul>
<li><a href="#filehandles">Filehandles</a></li>
<li><a href="#background_processes">Background Processes</a></li>
<li><a href="#complete_dissociation_of_child_from_parent">Complete Dissociation of Child from Parent</a></li>
<li><a href="#safe_pipe_opens">Safe Pipe Opens</a></li>
<li><a href="#bidirectional_communication_with_another_process">Bidirectional Communication with Another Process</a></li>
<li><a href="#bidirectional_communication_with_yourself">Bidirectional Communication with Yourself</a></li>
</ul>
<li><a href="#sockets__client_server_communication">Sockets: Client/Server Communication</a></li>
<ul>
<li><a href="#internet_line_terminators">Internet Line Terminators</a></li>
<li><a href="#internet_tcp_clients_and_servers">Internet TCP Clients and Servers</a></li>
<li><a href="#unixdomain_tcp_clients_and_servers">Unix-Domain TCP Clients and Servers</a></li>
</ul>
<li><a href="#tcp_clients_with_io__socket">TCP Clients with IO::Socket</a></li>
<ul>
<li><a href="#a_simple_client">A Simple Client</a></li>
<li><a href="#a_webget_client">A Webget Client</a></li>
<li><a href="#interactive_client_with_io__socket">Interactive Client with IO::Socket</a></li>
</ul>
<li><a href="#tcp_servers_with_io__socket">TCP Servers with IO::Socket</a></li>
<li><a href="#udp__message_passing">UDP: Message Passing</a></li>
<li><a href="#sysv_ipc">SysV IPC</a></li>
<li><a href="#notes">NOTES</a></li>
<li><a href="#bugs">BUGS</a></li>
<li><a href="#author">AUTHOR</a></li>
<li><a href="#see_also">SEE ALSO</a></li>
</ul>
<!-- INDEX END -->
<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<p>perlipc - Perl interprocess communication (signals, fifos, pipes, safe subprocesses, sockets, and semaphores)</p>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>The basic IPC facilities of Perl are built out of the good old Unix
signals, named pipes, pipe opens, the Berkeley socket routines, and SysV
IPC calls. Each is used in slightly different situations.</p>
<p>
</p>
<hr />
<h1><a name="signals">Signals</a></h1>
<p>Perl uses a simple signal handling model: the %SIG hash contains names
or references of user-installed signal handlers. These handlers will
be called with an argument which is the name of the signal that
triggered it. A signal may be generated intentionally from a
particular keyboard sequence like control-C or control-Z, sent to you
from another process, or triggered automatically by the kernel when
special events transpire, like a child process exiting, your process
running out of stack space, or hitting file size limit.</p>
<p>For example, to trap an interrupt signal, set up a handler like this:</p>
<pre>
<span class="keyword">sub</span><span class="variable"> catch_zap </span><span class="operator">{</span>
<span class="keyword">my</span> <span class="variable">$signame</span> <span class="operator">=</span> <span class="keyword">shift</span><span class="operator">;</span>
<span class="variable">$shucks</span><span class="operator">++;</span>
<span class="keyword">die</span> <span class="string">"Somebody sent me a SIG$signame"</span><span class="operator">;</span>
<span class="operator">}</span>
<span class="variable">$SIG</span><span class="operator">{</span><span class="string">INT</span><span class="operator">}</span> <span class="operator">=</span> <span class="string">'catch_zap'</span><span class="operator">;</span> <span class="comment"># could fail in modules</span>
<span class="variable">$SIG</span><span class="operator">{</span><span class="string">INT</span><span class="operator">}</span> <span class="operator">=</span> <span class="operator">\&</span><span class="variable">catch_zap</span><span class="operator">;</span> <span class="comment"># best strategy</span>
</pre>
<p>Prior to Perl 5.7.3 it was necessary to do as little as you possibly
could in your handler; notice how all we do is set a global variable
and then raise an exception. That's because on most systems,
libraries are not re-entrant; particularly, memory allocation and I/O
routines are not. That meant that doing nearly <em>anything</em> in your
handler could in theory trigger a memory fault and subsequent core
dump - see <a href="#deferred_signals__safe_signals_">Deferred Signals (Safe Signals)</a> below.</p>
<p>The names of the signals are the ones listed out by <code>kill -l</code> on your
system, or you can retrieve them from the Config module. Set up an
@signame list indexed by number to get the name and a %signo table
indexed by name to get the number:</p>
<pre>
<span class="keyword">use</span> <span class="variable">Config</span><span class="operator">;</span>
<span class="keyword">defined</span> <span class="variable">$Config</span><span class="operator">{</span><span class="string">sig_name</span><span class="operator">}</span> <span class="operator">||</span> <span class="keyword">die</span> <span class="string">"No sigs?"</span><span class="operator">;</span>
<span class="keyword">foreach</span> <span class="variable">$name</span> <span class="operator">(</span><span class="keyword">split</span><span class="operator">(</span><span class="string">' '</span><span class="operator">,</span> <span class="variable">$Config</span><span class="operator">{</span><span class="string">sig_name</span><span class="operator">}</span><span class="operator">))</span> <span class="operator">{</span>
<span class="variable">$signo</span><span class="operator">{</span><span class="variable">$name</span><span class="operator">}</span> <span class="operator">=</span> <span class="variable">$i</span><span class="operator">;</span>
<span class="variable">$signame</span><span class="operator">[</span><span class="variable">$i</span><span class="operator">]</span> <span class="operator">=</span> <span class="variable">$name</span><span class="operator">;</span>
<span class="variable">$i</span><span class="operator">++;</span>
<span class="operator">}</span>
</pre>
<p>So to check whether signal 17 and SIGALRM were the same, do just this:</p>
<pre>
<span class="keyword">print</span> <span class="string">"signal #17 = $signame[17]\n"</span><span class="operator">;</span>
<span class="keyword">if</span> <span class="operator">(</span><span class="variable">$signo</span><span class="operator">{</span><span class="string">ALRM</span><span class="operator">}</span><span class="operator">)</span> <span class="operator">{</span>
<span class="keyword">print</span> <span class="string">"SIGALRM is $signo{ALRM}\n"</span><span class="operator">;</span>
<span class="operator">}</span>
</pre>
<p>You may also choose to assign the strings <code>'IGNORE'</code> or <code>'DEFAULT'</code> as
the handler, in which case Perl will try to discard the signal or do the
default thing.</p>
<p>On most Unix platforms, the <code>CHLD</code> (sometimes also known as <code>CLD</code>) signal
has special behavior with respect to a value of <code>'IGNORE'</code>.
Setting <code>$SIG{CHLD}</code> to <code>'IGNORE'</code> on such a platform has the effect of
not creating zombie processes when the parent process fails to <a href="../../lib/Pod/perlfunc.html#item_wait"><code>wait()</code></a>
on its child processes (i.e. child processes are automatically reaped).
Calling <a href="../../lib/Pod/perlfunc.html#item_wait"><code>wait()</code></a> with <code>$SIG{CHLD}</code> set to <code>'IGNORE'</code> usually returns
<code>-1</code> on such platforms.</p>
<p>Some signals can be neither trapped nor ignored, such as
the KILL and STOP (but not the TSTP) signals. One strategy for
temporarily ignoring signals is to use a <a href="../../lib/Pod/perlfunc.html#item_local"><code>local()</code></a> statement, which will be
automatically restored once your block is exited. (Remember that <a href="../../lib/Pod/perlfunc.html#item_local"><code>local()</code></a>
values are "inherited" by functions called from within that block.)</p>
<pre>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?