📄 75.html
字号:
<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'>/* [<][>]<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> <<a href='36.html'>linux/sched.h</a>> <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> <<a href='34.html'>linux/kernel.h</a>> <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L10'><font color='darkred'>#include</font> <<a href='24.html'>asm/segment.h</a>> <i><font color='green'>// 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</font></i>
<a name='L11'>
<a name='L12'><font color='darkred'>#include</font> <<a href='39.html'>signal.h</a>> <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->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->blocked;
<a name='L28'>
<a name='L29'> current->blocked = newmask & ~(1 << (<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> < <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> < <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 < 1 || signum > 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 + -