⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 75.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<html>
<head>
<title>kernel/signal.c</title>
<meta name='robots' content='noindex,nofollow'>
<meta name='generator' content='GLOBAL-5.4.1'>
</head>
<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>
<a name='TOP'><h2><a href='../mains.html'>root</a>/<a href='../files/104.html'>kernel</a>/signal.c</h2>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L18'>[^]</a><a href='#L109'>[v]</a>[top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2>DEFINITIONS</h2>
This source file includes following definitions.
<ol>
<li><a href='#L18' title='Defined at 18.'>sys_sgetmask</a>
<li><a href='#L25' title='Defined at 25.'>sys_ssetmask</a>
<li><a href='#L35' title='Defined at 35.'>save_old</a>
<li><a href='#L50' title='Defined at 50.'>get_new</a>
<li><a href='#L63' title='Defined at 63.'>sys_signal</a>
<li><a href='#L83' title='Defined at 83.'>sys_sigaction</a>
<li><a href='#L109' title='Defined at 109.'>do_signal</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/kernel/signal.c</font></i>
<a name='L3'><i><font color='green'>*</font></i>
<a name='L4'><i><font color='green'>* (C) 1991 Linus Torvalds</font></i>
<a name='L5'><i><font color='green'>*/</font></i>
<a name='L6'>
<a name='L7'><font color='darkred'>#include</font> &lt;<a href='36.html'>linux/sched.h</a>&gt;        <i><font color='green'>// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,</font></i>
<a name='L8'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L9'><font color='darkred'>#include</font> &lt;<a href='34.html'>linux/kernel.h</a>&gt;       <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L10'><font color='darkred'>#include</font> &lt;<a href='24.html'>asm/segment.h</a>&gt;        <i><font color='green'>// 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</font></i>
<a name='L11'>
<a name='L12'><font color='darkred'>#include</font> &lt;<a href='39.html'>signal.h</a>&gt;             <i><font color='green'>// 信号头文件。定义信号符号常量,信号结构以及信号操作函数原型。</font></i>
<a name='L13'>
<a name='L14'><b>volatile</b> <b>void</b> <a href='../S/67.html#L139' title='Defined at 139 in kernel/exit.c.'>do_exit</a> (<b>int</b> error_code); <i><font color='green'>// 前面的限定符volatile 要求编译器不要对其进行优化。</font></i>
<a name='L15'>
<a name='L16'><i><font color='green'>// 获取当前任务信号屏蔽位图(屏蔽码)。</font></i>
<a name='L17'><b>int</b>
<a name='L18'><a href='../R/679.html' title='Multiple refered from 2 places.'>sys_sgetmask</a> ()
<a name='L19'><font color='red'>{</font>
<a name='L20'>  <b>return</b> current-&gt;blocked;
<a name='L21'><font color='red'>}</font>
<a name='L22'>
<a name='L23'><i><font color='green'>// 设置新的信号屏蔽位图。SIGKILL 不能被屏蔽。返回值是原信号屏蔽位图。</font></i>
<a name='L24'><b>int</b>
<a name='L25'><a href='../R/682.html' title='Multiple refered from 2 places.'>sys_ssetmask</a> (<b>int</b> newmask)
<a name='L26'><font color='red'>{</font>
<a name='L27'>  <b>int</b> old = current-&gt;blocked;
<a name='L28'>
<a name='L29'>  current-&gt;blocked = newmask &amp; ~(1 &lt;&lt; (<a href='../S/39.html#L22' title='Defined at 22 in include/signal.h.'>SIGKILL</a> - 1));
<a name='L30'>  <b>return</b> old;
<a name='L31'><font color='red'>}</font>
<a name='L32'>
<a name='L33'><i><font color='green'>// 复制sigaction 数据到fs 数据段to 处。。</font></i>
<a name='L34'><b>static</b> <b>inline</b> <b>void</b>
<a name='L35'><a href='../S/75.html#L96' title='Refered from 96 in kernel/signal.c.'>save_old</a> (<b>char</b> *from, <b>char</b> *to)
<a name='L36'><font color='red'>{</font>
<a name='L37'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L38'>
<a name='L39'>  <a href='../S/68.html#L34' title='Defined at 34 in kernel/fork.c.'>verify_area</a> (to, <b>sizeof</b> (<b>struct</b> sigaction));  <i><font color='green'>// 验证to 处的内存是否足够。</font></i>
<a name='L40'>  <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &lt; <b>sizeof</b> (<b>struct</b> sigaction); <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L41'>    <font color='red'>{</font>
<a name='L42'>      <a href='../S/24.html#L44' title='Defined at 44 in include/asm/segment.h.'>put_fs_byte</a> (*from, to);  <i><font color='green'>// 复制到fs 段。一般是用户数据段。</font></i>
<a name='L43'>      from++;                   <i><font color='green'>// put_fs_byte()在include/asm/segment.h 中。</font></i>
<a name='L44'>      to++;
<a name='L45'>    <font color='red'>}</font>
<a name='L46'><font color='red'>}</font>
<a name='L47'>
<a name='L48'><i><font color='green'>// 把sigaction 数据从fs 数据段from 位置复制到to 处。</font></i>
<a name='L49'><b>static</b> <b>inline</b> <b>void</b>
<a name='L50'><a href='../S/75.html#L93' title='Refered from 93 in kernel/signal.c.'>get_new</a> (<b>char</b> *from, <b>char</b> *to)
<a name='L51'><font color='red'>{</font>
<a name='L52'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L53'>
<a name='L54'>  <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &lt; <b>sizeof</b> (<b>struct</b> sigaction); <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L55'>    *(to++) = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (from++);
<a name='L56'><font color='red'>}</font>
<a name='L57'>
<a name='L58'><i><font color='green'>// signal()系统调用。类似于sigaction()。为指定的信号安装新的信号句柄(信号处理程序)。</font></i>
<a name='L59'><i><font color='green'>// 信号句柄可以是用户指定的函数,也可以是SIG_DFL(默认句柄)或SIG_IGN(忽略)。</font></i>
<a name='L60'><i><font color='green'>// 参数signum --指定的信号;handler -- 指定的句柄;restorer –原程序当前执行的地址位置。</font></i>
<a name='L61'><i><font color='green'>// 函数返回原信号句柄。</font></i>
<a name='L62'><b>int</b>
<a name='L63'><a href='../R/681.html' title='Multiple refered from 2 places.'>sys_signal</a> (<b>int</b> signum, <b>long</b> handler, <b>long</b> restorer)
<a name='L64'><font color='red'>{</font>
<a name='L65'>  <b>struct</b> sigaction tmp;
<a name='L66'>
<a name='L67'>  <b>if</b> (signum &lt; 1 || signum &gt; 32 || signum == <a href='../S/39.html#L22' title='Defined at 22 in include/signal.h.'>SIGKILL</a>)   <i><font color='green'>// 信号值要在(1-32)范围内,</font></i>
<a name='L68'>    <b>return</b> -1;                  <i><font color='green'>// 并且不得是SIGKILL。</font></i>
<a name='L69'>  tmp.sa_handler = (<b>void</b> (*)(<b>int</b>)) handler;     <i><font color='green'>// 指定的信号处理句柄。</font></i>
<a name='L70'>  tmp.sa_mask = 0;              <i><font color='green'>// 执行时的信号屏蔽码。</font></i>
<a name='L71'>  tmp.sa_flags = <a href='../S/39.html#L41' title='Defined at 41 in include/signal.h.'>SA_ONESHOT</a> | <a href='../S/39.html#L40' title='Defined at 40 in include/signal.h.'>SA_NOMASK</a>;        <i><font color='green'>// 该句柄只使用1 次后就恢复到默认值,</font></i>
<a name='L72'><i><font color='green'>// 并允许信号在自己的处理句柄中收到。</font></i>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -