Files
oldlinux-website/Book-Lite/code-list/html/P8-6.html
2024-02-19 01:11:57 -05:00

2924 lines
106 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<meta name=Generator content="Microsoft Word 14 (filtered)">
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
{font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
{font-family:方正小标宋简体;}
@font-face
{font-family:"\@黑体";
panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"\@方正小标宋简体";}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
h1
{mso-style-link:"标题 1 Char";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:7.2pt;
text-align:center;
text-indent:-7.2pt;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
h2
{mso-style-link:"标题 2 Char";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
text-indent:0cm;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
h3
{mso-style-link:"标题 3 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:0cm;
page-break-after:avoid;
font-size:14.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
h4
{mso-style-link:"标题 4 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:28.8pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-28.8pt;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
h5
{mso-style-link:"标题 5 Char";
margin-top:14.0pt;
margin-right:0cm;
margin-bottom:14.5pt;
margin-left:36.0pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-36.0pt;
line-height:156%;
page-break-after:avoid;
font-size:14.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
h6
{mso-style-link:"标题 6 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
margin-left:43.2pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-43.2pt;
line-height:133%;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
p.MsoHeading7, li.MsoHeading7, div.MsoHeading7
{mso-style-link:"标题 7 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
margin-left:50.4pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-50.4pt;
line-height:133%;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.MsoHeading8, li.MsoHeading8, div.MsoHeading8
{mso-style-link:"标题 8 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
margin-left:57.6pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-72.0pt;
line-height:133%;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Arial","sans-serif";}
p.MsoHeading9, li.MsoHeading9, div.MsoHeading9
{mso-style-link:"标题 9 Char";
margin-top:12.0pt;
margin-right:0cm;
margin-bottom:3.2pt;
margin-left:64.8pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-79.2pt;
line-height:133%;
page-break-after:avoid;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.MsoIndex1, li.MsoIndex1, div.MsoIndex1
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:10.5pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex2, li.MsoIndex2, div.MsoIndex2
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex3, li.MsoIndex3, div.MsoIndex3
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:31.5pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex4, li.MsoIndex4, div.MsoIndex4
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:42.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex5, li.MsoIndex5, div.MsoIndex5
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:52.5pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex6, li.MsoIndex6, div.MsoIndex6
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:63.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex7, li.MsoIndex7, div.MsoIndex7
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:73.5pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex8, li.MsoIndex8, div.MsoIndex8
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:84.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndex9, li.MsoIndex9, div.MsoIndex9
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:94.5pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-10.5pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc1, li.MsoToc1, div.MsoToc1
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.MsoToc2, li.MsoToc2, div.MsoToc2
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc3, li.MsoToc3, div.MsoToc3
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:42.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc4, li.MsoToc4, div.MsoToc4
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:31.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc5, li.MsoToc5, div.MsoToc5
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:42.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc6, li.MsoToc6, div.MsoToc6
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:52.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc7, li.MsoToc7, div.MsoToc7
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:63.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc8, li.MsoToc8, div.MsoToc8
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:73.5pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoToc9, li.MsoToc9, div.MsoToc9
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:84.0pt;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
{mso-style-link:"脚注文本 Char";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoCommentText, li.MsoCommentText, div.MsoCommentText
{mso-style-link:"批注文字 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoHeader, li.MsoHeader, div.MsoHeader
{mso-style-link:"页眉 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
layout-grid-mode:char;
border:none;
padding:0cm;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoFooter, li.MsoFooter, div.MsoFooter
{mso-style-link:"页脚 Char";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.MsoIndexHeading, li.MsoIndexHeading, div.MsoIndexHeading
{mso-style-name:"索引标题\,索引类目\,索引类目1\,索引类目2";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoCaption, li.MsoCaption, div.MsoCaption
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.MsoTof, li.MsoTof, div.MsoTof
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:42.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.MsoFootnoteReference
{vertical-align:super;}
p.MsoList, li.MsoList, div.MsoList
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoList2, li.MsoList2, div.MsoList2
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoList4, li.MsoList4, div.MsoList4
{margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.MsoDate, li.MsoDate, div.MsoDate
{mso-style-link:"日期 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:5.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
{mso-style-name:"超链接\,超级链接";
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;}
p
{mso-style-name:"普通\(网站\)\,普通 \(Web\)\,普通 \(Web\)1\,普通 \(Web\)2\,普通 \(Web\)3";
margin-right:0cm;
margin-left:0cm;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
pre
{mso-style-name:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3";
mso-style-link:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
tt
{font-family:;}
p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject
{mso-style-link:"批注主题 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
{mso-style-link:"批注框文本 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.1, li.1, div.1
{mso-style-name:1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.a, li.a, div.a
{mso-style-name:;
mso-style-link:"代码程序 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:;}
span.Char
{mso-style-name:"代码程序 Char";
mso-style-link:;
font-family:;}
p.a0, li.a0, div.a0
{mso-style-name:;
mso-style-link:"图说明 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char0
{mso-style-name:"图说明 Char";
mso-style-link:;
font-family:;}
p.0, li.0, div.0
{mso-style-name:0;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.10, li.10, div.10
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.11, li.11, div.11
{mso-style-name:1;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
font-family:;
font-weight:bold;}
p.a1, li.a1, div.a1
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3CharChar, li.3CharChar, div.3CharChar
{mso-style-name:"图中文字3 Char Char";
mso-style-link:"图中文字3 Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
span.3CharCharChar
{mso-style-name:"图中文字3 Char Char Char";
mso-style-link:"图中文字3 Char Char";
font-family:;}
p.post, li.post, div.post
{mso-style-name:post;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3, li.3, div.3
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.3CharChar1CharCharChar
{mso-style-name:"图中文字3 Char Char1 Char Char Char";
font-family:;}
span.3CharChar1CharChar
{mso-style-name:"图中文字3 Char Char1 Char Char";
font-family:;}
p.5Char, li.5Char, div.5Char
{mso-style-name:"图中文字5号 Char";
mso-style-link:"图中文字5号 Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.5CharChar
{mso-style-name:"图中文字5号 Char Char";
mso-style-link:"图中文字5号 Char";
font-family:;}
p.5CharChar0, li.5CharChar0, div.5CharChar0
{mso-style-name:"图中文字小5号 Char Char";
mso-style-link:"图中文字小5号 Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
span.5CharCharChar
{mso-style-name:"图中文字小5号 Char Char Char";
mso-style-link:"图中文字小5号 Char Char";
font-family:;}
p.5Char0, li.5Char0, div.5Char0
{mso-style-name:"图中文字小5号 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.5, li.5, div.5
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.2, li.2, div.2
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:;}
p.20, li.20, div.20
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.21, li.21, div.21
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3CharCharCharCharChar, li.3CharCharCharCharChar, div.3CharCharCharCharChar
{mso-style-name:"图中文字3 Char Char Char Char Char";
mso-style-link:"图中文字3 Char Char Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
span.3CharCharCharCharCharChar
{mso-style-name:"图中文字3 Char Char Char Char Char Char";
mso-style-link:"图中文字3 Char Char Char Char Char";
font-family:;}
p.a2, li.a2, div.a2
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.110, li.110, div.110
{mso-style-name:"样式 标题 1 + 居中1";
margin-right:0cm;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
span.1Char
{mso-style-name:"标题 1 Char";
mso-style-link:"标题 1";
font-weight:bold;}
p.22, li.22, div.22
{mso-style-name:"样式 列表 2 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.23, li.23, div.23
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.50, li.50, div.50
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.111, li.111, div.111
{mso-style-name:11;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.12, li.12, div.12
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:;}
p.13, li.13, div.13
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.01, li.01, div.01
{mso-style-name:01;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.112, li.112, div.112
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.113, li.113, div.113
{mso-style-name:11;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
font-family:;
font-weight:bold;}
p.14, li.14, div.14
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3Char1, li.3Char1, div.3Char1
{mso-style-name:"图中文字3 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.post1, li.post1, div.post1
{mso-style-name:post1;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.31, li.31, div.31
{mso-style-name:31;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5Char1, li.5Char1, div.5Char1
{mso-style-name:"图中文字5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5CharChar1, li.5CharChar1, div.5CharChar1
{mso-style-name:"图中文字小5号 Char Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.5Char10, li.5Char10, div.5Char10
{mso-style-name:"图中文字小5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.51, li.51, div.51
{mso-style-name:51;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.120, li.120, div.120
{mso-style-name:12;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.02, li.02, div.02
{mso-style-name:02;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.121, li.121, div.121
{mso-style-name:12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.122, li.122, div.122
{mso-style-name:12;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
font-family:;
font-weight:bold;}
p.3Char2, li.3Char2, div.3Char2
{mso-style-name:"图中文字3 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.post2, li.post2, div.post2
{mso-style-name:post2;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.32, li.32, div.32
{mso-style-name:32;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5Char2, li.5Char2, div.5Char2
{mso-style-name:"图中文字小5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.52, li.52, div.52
{mso-style-name:52;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.3CharCharCharChar, li.3CharCharCharChar, div.3CharCharCharChar
{mso-style-name:"图中文字3 Char Char Char Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.130, li.130, div.130
{mso-style-name:13;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.30, li.30, div.30
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:;}
p.03, li.03, div.03
{mso-style-name:03;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.131, li.131, div.131
{mso-style-name:13;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:18.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.132, li.132, div.132
{mso-style-name:13;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
font-size:22.0pt;
font-family:;
font-weight:bold;}
p.33, li.33, div.33
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.3Char3, li.3Char3, div.3Char3
{mso-style-name:"图中文字3 Char3";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
p.post3, li.post3, div.post3
{mso-style-name:post3;
margin:0cm;
margin-bottom:.0001pt;
text-align:right;
line-height:11.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.330, li.330, div.330
{mso-style-name:33;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5Char20, li.5Char20, div.5Char20
{mso-style-name:"图中文字5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.5CharChar2, li.5CharChar2, div.5CharChar2
{mso-style-name:"图中文字小5号 Char Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.5Char3, li.5Char3, div.5Char3
{mso-style-name:"图中文字小5号 Char3";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.53, li.53, div.53
{mso-style-name:53;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.3Char, li.3Char, div.3Char
{mso-style-name:"图中文字3 Char";
mso-style-link:"图中文字3 Char Char5";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:9.0pt;
font-size:8.0pt;
font-family:"Times New Roman","serif";}
span.3CharChar5
{mso-style-name:"图中文字3 Char Char5";
mso-style-link:"图中文字3 Char";
font-family:;}
p.54, li.54, div.54
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
line-height:9.0pt;
text-autospace:ideograph-numeric;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.24, li.24, div.24
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.15, li.15, div.15
{mso-style-name:"样式 标题 1 + 居中";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.25, li.25, div.25
{mso-style-name:"样式 标题 2 + 行距\: 单倍行距";
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:28.9pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-28.9pt;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
span.2Char
{mso-style-name:"标题 2 Char";
mso-style-link:"标题 2";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.34, li.34, div.34
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.35, li.35, div.35
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.4, li.4, div.4
{mso-style-name:4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.40, li.40, div.40
{mso-style-name:4;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.0pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.41, li.41, div.41
{mso-style-name:4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.55, li.55, div.55
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.56, li.56, div.56
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.57, li.57, div.57
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.6, li.6, div.6
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.60, li.60, div.60
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.61, li.61, div.61
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.7, li.7, div.7
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.70, li.70, div.70
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.71, li.71, div.71
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.8, li.8, div.8
{mso-style-name:8;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.9, li.9, div.9
{mso-style-name:9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.90, li.90, div.90
{mso-style-name:9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.100, li.100, div.100
{mso-style-name:10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.101, li.101, div.101
{mso-style-name:10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.114, li.114, div.114
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.115, li.115, div.115
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.116, li.116, div.116
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.123, li.123, div.123
{mso-style-name:12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.124, li.124, div.124
{mso-style-name:12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.133, li.133, div.133
{mso-style-name:13;
mso-style-link:"图说明13 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.13Char
{mso-style-name:"图说明13 Char";
mso-style-link:13;
font-family:;}
p.134, li.134, div.134
{mso-style-name:13;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.26, li.26, div.26
{mso-style-name:2;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
p.36, li.36, div.36
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:14.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
span.3Char0
{mso-style-name:"标题 3 Char";
mso-style-link:"标题 3";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.16, li.16, div.16
{mso-style-name:1;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.17, li.17, div.17
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.42, li.42, div.42
{mso-style-name:4;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
span.4Char
{mso-style-name:"标题 4 Char";
mso-style-link:"标题 4";
font-family:"Arial","sans-serif";
font-weight:bold;}
p.a3, li.a3, div.a3
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.27, li.27, div.27
{mso-style-name:2;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:28.8pt;
text-align:justify;
text-justify:inter-ideograph;
text-indent:-28.8pt;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
p.a4, li.a4, div.a4
{mso-style-name:;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.18, li.18, div.18
{mso-style-name:1;
margin-top:7.8pt;
margin-right:0cm;
margin-bottom:7.8pt;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.19, li.19, div.19
{mso-style-name:1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.25pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.25pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.1a, li.1a, div.1a
{mso-style-name:1;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.25pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.25pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.37, li.37, div.37
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.62, li.62, div.62
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
layout-grid-mode:char;
font-size:7.5pt;
font-family:"Times New Roman","serif";}
p.a5, li.a5, div.a5
{mso-style-name:;
mso-style-link:"正文代码 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char1
{mso-style-name:"正文代码 Char";
mso-style-link:;
font-family:;}
p.43, li.43, div.43
{mso-style-name:"样式 标题 4 +";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:12.0pt;
font-family:"Arial","sans-serif";
font-weight:bold;}
p.140, li.140, div.140
{mso-style-name:14;
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.25pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.25pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.141, li.141, div.141
{mso-style-name:14;
mso-style-link:"图说明14 Char";
margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:21.25pt;
margin-bottom:.0001pt;
text-align:center;
text-indent:-21.25pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.14Char
{mso-style-name:"图说明14 Char";
mso-style-link:14;
font-family:;}
p.a6, li.a6, div.a6
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.a7, li.a7, div.a7
{mso-style-name:"样式 正文 +";
mso-style-link:"样式 正文 + Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char2
{mso-style-name:"样式 正文 + Char";
mso-style-link:"样式 正文 +";
font-family:"Times New Roman","serif";}
p.a8, li.a8, div.a8
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.a9, li.a9, div.a9
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.aa, li.aa, div.aa
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.ab, li.ab, div.ab
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:"Arial","sans-serif";}
p.ac, li.ac, div.ac
{mso-style-name:;
margin-top:0cm;
margin-right:21.0pt;
margin-bottom:0cm;
margin-left:21.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
border:none;
padding:0cm;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.125, li.125, div.125
{mso-style-name:"样式 标题 1 + 居中2";
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:0cm;
text-align:center;
page-break-after:avoid;
font-size:22.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.ad, li.ad, div.ad
{mso-style-name:"样式 题注 + 宋体 五号 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.1b, li.1b, div.1b
{mso-style-name:1;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:0cm;
line-height:240%;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;}
p.38, li.38, div.38
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:12.0pt;
font-family:;}
p.63, li.63, div.63
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:7.5pt;
font-family:"Times New Roman","serif";}
p.64, li.64, div.64
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
line-height:10.0pt;
layout-grid-mode:char;
font-size:7.5pt;
font-family:"Times New Roman","serif";}
p.65, li.65, div.65
{mso-style-name:6;
mso-style-link:"图中文字6号 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
line-height:10.0pt;
layout-grid-mode:char;
font-size:7.5pt;
font-family:"Times New Roman","serif";}
span.6Char
{mso-style-name:"图中文字6号 Char";
mso-style-link:6;
font-family:;}
p.ae, li.ae, div.ae
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.28, li.28, div.28
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.af, li.af, div.af
{mso-style-name:;
margin-top:6.0pt;
margin-right:0cm;
margin-bottom:0cm;
margin-left:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
page-break-after:avoid;
font-size:14.0pt;
font-family:;}
p.1c, li.1c, div.1c
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:16.0pt;
font-family:"Times New Roman","serif";}
p.af0, li.af0, div.af0
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.af1, li.af1, div.af1
{mso-style-name:"样式 题注 + 居中";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
p.ListTitle, li.ListTitle, div.ListTitle
{mso-style-name:ListTitle;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.FigureTitle, li.FigureTitle, div.FigureTitle
{mso-style-name:FigureTitle;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.TableTitle, li.TableTitle, div.TableTitle
{mso-style-name:TableTitle;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.ProgramTitle, li.ProgramTitle, div.ProgramTitle
{mso-style-name:ProgramTitle;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.0pt;
font-family:"Arial","sans-serif";}
p.RightText, li.RightText, div.RightText
{mso-style-name:RightText;
margin-top:0cm;
margin-right:21.0pt;
margin-bottom:0cm;
margin-left:42.0pt;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
border:none;
padding:0cm;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.af2, li.af2, div.af2
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.af3, li.af3, div.af3
{mso-style-name:;
mso-style-link:"关键词 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char3
{mso-style-name:"关键词 Char";
mso-style-link:;
font-family:;}
p.af4, li.af4, div.af4
{mso-style-name:;
mso-style-link:"文件名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char4
{mso-style-name:"文件名 Char";
mso-style-link:;
font-family:;}
p.af5, li.af5, div.af5
{mso-style-name:;
mso-style-link:"选项 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char5
{mso-style-name:"选项 Char";
mso-style-link:;
font-family:;}
p.af6, li.af6, div.af6
{mso-style-name:;
mso-style-link:"命令行 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char6
{mso-style-name:"命令行 Char";
mso-style-link:;
font-family:;}
p.af7, li.af7, div.af7
{mso-style-name:;
mso-style-link:"函数名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char7
{mso-style-name:"函数名 Char";
mso-style-link:;
font-family:;}
p.af8, li.af8, div.af8
{mso-style-name:;
mso-style-link:"寄存器名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char8
{mso-style-name:"寄存器名 Char";
mso-style-link:;
font-family:"Times New Roman","serif";}
p.af9, li.af9, div.af9
{mso-style-name:;
mso-style-link:"变量名 Char";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
span.Char9
{mso-style-name:"变量名 Char";
mso-style-link:;
font-family:;}
p.58, li.58, div.58
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.59, li.59, div.59
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:9.0pt;
font-family:"Times New Roman","serif";}
p.926, li.926, div.926
{mso-style-name:"样式 代码程序 + 左侧\: 9\.26 厘米";
margin:0cm;
margin-bottom:.0001pt;
layout-grid-mode:char;
font-size:10.0pt;
font-family:;}
span.5Char4
{mso-style-name:"标题 5 Char";
mso-style-link:"标题 5";
font-weight:bold;}
span.6Char0
{mso-style-name:"标题 6 Char";
mso-style-link:"标题 6";
font-family:"Arial","sans-serif";
font-weight:bold;}
span.7Char
{mso-style-name:"标题 7 Char";
mso-style-link:"标题 7";
font-weight:bold;}
span.8Char
{mso-style-name:"标题 8 Char";
mso-style-link:"标题 8";
font-family:"Arial","sans-serif";}
span.9Char
{mso-style-name:"标题 9 Char";
mso-style-link:"标题 9";
font-family:"Arial","sans-serif";}
span.Chara
{mso-style-name:"脚注文本 Char";
mso-style-link:;
font-family:;}
span.Charb
{mso-style-name:"批注文字 Char";
mso-style-link:;
font-family:;}
span.Charc
{mso-style-name:"页眉 Char";
mso-style-link:;
font-family:;}
span.Chard
{mso-style-name:"页脚 Char";
mso-style-link:;
font-family:;}
span.Chare
{mso-style-name:"日期 Char";
mso-style-link:;
font-family:;}
span.HTMLChar
{mso-style-name:"HTML 预设格式 Char\,HTML 预先格式化 Char\,HTML 预先格式化1 Char\,HTML 预先格式化2 Char\,HTML 预先格式化3 Char";
mso-style-link:"HTML 预设格式\,HTML 预先格式化\,HTML 预先格式化1\,HTML 预先格式化2\,HTML 预先格式化3";
font-family:;}
span.Charf
{mso-style-name:"批注主题 Char";
mso-style-link:;
font-family:;
font-weight:bold;}
span.Charf0
{mso-style-name:"批注框文本 Char";
mso-style-link:;
font-family:;}
.MsoChpDefault
{font-size:10.0pt;}
/* Page Definitions */
@page WordSection1
{size:595.3pt 841.9pt;
margin:72.0pt 54.0pt 72.0pt 54.0pt;
layout-grid:15.6pt;}
div.WordSection1
{page:WordSection1;}
/* List Definitions */
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style>
</head>
<body lang=ZH-CN link=blue vlink=purple style='text-justify-trim:punctuation'>
<div class=WordSection1 style='layout-grid:15.6pt'>
<p class=ab><a name="_Toc53320608"><span style='font-family:黑体'>程序</span><span
lang=EN-US>8-6 linux/kernel/signal.c</span></a></p>
<div class=a align=center style='text-align:center'><span lang=EN-US>
<hr size=4 width="100%" align=center>
</span></div>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>1</span></u> <b><i>/*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>2</span></u> <b><i>&nbsp;*&nbsp;
linux/kernel/signal.c</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>3</span></u> <b><i>&nbsp;*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>4</span></u> <b><i>&nbsp;*&nbsp;
(C) 1991&nbsp; Linus Torvalds</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>5</span></u> <b><i>&nbsp;*/</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>6</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>7</span></u>
#include &lt;linux/sched.h&gt;&nbsp; // </span>调度程序头文件,定义任务结构<span lang=EN-US>task_struct</span>、初始任务<span
lang=EN-US>0</span>的数据,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>8</span></u>
#include &lt;linux/kernel.h&gt; // </span>内核头文件。含有一些内核常用函数的原形定义。</p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>9</span></u>
#include &lt;asm/segment.h&gt;&nbsp; // </span>段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>10</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>11</span></u>
#include &lt;signal.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>信号头文件。定义信号符号常量,信号结构及信号操作函数原型。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>12</span></u>
#include &lt;errno.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>出错号头文件。定义出错号符号常量。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>13</span></u>&nbsp;&nbsp;
</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>获取当前任务信号屏蔽位图(屏蔽码或阻塞码)。<span
lang=EN-US>sgetmask</span>可分解为<span lang=EN-US>signal-get-mask</span>。以下类似。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>14</span></u> int
<u><span style='color:blue'>sys_sgetmask</span></u>()</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>15</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>16</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return <u><span style='color:blue'>current</span></u>-&gt;blocked;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>17</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>18</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>设置新的信号屏蔽位图。信号<span
lang=EN-US>SIGKILL</span><span lang=EN-US>SIGSTOP</span>不能被屏蔽。返回值是原信号屏蔽位图。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>19</span></u> int
<u><span style='color:blue'>sys_ssetmask</span></u>(int newmask)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>20</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>21</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int old=<u><span style='color:blue'>current</span></u>-&gt;blocked;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>22</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>23</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;blocked = newmask &amp;
~(1&lt;&lt;(<u><span style='color:blue'>SIGKILL</span></u>-1)) &amp;
~(1&lt;&lt;(<u><span style='color:blue'>SIGSTOP</span></u>-1));</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>24</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return old;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>25</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>26</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>检测并取得进程收到的但被屏蔽(阻塞)的信号。还未处理信号的位图将被放入<span
lang=EN-US>set</span>中。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>27</span></u> int
<u><span style='color:blue'>sys_sigpending</span></u>(<u><span
style='color:blue'>sigset_t</span></u> *set)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>28</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>29</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* fill in &quot;set&quot; with signals pending but blocked. */</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* </span>用还未处理并且被阻塞信号的位图填入<span
lang=EN-US>set</span>指针所指位置处<span lang=EN-US> */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先验证进程提供的用户存储空间应有<span
lang=EN-US>4</span>个字节。然后把还未处理并且被阻塞信号的位图填入</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // set</span>指针所指位置处。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>30</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>verify_area</span></u>(set,4);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>31</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>put_fs_long</span></u>(<u><span style='color:blue'>current</span></u>-&gt;blocked
&amp; <u><span style='color:blue'>current</span></u>-&gt;signal, (unsigned long
*)set);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>32</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
return 0;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>33</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>34</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>35</span></u> <b><i>/*
atomically swap in the new signal mask, and wait for a signal.</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>36</span></u> <b><i>&nbsp;*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>37</span></u> <b><i>&nbsp;*
we need to play some games with syscall restarting.&nbsp; We get help</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>38</span></u> <b><i>&nbsp;*
from the syscall library interface.&nbsp; Note that we need to coordinate</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>39</span></u> <b><i>&nbsp;*
the calling convention with the libc routine.</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>40</span></u> <b><i>&nbsp;*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>41</span></u> <b><i>&nbsp;*
&quot;set&quot; is just the sigmask as described in 1003.1-1988, 3.3.7.</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>42</span></u> <b><i>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
It is assumed that sigset_t can be passed as a 32 bit quantity.</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>43</span></u> <b><i>&nbsp;*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>44</span></u> <b><i>&nbsp;*
&quot;restart&quot; holds a restart indication.&nbsp; If it's non-zero, then we
</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>45</span></u> <b><i>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
install the old mask, and return normally.&nbsp; If it's zero, we store </i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>46</span></u> <b><i>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
the current mask in old_mask and block until a signal comes in.</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>47</span></u> <b><i>&nbsp;*/</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /* </span>自动地更换成新的信号屏蔽码,并等待信号的到来。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; *</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>我们需要对系统调用(<span
lang=EN-US>syscall</span>)做一些处理。我们会从系统调用库接口取得某些信息。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>注意,我们需要把调用规则与<span
lang=EN-US>libc</span>库中的子程序统一考虑。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * &quot;set&quot; </span>正是<span
lang=EN-US>POSIX</span>标准<span lang=EN-US>1003.1-1988</span><span lang=EN-US>3.3.7</span>节中所描述的信号屏蔽码<span lang=EN-US>sigmask</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>其中认为类型<span lang=EN-US>sigset_t</span>能够作为一个<span
lang=EN-US>32</span>位量传递。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * &quot;restart&quot;</span>中保持有重启指示标志。如果为非<span
lang=EN-US>0</span>值,那么我们就设置原来的屏蔽码,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>并且正常返回。如果它为<span lang=EN-US>0</span>,那么我们就把当前的屏蔽码保存在<span
lang=EN-US>oldmask</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>并且阻塞进程,直到收到任何一个信号为止。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>该系统调用临时把进程信号屏蔽码替换成参数中给定的<span
lang=EN-US>set</span>,然后挂起进程,直到收到一个</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>信号为止。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // restart</span>是一个被中断的系统调用重新启动标志。当第<span
lang=EN-US>1</span>次调用该系统调用时,它是<span lang=EN-US>0</span>。并且</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>在该函数中会把进程原来的阻塞码 <span
lang=EN-US>blocked</span>保存起来(<span lang=EN-US>old_mask</span>),并设置 <span
lang=EN-US>restart</span>为非<span lang=EN-US>0</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>值。因此当进程第<span
lang=EN-US>2</span>次调用该系统调用时,它就会恢复进程原来保存在<span lang=EN-US>old_mask</span>中的阻塞码。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>48</span></u> int
<u><span style='color:blue'>sys_sigsuspend</span></u>(int restart, unsigned
long old_mask, unsigned long set)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>49</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // pause()</span>系统调用将导致调用它的进程进入睡眠状态,直到收到一个信号。该信号或者会终止</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>进程的执行,或者导致进程去执行相应的信号捕获函数。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>50</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
extern int <u><span style='color:blue'>sys_pause</span></u>(void);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>51</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果<span lang=EN-US>restart</span>标志不为<span
lang=EN-US>0</span>,表示是重新让程序运行起来。于是恢复前面保存在<span lang=EN-US>old_mask</span>中的</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>原进程阻塞码。并返回码<span
lang=EN-US>-EINTR</span>(系统调用被信号中断)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>52</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
if (restart) {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>53</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* we're restarting */</i></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* </span>我们正在重新启动系统调用<span
lang=EN-US> */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>54</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;blocked = old_mask;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>55</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return -<u><span style='color:blue'>EINTR</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>56</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>否则表示<span lang=EN-US>restart</span>标志的值是<span
lang=EN-US>0</span>。表示第<span lang=EN-US>1</span>次调用。于是首先设置<span lang=EN-US>restart</span>标志(置为<span
lang=EN-US>1</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>保存进程当前阻塞码 <span
lang=EN-US>blocked </span><span lang=EN-US>old_mask</span>中,并把进程的阻塞码替换成 <span
lang=EN-US>set</span>。然后调用</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // pause()</span>让进程睡眠,等待信号的到来。当进程收到一个信号时,<span
lang=EN-US>pause() </span>就会返回,并且</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>进程会去执行信号处理函数,然后本调用返回 <span
lang=EN-US>-ERESTARTNOINTR </span>码退出。这个返回码说明</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>在处理完信号后要求返回到本系统调用中继续运行,即本系统调用不会被中断。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>57</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* we're not restarting.&nbsp; do the work */</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* </span>我们不是重新重新运行,那么就干活吧<span
lang=EN-US> */</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>58</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
*(&amp;restart) = 1;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>59</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
*(&amp;old_mask) = <u><span style='color:blue'>current</span></u>-&gt;blocked;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>60</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;blocked = set;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>61</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
(void) <u><span style='color:blue'>sys_pause</span></u>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><i>/* return
after a signal arrives */</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>62</span></u>&nbsp;&nbsp;&nbsp;&nbsp;
return -<u><span style='color:blue'>ERESTARTNOINTR</span></u>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* handle the signal, and come back */</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>63</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>64</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>复制<span lang=EN-US>sigaction</span>数据到<span
lang=EN-US>fs</span>数据段<span lang=EN-US>to</span>处。即从内核空间复制到用户(任务)数据段中。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>65</span></u>
static inline void <u><span style='color:blue'>save_old</span></u>(char *
from,char * to)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>66</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>67</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int i;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>68</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先验证<span lang=EN-US>to</span>处的内存空间是否足够大。然后把一个<span
lang=EN-US>sigaction</span>结构信息复制到<span lang=EN-US>fs</span>段(用户)</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>空间中。宏函数<span
lang=EN-US>put_fs_byte()</span><span lang=EN-US>include/asm/segment.h</span>中实现。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>69</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>verify_area</span></u>(to, sizeof(struct <u><span
style='color:blue'>sigaction</span></u>));</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>70</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (i=0 ; i&lt; sizeof(struct <u><span style='color:blue'>sigaction</span></u>)
; i++) {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>71</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u><span style='color:blue'>put_fs_byte</span></u>(*from,to);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>72</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
from++;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>73</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
to++;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>74</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>75</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>76</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>sigaction</span>数据从<span
lang=EN-US>fs</span>数据段<span lang=EN-US>from</span>位置复制到<span lang=EN-US>to</span>处。即从用户数据空间取到内核数据段中。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>77</span></u>
static inline void <u><span style='color:blue'>get_new</span></u>(char *
from,char * to)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>78</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>79</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int i;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>80</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>81</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
for (i=0 ; i&lt; sizeof(struct <u><span style='color:blue'>sigaction</span></u>)
; i++)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>82</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*(to++) = <u><span style='color:blue'>get_fs_byte</span></u>(from++);</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>83</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>84</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // signal()</span>系统调用。类似于<span
lang=EN-US>sigaction()</span>。为指定的信号安装新的信号句柄<span lang=EN-US>(</span>信号处理程序<span
lang=EN-US>)</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>信号句柄可以是用户指定的函数,也可以是<span
lang=EN-US>SIG_DFL</span>(默认句柄)或<span lang=EN-US>SIG_IGN</span>(忽略)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>参数<span lang=EN-US>signum
--</span>指定的信号;<span lang=EN-US>handler -- </span>指定的句柄;<span lang=EN-US>restorer
</span>恢复函数指针,该函数由</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // Libc </span>库提供。用于在信号处理程序结束后恢复系统调用返回时几个寄存器的原有值以及系统</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>调用的返回值,就好象系统调用没有执行过信号处理程序而直接返回到用户程序一样。
函数</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>返回原信号句柄。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>85</span></u> int
<u><span style='color:blue'>sys_signal</span></u>(int signum, long handler,
long restorer)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>86</span></u> {</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>87</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
struct <u><span style='color:blue'>sigaction</span></u> tmp;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>88</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先验证信号值在有效范围(<span
lang=EN-US>1--32</span>)内,并且不得是信号<span lang=EN-US>SIGKILL</span>(和<span
lang=EN-US>SIGSTOP</span>)。因为这</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>两个信号不能被进程捕获。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>89</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (signum&lt;1 || signum&gt;32 || signum==<u><span style='color:blue'>SIGKILL</span></u>
|| signum==<u><span style='color:blue'>SIGSTOP</span></u>)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>90</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return -<u><span style='color:blue'>EINVAL</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>然后根据提供的参数组建<span
lang=EN-US>sigaction</span>结构内容。<span lang=EN-US>sa_handler</span>是指定的信号处理句柄(函数)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // sa_mask</span>是执行信号处理句柄时的信号屏蔽码。<span
lang=EN-US>sa_flags</span>是执行时的一些标志组合。这里设定</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>该信号处理句柄只使用<span
lang=EN-US>1</span>次后就恢复到默认值,并允许信号在自己的处理句柄中收到。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>91</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tmp.sa_handler = (void (*)(int)) handler;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>92</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tmp.sa_mask = 0;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>93</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tmp.sa_flags = <u><span style='color:blue'>SA_ONESHOT</span></u> | <u><span
style='color:blue'>SA_NOMASK</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>94</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tmp.sa_restorer = (void (*)(void)) restorer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>保存恢复处理函数指针。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>接着取该信号原来的处理句柄,并设置该信号的<span
lang=EN-US>sigaction</span>结构。最后返回原信号句柄。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>95</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
handler = (long) <u><span style='color:blue'>current</span></u>-&gt;<u><span
style='color:blue'>sigaction</span></u>[signum-1].sa_handler;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>96</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>sigaction</span></u>[signum-1]
= tmp;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>97</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return handler;</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>98</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>99</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // sigaction()</span>系统调用。改变进程在收到一个信号时的操作。<span
lang=EN-US>signum</span>是除了<span lang=EN-US>SIGKILL</span>以外的</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>任何信号。<span lang=EN-US>[</span>如果新操作(<span
lang=EN-US>action</span>)不为空<span lang=EN-US> ]</span>则新操作被安装。如果 <span
lang=EN-US>oldaction</span>指针不为空,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>则原操作被保留到<span
lang=EN-US>oldaction</span>。成功则返回<span lang=EN-US>0</span>,否则为<span lang=EN-US>-EINVAL</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>100</span></u><span
lang=EN-US> int <u><span style='color:blue'>sys_sigaction</span></u>(int
signum, const struct <u><span style='color:blue'>sigaction</span></u> * action,</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>101</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;struct <u><span
style='color:blue'>sigaction</span></u> * oldaction)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>102</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>103</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct <u><span
style='color:blue'>sigaction</span></u> tmp;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>104</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先验证信号值在有效范围(<span
lang=EN-US>1--32</span>)内,并且不得是信号<span lang=EN-US>SIGKILL</span>(和<span
lang=EN-US>SIGSTOP</span>)。因为这</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>两个信号不能被进程捕获。</p>
<p class=a><u><span lang=EN-US style='color:blue'>105</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (signum&lt;1 ||
signum&gt;32 || signum==<u><span style='color:blue'>SIGKILL</span></u> ||
signum==<u><span style='color:blue'>SIGSTOP</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>106</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return -<u><span style='color:blue'>EINVAL</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>在信号的<span lang=EN-US>sigaction</span>结构中设置新的操作(动作)。如果<span
lang=EN-US>oldaction</span>指针不为空的话,则将</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>原操作指针保存到<span
lang=EN-US>oldaction</span>所指的位置。</p>
<p class=a><u><span lang=EN-US style='color:blue'>107</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = <u><span
style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>sigaction</span></u>[signum-1];</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>108</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>get_new</span></u>((char *) action,</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>109</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(char *) (signum-1+<u><span style='color:blue'>current</span></u>-&gt;<u><span
style='color:blue'>sigaction</span></u>));</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>110</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (oldaction)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>111</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>save_old</span></u>((char *) &amp;tmp,(char *)
oldaction);</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果允许信号在自己的信号句柄中收到,则令屏蔽码为<span
lang=EN-US>0</span>,否则设置屏蔽本信号。</p>
<p class=a><u><span lang=EN-US style='color:blue'>112</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>sigaction</span></u>[signum-1].sa_flags
&amp; <u><span style='color:blue'>SA_NOMASK</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>113</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>sigaction</span></u>[signum-1].sa_mask
= 0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>114</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>115</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>sigaction</span></u>[signum-1].sa_mask
|= (1&lt;&lt;(signum-1));</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>116</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>117</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>118</span></u><span
lang=EN-US> </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>119</span></u><span
lang=EN-US> <b><i>/*</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>120</span></u><span
lang=EN-US> <b><i>&nbsp;* Routine writes a core dump image in the current
directory.</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>121</span></u><span
lang=EN-US> <b><i>&nbsp;* Currently not implemented.</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>122</span></u><span
lang=EN-US> <b><i>&nbsp;*/</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /*</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>在当前目录中产生<span
lang=EN-US>core dump</span>映像文件的子程序。目前还没有实现。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>123</span></u><span
lang=EN-US> int <u><span style='color:blue'>core_dump</span></u>(long signr)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>124</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>125</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><i>/* We didn't do a dump */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>126</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>127</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>系统调用的中断处理程序中真正的信号预处理程序(在<span
lang=EN-US>kernel/sys_call.s,119</span>行)。这段</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>代码的主要作用是将信号处理句柄插入到用户程序堆栈中,并在本系统调用结束返回后立刻</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>执行信号句柄程序,然后继续执行用户的程序。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>函数的参数是进入系统调用处理程序<span
lang=EN-US>sys_call.s</span>开始,直到调用本函数(<span lang=EN-US>sys_call.s</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>125</span>行)前逐步压入堆栈的值。这些值包括(在<span
lang=EN-US>sys_call.s</span>中的代码行):</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // ① CPU</span>执行中断指令压入的用户栈地址<span
lang=EN-US>ss</span><span lang=EN-US>esp</span>、标志寄存器<span lang=EN-US>eflags</span>和返回地址<span
lang=EN-US>cs</span><span lang=EN-US>eip</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // ② </span><span lang=EN-US>85--91</span>行在刚进入<span
lang=EN-US>system_call</span>时压入栈的段寄存器<span lang=EN-US>ds</span><span
lang=EN-US>es</span><span lang=EN-US>fs</span>以及寄存器<span lang=EN-US>eax</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>orig_eax</span>)、<span
lang=EN-US>edx</span><span lang=EN-US>ecx</span><span lang=EN-US>ebx</span>的值;</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // ③ </span><span lang=EN-US>100</span>行调用<span
lang=EN-US>sys_call_table</span>后压入栈中的相应系统调用处理函数的返回值(<span lang=EN-US>eax</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>④ 第<span lang=EN-US>124</span>行压入栈中的当前处理的信号值(<span
lang=EN-US>signr</span>)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>128</span></u><span
lang=EN-US> int <u><span style='color:blue'>do_signal</span></u>(long
signr,long eax,long ebx, long ecx, long edx, long orig_eax,</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>129</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long fs, long es,
long ds,</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>130</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long eip, long cs,
long eflags,</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>131</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long *
esp, long ss)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>132</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>133</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long
sa_handler;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>134</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long old_eip=eip;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>135</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct <u><span
style='color:blue'>sigaction</span></u> * sa = <u><span style='color:blue'>current</span></u>-&gt;<u><span
style='color:blue'>sigaction</span></u> + signr - 1;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>136</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int longs;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
</span><span lang=EN-US>current-&gt;sigaction[signr-1]</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>137</span></u><span
lang=EN-US> </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>138</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long *
tmp_esp;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>139</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>以下是调试语句。当定义了<span
lang=EN-US>notdef</span>时会打印相关信息。</p>
<p class=a><u><span lang=EN-US style='color:blue'>140</span></u><span
lang=EN-US> #ifdef notdef</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>141</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>printk</span></u>(<i>&quot;pid: %d, signr: %x, eax=%d, oeax
= %d, int=%d\n&quot;</i>, </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>142</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;pid, signr, eax, orig_eax, </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>143</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
sa-&gt;sa_flags &amp; <u><span style='color:blue'>SA_INTERRUPT</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>144</span></u><span
lang=EN-US> #endif</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果不是系统调用而是其它中断执行过程中调用到本函数时,<span
lang=EN-US>&nbsp; roig_eax </span>值为<span lang=EN-US> -1</span>。 参见</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // sys_call.s </span><span
lang=EN-US>144</span>行 等语句。因此当 <span lang=EN-US>orig_eax</span>不等于<span
lang=EN-US> -1 </span>时,说明是在某个系统调用的</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>最后调用了本函数。在 <span
lang=EN-US>kernel/exit.c </span><span lang=EN-US>waitpid() </span>函数中,如果收到了<span
lang=EN-US>SIGCHLD </span>信号,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>或者在读管道函数<span
lang=EN-US>fs/pipe.c</span>中管道当前读数据但没有读到任何数据等情况下,进程收到</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>了任何一个非阻塞的信号,则都会以 <span
lang=EN-US>-ERESTARTSYS </span>返回值返回。它表示进程可以被中断,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>但是在继续执行后会重新启动系统调用。返回码<span
lang=EN-US>-ERESTARTNOINTR</span>说明在处理完信号后要求</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>返回到原系统调用中继续运行,即系统调用不会被中断。参见前面第<span
lang=EN-US>62</span>行。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>因此下面语句说明如果是在系统调用中调用的本函数,并且相应系统调用的返回码
<span lang=EN-US>eax</span>等于</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // -ERESTARTSYS</span><span
lang=EN-US> -ERESTARTNOINTR</span>时进行下面的处理(实际上还没有真正回到用户程序中)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>145</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((orig_eax !=
-1) &amp;&amp;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>146</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
((eax == -<u><span style='color:blue'>ERESTARTSYS</span></u>) || (eax == -<u><span
style='color:blue'>ERESTARTNOINTR</span></u>))) {</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果系统调用返回码是<span
lang=EN-US> -ERESTARTSYS</span>(重新启动系统调用),并且 <span lang=EN-US>sigaction </span>中含有标志</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // SA_INTERRUPT</span>(系统调用被信号中断后不重新启动系统调用)或者信号值小于<span
lang=EN-US> SIGCONT</span>或者</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>信号值大于<span lang=EN-US>SIGTTOU</span>(即信号不是<span
lang=EN-US>SIGCONT</span><span lang=EN-US>SIGSTOP</span><span lang=EN-US>SIGTSTP</span><span
lang=EN-US>SIGTTIN </span><span lang=EN-US>SIGTTOU</span>),则</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>修改系统调用的返回值为<span
lang=EN-US>eax = -EINTR</span>,即被信号中断的系统调用。</p>
<p class=a><u><span lang=EN-US style='color:blue'>147</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((eax == -<u><span style='color:blue'>ERESTARTSYS</span></u>) &amp;&amp;
((sa-&gt;sa_flags &amp; <u><span style='color:blue'>SA_INTERRUPT</span></u>) ||</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>148</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
signr &lt; <u><span style='color:blue'>SIGCONT</span></u> || signr &gt; <u><span
style='color:blue'>SIGTTOU</span></u>))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>149</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*(&amp;eax) = -<u><span style='color:blue'>EINTR</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>150</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
else {</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>否则就恢复进程寄存器<span
lang=EN-US>eax</span>在调用系统调用之前的值,并且把原程序指令指针回调<span lang=EN-US>2</span>字节。即</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>当返回用户程序时,让程序重新启动执行被信号中断的系统调用。</p>
<p class=a><u><span lang=EN-US style='color:blue'>151</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*(&amp;eax) = orig_eax;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>152</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*(&amp;eip) = old_eip -= 2;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>153</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>154</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果信号句柄为<span
lang=EN-US>SIG_IGN</span><span lang=EN-US>1</span>,默认忽略句柄)则不对信号进行处理而直接返回。</p>
<p class=a><u><span lang=EN-US style='color:blue'>155</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sa_handler =
(unsigned long) sa-&gt;sa_handler;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>156</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (sa_handler==1)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>157</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return(1);&nbsp;&nbsp; <b><i>/* Ignore, see if there are more signals... */</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果句柄为<span lang=EN-US>SIG_DFL</span><span
lang=EN-US>0</span>,默认处理),则根据具体的信号进行分别处理。</p>
<p class=a><u><span lang=EN-US style='color:blue'>158</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!sa_handler) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>159</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
switch (signr) {</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果信号是以下两个则也忽略之,并返回。</p>
<p class=a><u><span lang=EN-US style='color:blue'>160</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGCONT</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>161</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGCHLD</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>162</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return(1);&nbsp; <b><i>/* Ignore, ... */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>163</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果信号是以下<span
lang=EN-US>4</span>种信号之一,则把当前进程状态置为停止状态<span lang=EN-US>TASK_STOPPED</span>。若当前进程</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>父进程对<span lang=EN-US>SIGCHLD</span>信号的
<span lang=EN-US>sigaction</span>处理标志<span lang=EN-US> SA_NOCLDSTOP </span>(即当子进程停止执行或又继</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>续执行时不要产生<span
lang=EN-US>SIGCHLD</span>信号)没有置位,那么就给父进程发送<span lang=EN-US>SIGCHLD</span>信号。</p>
<p class=a><u><span lang=EN-US style='color:blue'>164</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;case <u><span style='color:blue'>SIGSTOP</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>165</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGTSTP</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>166</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGTTIN</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>167</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGTTOU</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>168</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>state</span></u>
= <u><span style='color:blue'>TASK_STOPPED</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>169</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;exit_code = signr;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>170</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (!(<u><span style='color:blue'>current</span></u>-&gt;p_pptr-&gt;<u><span
style='color:blue'>sigaction</span></u>[<u><span style='color:blue'>SIGCHLD</span></u>-1].sa_flags
&amp; </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>171</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>SA_NOCLDSTOP</span></u>))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>172</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>current</span></u>-&gt;p_pptr-&gt;signal |=
(1&lt;&lt;(<u><span style='color:blue'>SIGCHLD</span></u>-1));</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>173</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return(1);&nbsp; <b><i>/* Reschedule another event */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>174</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果信号是以下<span
lang=EN-US>6</span>种信号之一,那么若信号产生了<span lang=EN-US>core dump</span>,则以退出码为<span
lang=EN-US>signr|0x80</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>调用<span lang=EN-US>do_exit()</span>退出。否则退出码就是信号值。<span
lang=EN-US>do_exit()</span>的参数是返回码和程序提供的退出</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>状态信息。可作为<span
lang=EN-US>wait()</span><span lang=EN-US>waitpid()</span>函数的状态信息。参见<span
lang=EN-US>sys/wait.h</span>文件第<span lang=EN-US>13-18</span>行。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // wait()</span><span
lang=EN-US>waitpid()</span>利用这些宏就可以取得子进程的退出状态码或子进程终止的原因(信号)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>175</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGQUIT</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>176</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGILL</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>177</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGTRAP</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>178</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGIOT</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>179</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGFPE</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>180</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
case <u><span style='color:blue'>SIGSEGV</span></u>:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>181</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>core_dump</span></u>(signr))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>182</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>do_exit</span></u>(signr|0x80);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>183</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* fall through */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>184</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
default:</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>185</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>do_exit</span></u>(signr);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>186</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>187</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>188</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><i>/*</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>189</span></u><span
lang=EN-US> <b><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* OK,
we're invoking a handler </i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>190</span></u><span
lang=EN-US> <b><i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/* </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
* OK</span>,现在我们准备对信号句柄调用的设置</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
*/</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果该信号句柄只需被调用一次,则将该句柄置空。注意,该信号句柄在前面已经保存在</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // sa_handler</span>指针中。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>在系统调用进入内核时,用户程序返回地址(<span
lang=EN-US>eip</span><span lang=EN-US>cs</span>)被保存在内核态栈中。下面这段代</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>码修改内核态堆栈上用户调用系统调用时的代码指针
<span lang=EN-US>eip </span>为指向信号处理句柄,同时也将</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // sa_restorer</span><span
lang=EN-US>signr</span>、进程屏蔽码<span lang=EN-US>(</span>如果<span lang=EN-US>SA_NOMASK</span>没置位<span
lang=EN-US>)</span><span lang=EN-US>eax</span><span lang=EN-US>ecx</span><span
lang=EN-US>edx</span>作为参数以及</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>原调用系统调用的程序返回指针及标志寄存器值压入用户堆栈。
因此在本次系统调用中断</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>返回用户程序时会首先执行用户的信号句柄程序,然后再继续执行用户程序。</p>
<p class=a><u><span lang=EN-US style='color:blue'>191</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (sa-&gt;sa_flags
&amp; <u><span style='color:blue'>SA_ONESHOT</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>192</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
sa-&gt;sa_handler = <u><span style='color:blue'>NULL</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>将内核态栈上用户调用系统调用下一条代码指令指针<span
lang=EN-US>eip</span>指向该信号处理句柄。由于<span lang=EN-US>C</span>函数</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>是传值函数,因此给<span
lang=EN-US>eip</span>赋值时需要使用 <span lang=EN-US>&quot;*(&amp;eip)&quot; </span>的形式。另外,如果允许信号自己的</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>处理句柄收到信号自己,则也需要将进程的阻塞码压入堆栈。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>这里请注意,使用如下方式(第<span
lang=EN-US>193</span>行)对普通<span lang=EN-US>C</span>函数参数进行修改是不起作用的。因为当</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>函数返回时堆栈上的参数将会被调用者丢弃。这里之所以可以使用这种方式,是因为该函数</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>是从汇编程序中被调用的,并且在函数返回后汇编程序并没有把调用<span
lang=EN-US>do_signal()</span>时的所有</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>参数都丢弃。<span
lang=EN-US>eip</span>等仍然在堆栈中。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // sigaction</span>结构的<span
lang=EN-US>sa_mask</span>字段给出了在当前信号句柄(信号描述符)程序执行期间应该被</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>屏蔽的信号集。同时,引起本信号句柄执行的信号也会被屏蔽。
不过若<span lang=EN-US>sa_flags</span>中使用了</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // SA_NOMASK</span>标志,那么引起本信号句柄执行的信号将不会被屏蔽掉。如果允许信号自己的处</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>理句柄程序收到信号自己,则也需要将进程的信号阻塞码压入堆栈。</p>
<p class=a><u><span lang=EN-US style='color:blue'>193</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(&amp;eip) =
sa_handler;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>194</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; longs =
(sa-&gt;sa_flags &amp; <u><span style='color:blue'>SA_NOMASK</span></u>)?7:8;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>将原调用程序的用户堆栈指针向下扩展<span
lang=EN-US>7</span>(或<span lang=EN-US>8</span>)个长字(用来存放调用信号句柄的参数等),</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>并检查内存使用情况(例如如果内存超界则分配新页等)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>195</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(&amp;esp) -=
longs;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>196</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>verify_area</span></u>(esp,longs*4);</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>在用户堆栈中从下到上存放<span
lang=EN-US>sa_restorer</span>、信号<span lang=EN-US>signr</span>、屏蔽码<span
lang=EN-US>blocked</span>(如果<span lang=EN-US>SA_NOMASK</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>置位)、<span lang=EN-US>eax</span><span
lang=EN-US>ecx</span><span lang=EN-US>edx</span><span lang=EN-US>eflags</span>和用户程序原代码指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>197</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp_esp=esp;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>198</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>put_fs_long</span></u>((long) sa-&gt;sa_restorer,tmp_esp++);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>199</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>put_fs_long</span></u>(signr,tmp_esp++);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>200</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(!(sa-&gt;sa_flags &amp; <u><span style='color:blue'>SA_NOMASK</span></u>))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>201</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>put_fs_long</span></u>(<u><span style='color:blue'>current</span></u>-&gt;blocked,tmp_esp++);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>202</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>put_fs_long</span></u>(eax,tmp_esp++);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>203</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>put_fs_long</span></u>(ecx,tmp_esp++);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>204</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>put_fs_long</span></u>(edx,tmp_esp++);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>205</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>put_fs_long</span></u>(eflags,tmp_esp++);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>206</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>put_fs_long</span></u>(old_eip,tmp_esp++);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>207</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>current</span></u>-&gt;blocked |= sa-&gt;sa_mask; &nbsp;&nbsp;//
</span>进程阻塞码<span lang=EN-US>(</span>屏蔽码<span lang=EN-US>)</span>添上<span
lang=EN-US>sa_mask</span>中的码位。</p>
<p class=a><u><span lang=EN-US style='color:blue'>208</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* Continue, execute handler */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>209</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>210</span></u><span
lang=EN-US> </span></p>
<div class=a align=center style='text-align:center'><span lang=EN-US>
<hr size=4 width="100%" align=center>
</span></div>
<p class=MsoNormal><span lang=EN-US>&nbsp;</span></p>
</div>
</body>
</html>