215 lines
16 KiB
HTML
215 lines
16 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>signal</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-c_program_signal skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">signal</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="c.html">c</a>‎ | <a href="c-program.html">program</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><signal.h></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi c source-c"><span class="kw4">void</span> <span class="br0">(</span><span class="sy2">*</span>signal<span class="br0">(</span> <span class="kw4">int</span> sig, <span class="kw4">void</span> <span class="br0">(</span><span class="sy2">*</span>handler<span class="br0">)</span> <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>设置信号 <code>sig</code> 的错误处理函数。能设置错误处理函数,使得将出现默认处理、忽略信号或调用用户定义函数。</p>
|
|
<p>当设置信号处理为一个函数,而信号出现时,是否立即在信号处理函数开始前调用 <span class="t-c"><span class="mw-geshi c source-c">signal<span class="br0">(</span>sig, <a href="c-program-SIG_strategies.html"><span class="kw499">SIG_DFL</span></a><span class="br0">)</span></span></span> 是实现定义的。而且,实现能阻止某个实现定义的信号集在信号处理函数运行时出现。</p>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">参数</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td>sig</td>
|
|
<td>-</td>
|
|
<td>设置给信号处理函数的信号。能为实现定义的值或下列值之一:
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="c-program-SIG_types.html"><span class="t-lines"><span>SIGABRT</span><span>SIGFPE</span><span>SIGILL</span><span>SIGINT</span><span>SIGSEGV</span><span>SIGTERM</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>定义信号类型<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p><br /></p>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>handler</td>
|
|
<td>-</td>
|
|
<td>信号处理函数。必须是下列之一:
|
|
<ul>
|
|
<li><span class="t-lc"><a href="c-program-SIG_strategies.html">SIG_DFL</a></span> 宏。将信号处理函数默认设为默认信号处理函数。</li>
|
|
<li><span class="t-lc"><a href="c-program-SIG_strategies.html">SIG_IGN</a></span> 宏。忽略信号。</li>
|
|
<li>函数指针。函数签名必须等价于如下形式:</li>
|
|
</ul>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi c source-c"><span class="kw4">void</span> fun<span class="br0">(</span><span class="kw4">int</span> sig<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">返回值</span></h3>
|
|
<p>成功时为之前设置的信号处理,失败时为 <span class="t-lc"><a href="c-program-SIG_ERR.html">SIG_ERR</a></span> (一些实现上能禁用设置信号处理函数)。</p>
|
|
<h3><span class="mw-headline" id=".E4.BF.A1.E5.8F.B7.E5.A4.84.E7.90.86.E5.87.BD.E6.95.B0">信号处理函数</span></h3>
|
|
<p>安装为信号处理函数的用户定义函数上,强制了下列限制。</p>
|
|
<p>若用户定义函数在处理 <span class="t-lc"><a href="c-program-SIG_types.html">SIGFPE</a></span> 、 <span class="t-lc"><a href="c-program-SIG_types.html">SIGILL</a></span> 或 <span class="t-lc"><a href="c-program-SIG_types.html">SIGSEGV</a></span> 时返回,则行为未定义。</p>
|
|
<p>若作为 <span class="t-lc"><a href="c-program-abort.html">abort</a></span> 或 <span class="t-lc"><a href="c-program-raise.html">raise</a></span> 的结果调用了信号处理函数,则若信号处理函数调用 <span class="t-lc"><a href="c-program-raise.html">raise</a></span> ,则行为未定义。</p>
|
|
<p>若信号处理函数不是作为 <span class="t-lc"><a href="c-program-abort.html">abort</a></span> 或 <span class="t-lc"><a href="c-program-raise.html">raise</a></span> 的结果调用(换言之,信号处理是<i>异步的</i>),则在下列场合行为未定义</p>
|
|
<ul>
|
|
<li>信号处理在调用任何标准库内的函数,除了</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><span class="t-lc"><a href="c-program-abort.html">abort</a></span></li>
|
|
<li><span class="t-lc"><a href="c-program-_Exit.html">_Exit</a></span></li>
|
|
<li><span class="t-lc"><a href="c-program-quick_exit.html">quick_exit</a></span></li>
|
|
<li>以当前处理信号的编号为第一参数,调用 <code>signal</code> (异步处理函数能重注册其自身,但不能注册其他信号)。</li>
|
|
<li>来自 <a href="c-atomic.html">stdatomic.h</a> 的原子函数,若原子参数为免锁</li>
|
|
<li><span class="t-lc"><a href="c-atomic-atomic_is_lock_free.html">atomic_is_lock_free</a></span> (以任何类型的原子参数)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<ul>
|
|
<li>信号处理函数使用任何拥有静态<span class="t-rev-inl t-since-c11"><span>或线程局域</span> <span><span class="t-mark-rev t-since-c11">(C11 起)</span></span></span><a href="c-language-storage_duration.html">存储期</a><span class="t-rev-inl t-since-c11"><span>,且非免锁<a href="c-language-atomic.html">原子</a>的</span> <span><span class="t-mark-rev t-since-c11">(C11 起)</span></span></span>对象,除了赋值给静态 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">volatile</span> <a href="c-program-sig_atomic_t.html"><span class="kw498">sig_atomic_t</span></a></span></span> 对象。</li>
|
|
</ul>
|
|
<p>进入信号处理函数时,浮点环境状态和所有对象的值是未指定的,除了</p>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">volatile</span> <a href="c-program-sig_atomic_t.html"><span class="kw498">sig_atomic_t</span></a></span></span> 类型对象</li>
|
|
<li>免锁原子类型对象<span class="t-mark-rev t-since-c11">(C11 起)</span></li>
|
|
<li>通过 <span class="t-lc"><a href="c-atomic-atomic_signal_fence.html">atomic_signal_fence</a></span> 使之可见的副效应<span class="t-mark-rev t-since-c11">(C11 起)</span></li>
|
|
</ul>
|
|
<p>从信号处理函数返回时,信号处理函数所修改的任何对象的值,除了 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">volatile</span> <a href="c-program-sig_atomic_t.html"><span class="kw498">sig_atomic_t</span></a></span></span> <span class="t-rev-inl t-since-c11"><span>及免锁原子</span> <span><span class="t-mark-rev t-since-c11">(C11 起)</span></span></span>对象,均为未定义。</p>
|
|
<p>若 <span class="t-c"><span class="mw-geshi c source-c">signal</span></span> 被用于多线程程序,则行为未定义。不要求它是线程安全的。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>POSIX 要求 <code>signal</code> 为线程安全的,而且能从任何信号处理函数调用<a rel="nofollow" class="external text" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04">异步信号安全( async-signal-safe )库函数列表</a>中的函数。</p>
|
|
<p>除了 <code>abort</code> 和 <code>raise</code> 后, POSIX 还指定 <code>kill</code> 、 <code>pthread_kill</code> 以及 <code>sigqueue</code> 生成同步信号。</p>
|
|
<p>POSIX 推荐用 <a rel="nofollow" class="external text" href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html">sigaction</a> 替代 <code>signal</code> ,因为其受指定的行为,还有其关乎在执行信号处理函数时投递信号的重要实现变更。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co2">#include <signal.h></span>
|
|
<span class="co2">#include <stdio.h></span>
|
|
|
|
<span class="kw4">volatile</span> <a href="c-program-sig_atomic_t.html"><span class="kw498">sig_atomic_t</span></a> gSignalStatus<span class="sy4">;</span>
|
|
|
|
<span class="kw4">void</span> signal_handler<span class="br0">(</span><span class="kw4">int</span> signal<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
gSignalStatus <span class="sy1">=</span> signal<span class="sy4">;</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
signal<span class="br0">(</span><a href="c-program-SIG_types.html"><span class="kw505">SIGINT</span></a>, signal_handler<span class="br0">)</span><span class="sy4">;</span>
|
|
|
|
<a href="c-io-fprintf.html"><span class="kw850">printf</span></a><span class="br0">(</span><span class="st0">"SignalValue: %d<span class="es1">\n</span>"</span>, gSignalStatus<span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw850">printf</span></a><span class="br0">(</span><span class="st0">"Sending signal: %d<span class="es1">\n</span>"</span>, <a href="c-program-SIG_types.html"><span class="kw505">SIGINT</span></a><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-program-raise.html"><span class="kw497">raise</span></a><span class="br0">(</span><a href="c-program-SIG_types.html"><span class="kw505">SIGINT</span></a><span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw850">printf</span></a><span class="br0">(</span><span class="st0">"SignalValue: %d<span class="es1">\n</span>"</span>, gSignalStatus<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">SignalValue: 0
|
|
Sending signal: 2
|
|
SignalValue: 2</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>7.14.1.1 The signal function (p: 266-267)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>7.14.1.1 The signal function (p: 247-248)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>4.7.1.1 The signal function</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="c-program-raise.html"><span class="t-lines"><span>raise</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>运行特定信号的信号处理函数<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|