📄 ch16_16.htm
字号:
<HTML><HEAD><TITLE>Recipe 16.15. Installing a Signal Handler (Perl Cookbook)</TITLE><METANAME="DC.title"CONTENT="Perl Cookbook"><METANAME="DC.creator"CONTENT="Tom Christiansen & Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly & Associates, Inc."><METANAME="DC.date"CONTENT="1999-07-02T01:44:09Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-243-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch16_01.htm"TITLE="16. Process Management and Communication"><LINKREL="prev"HREF="ch16_15.htm"TITLE="16.14. Sending a Signal"><LINKREL="next"HREF="ch16_17.htm"TITLE="16.16. Temporarily Overriding a Signal Handler"></HEAD><BODYBGCOLOR="#FFFFFF"><img alt="Book Home" border="0" src="gifs/smbanner.gif" usemap="#banner-map" /><map name="banner-map"><area shape="rect" coords="1,-2,616,66" href="index.htm" alt="Perl Cookbook"><area shape="rect" coords="629,-11,726,25" href="jobjects/fsearch.htm" alt="Search this book" /></map><div class="navbar"><p><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch16_15.htm"TITLE="16.14. Sending a Signal"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 16.14. Sending a Signal"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch16_01.htm"TITLE="16. Process Management and Communication"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch16_17.htm"TITLE="16.16. Temporarily Overriding a Signal Handler"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 16.16. Temporarily Overriding a Signal Handler"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch16-31227">16.15. Installing a Signal Handler</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch16-pgfId-1000005410">Problem</A></H3><PCLASS="para"><ACLASS="indexterm"NAME="ch16-idx-1000006390-0"></A><ACLASS="indexterm"NAME="ch16-idx-1000006390-1"></A><ACLASS="indexterm"NAME="ch16-idx-1000006390-2"></A><ACLASS="indexterm"NAME="ch16-idx-1000006390-3"></A>You want to control how your program responds to signals. You need to do this if you want to catch Ctrl-C, avoid accumulating finished subprocesses, or prevent your process from dying when it writes to a child that has gone away.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch16-pgfId-1000005413">Solution</A></H3><PCLASS="para">Use the <CODECLASS="literal">%SIG</CODE><ACLASS="indexterm"NAME="ch16-idx-1000006382-0"></A> hash to install your own handler by name or by code reference:</P><PRECLASS="programlisting">$SIG{QUIT} = \&got_sig_quit; # call &got_sig_quit for every SIGQUIT $SIG{PIPE} = 'got_sig_pipe'; # call main::got_sig_pipe for every SIGPIPE $SIG{INT} = sub { $ouch++ }; # increment $ouch for every SIGINT</PRE><PCLASS="para"><CODECLASS="literal">%SIG</CODE> also lets you ignore a signal:</P><PRECLASS="programlisting">$SIG{INT} = 'IGNORE'; # ignore the signal INT</PRE><PCLASS="para">It also restores handling for that signal to the default:</P><PRECLASS="programlisting">$SIG{STOP} = 'DEFAULT'; # restore default STOP signal handling</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch16-pgfId-1000005423">Discussion</A></H3><PCLASS="para">Perl uses the <CODECLASS="literal">%SIG</CODE> hash to control what happens when signals are received. Each key in <CODECLASS="literal">%SIG</CODE> corresponds to a signal. Each value is the action to take when Perl receives the corresponding signal. Perl provides two special behaviors: <CODECLASS="literal">"IGNORE"</CODE> to take no action when a particular signal is received, and <CODECLASS="literal">"DEFAULT"</CODE> to perform the default Unix action for that signal.</P><PCLASS="para">Although a C programmer might think of a signal as SIGINT, Perl uses just INT. Perl figures you only use signal names in functions that deal with signals, so the SIG prefix is redundant. This means that you'll assign to <CODECLASS="literal">$SIG{CHLD}</CODE> to change what your process does when it gets a SIGCHLD.</P><PCLASS="para">If you want to run your own code when a given signal is received, you have two choices of what to put in the hash: either a code reference or a subroutine name. (This means you can't name a signal handler IGNORE or DEFAULT if you store the string, but they'd be mighty strange names for signal handlers anyway.) If you use a subroutine name that isn't qualified by a package, Perl will interpret this name to be a function in the <CODECLASS="literal">main::</CODE> package, not one in the package in which the handler was installed. A code reference refers to a subroutine in a particular package, so it is a better choice.</P><PCLASS="para">Perl calls your handler code with a single argument: the name of the signal that triggered it, like <CODECLASS="literal">"INT"</CODE> or <CODECLASS="literal">"USR1"</CODE>. Returning from a signal handler takes you back to whatever you were doing when the signal hit.</P><PCLASS="para">Perl defines two special signals, <CODECLASS="literal">__DIE__</CODE><ACLASS="indexterm"NAME="ch16-idx-1000007928-0"></A><ACLASS="indexterm"NAME="ch16-idx-1000007928-1"></A> and <CODECLASS="literal">__WARN__</CODE>, whose handlers are called whenever a Perl program emits warnings through <CODECLASS="literal">warn</CODE> or dies through <CODECLASS="literal">die</CODE>. This lets you catch such warnings, and selectively trap or propagate them. The <CODECLASS="literal">die</CODE> and <CODECLASS="literal">warn</CODE> handlers are disabled while they run, so you can safely <CODECLASS="literal">die</CODE> from a <CODECLASS="literal">__DIE__</CODE> handler or <CODECLASS="literal">warn</CODE> from a <CODECLASS="literal">__WARN__</CODE> handler without fear of recursion.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch16-pgfId-1000005550">See Also</A></H3><PCLASS="para">The <ACLASS="olink"HREF="../prog/ch06_02.htm#PERL2-CH-6-SECT-2.1">"Signals"</A> sections in <ACLASS="olink"HREF="../prog/ch06_01.htm">Chapter 6</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A> and in <ICLASS="filename">perlipc </I>(1); your system's <ICLASS="filename">sigaction </I>(2), <ICLASS="filename">signal </I>(3), and <ICLASS="filename">kill </I>(2) manpages (if you have them)</P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch16_15.htm"TITLE="16.14. Sending a Signal"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 16.14. Sending a Signal"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="book"HREF="index.htm"TITLE="Perl Cookbook"><IMGSRC="../gifs/txthome.gif"ALT="Perl Cookbook"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch16_17.htm"TITLE="16.16. Temporarily Overriding a Signal Handler"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 16.16. Temporarily Overriding a Signal Handler"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">16.14. Sending a Signal</TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="index"HREF="index/index.htm"TITLE="Book Index"><IMGSRC="../gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228">16.16. Temporarily Overriding a Signal Handler</TD></TR></TABLE><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><FONTSIZE="-1"></DIV<!-- LIBRARY NAV BAR --> <img src="../gifs/smnavbar.gif" usemap="#library-map" border="0" alt="Library Navigation Links"><p> <a href="copyrght.htm">Copyright © 2002</a> O'Reilly & Associates. All rights reserved.</font> </p> <map name="library-map"> <area shape="rect" coords="1,0,85,94" href="../index.htm"><area shape="rect" coords="86,1,178,103" href="../lwp/index.htm"><area shape="rect" coords="180,0,265,103" href="../lperl/index.htm"><area shape="rect" coords="267,0,353,105" href="../perlnut/index.htm"><area shape="rect" coords="354,1,446,115" href="../prog/index.htm"><area shape="rect" coords="448,0,526,132" href="../tk/index.htm"><area shape="rect" coords="528,1,615,119" href="../cookbook/index.htm"><area shape="rect" coords="617,0,690,135" href="../pxml/index.htm"></map> </BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -