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

4559 lines
210 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.5pt;
font-family:;}
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:;
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:;
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:;
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.5pt;
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.MsoToc1, li.MsoToc1, div.MsoToc1
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:;
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
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:;}
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:;}
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:;}
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:;}
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:;}
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:;}
p.MsoCommentText, li.MsoCommentText, div.MsoCommentText
{mso-style-link:"批注文字 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.5pt;
font-family:;}
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:;}
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:;}
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.5pt;
font-family:;}
p.MsoCaption, li.MsoCaption, div.MsoCaption
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.MsoList2, li.MsoList2, div.MsoList2
{margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:;}
p.MsoList4, li.MsoList4, div.MsoList4
{margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
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:;}
tt
{font-family:;}
p.MsoCommentSubject, li.MsoCommentSubject, div.MsoCommentSubject
{mso-style-link:"批注主题 Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.5pt;
font-family:;
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;
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:;
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.5pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
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:;}
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:;}
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.5pt;
font-family:;}
p.21, li.21, div.21
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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:;
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.5pt;
font-family:;}
p.23, li.23, div.23
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.50, li.50, div.50
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.01, li.01, div.01
{mso-style-name:01;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:;
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:;
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.5pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.5Char1, li.5Char1, div.5Char1
{mso-style-name:"图中文字5号 Char1";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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:;}
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:;}
p.51, li.51, div.51
{mso-style-name:51;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:;}
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.5pt;
font-family:;}
p.02, li.02, div.02
{mso-style-name:02;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:36.0pt;
font-family:;
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:;
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
p.52, li.52, div.52
{mso-style-name:52;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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:;
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:;
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.5pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.5Char20, li.5Char20, div.5Char20
{mso-style-name:"图中文字5号 Char2";
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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:;}
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:;}
p.53, li.53, div.53
{mso-style-name:53;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:9.0pt;
font-family:;}
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:;}
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:;}
p.24, li.24, div.24
{mso-style-name:2;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:22.0pt;
font-family:;
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:;
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.5pt;
font-family:;}
p.35, li.35, div.35
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.4, li.4, div.4
{mso-style-name:4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
font-family:;}
p.41, li.41, div.41
{mso-style-name:4;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.55, li.55, div.55
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.56, li.56, div.56
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.57, li.57, div.57
{mso-style-name:5;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.6, li.6, div.6
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.60, li.60, div.60
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.61, li.61, div.61
{mso-style-name:6;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.7, li.7, div.7
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.70, li.70, div.70
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.71, li.71, div.71
{mso-style-name:7;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.8, li.8, div.8
{mso-style-name:8;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.9, li.9, div.9
{mso-style-name:9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.90, li.90, div.90
{mso-style-name:9;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.100, li.100, div.100
{mso-style-name:10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.101, li.101, div.101
{mso-style-name:10;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.114, li.114, div.114
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.115, li.115, div.115
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.116, li.116, div.116
{mso-style-name:11;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.123, li.123, div.123
{mso-style-name:12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
p.124, li.124, div.124
{mso-style-name:12;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;
font-weight:bold;}
p.17, li.17, div.17
{mso-style-name:1;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;
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:;
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.5pt;
font-family:;}
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.5pt;
font-family:;}
p.37, li.37, div.37
{mso-style-name:3;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
font-family:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
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:;
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:;
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:;}
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:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
p.af0, li.af0, div.af0
{mso-style-name:;
margin:0cm;
margin-bottom:.0001pt;
text-align:center;
font-size:10.5pt;
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.5pt;
font-family:;}
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.5pt;
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.5pt;
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.5pt;
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.5pt;
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:;}
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:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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.5pt;
font-family:;}
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:;}
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:;}
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:;}
span.3CharChar1
{mso-style-name:"图中文字3 Char Char1";
font-family:;}
span.5CharCharChar0
{mso-style-name:"图中文字5号 Char Char Char";
font-family:;}
span.5CharCharChar1
{mso-style-name:"图中文字小5号 Char Char Char1";
font-family:;}
span.3CharChar3
{mso-style-name:"图中文字3 Char Char3";
font-family:;}
span.5CharChar10
{mso-style-name:"图中文字5号 Char Char1";
font-family:;}
span.3CharCharChar1
{mso-style-name:"图中文字3 Char Char Char1";
font-family:;}
span.3CharChar11
{mso-style-name:"图中文字3 Char Char11";
font-family:;}
span.3CharChar2
{mso-style-name:"图中文字3 Char Char2";
font-family:;}
span.5CharCharCharChar
{mso-style-name:"图中文字小5号 Char Char Char Char";
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="_Toc53320626"><span style='font-family:黑体'>程序</span><span
lang=EN-US>10-5 linux/kernel/chr_drv/tty_io.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/tty_io.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> <b><i>/*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>8</span></u> <b><i>&nbsp;*
'tty_io.c' gives an orthogonal feeling to tty's, be they consoles</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp; <u><span style='color:blue'>9</span></u> <b><i>&nbsp;*
or rs-channels. It also implements echoing, cooked mode etc.</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>10</span></u> <b><i>&nbsp;*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>11</span></u> <b><i>&nbsp;*
Kill-line thanks to John T Kohl, who also corrected VMIN = VTIME = 0.</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>12</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; * 'tty_io.c'</span><span
lang=EN-US>tty</span>终端一种非相关的感觉,不管它们是控制台还是串行终端。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; * </span>该程序同样实现了回显、规范<span
lang=EN-US>(</span><span lang=EN-US>)</span>模式等。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; *</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; * Kill-line</span>问题,要谢谢<span
lang=EN-US>John T Kohl</span>。他同时还纠正了当<span lang=EN-US> VMIN = VTIME = 0 </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'>13</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>14</span></u>
#include &lt;ctype.h&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>字符类型头文件。定义了一些有关字符类型判断和转换的宏。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>15</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'>16</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'>17</span></u>
#include &lt;unistd.h&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// unistd.h</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>alarm</span>)信号在信号位图中对应的比特屏蔽位。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>19</span></u>
#define <u><span style='color:blue'>ALRMMASK</span></u> (1&lt;&lt;(<u><span
style='color:blue'>SIGALRM</span></u>-1))</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>
#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;<u><span style='color:blue'>22</span></u>
#include &lt;linux/tty.h&gt;&nbsp;&nbsp;&nbsp; // tty</span>头文件,定义了有关<span
lang=EN-US>tty_io</span>,串行通信方面的参数、常数。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>23</span></u>
#include &lt;asm/segment.h&gt;&nbsp; // </span>段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>24</span></u>
#include &lt;asm/system.h&gt;&nbsp;&nbsp; // </span>系统头文件。定义设置或修改描述符<span
lang=EN-US>/</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;&nbsp;&nbsp; // </span>终止进程组(向进程组发送信号)。参数<span
lang=EN-US>pgrp</span>指定进程组号;<span lang=EN-US>sig</span>指定信号;<span lang=EN-US>priv</span>权限。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>即向指定进程组<span
lang=EN-US>pgrp</span>中的每个进程发送指定信号<span lang=EN-US>sig</span>。只要向一个进程发送成功最后就会</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>返回<span lang=EN-US>0</span>,否则如果没有找到指定进程组号<span
lang=EN-US>pgrp</span>的任何一个进程,则返回出错号<span lang=EN-US>-ESRCH</span>,若</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>找到进程组号是<span
lang=EN-US>pgrp</span>的进程,但是发送信号失败,则返回发送失败的错误码。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>26</span></u> int
<u><span style='color:blue'>kill_pg</span></u>(int pgrp, int sig, int priv);&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
kernel/exit.c</span><span lang=EN-US>171</span>行。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>判断一个进程组是否是孤儿进程。如果不是则返回<span
lang=EN-US>0</span>;如果是则返回<span lang=EN-US>1</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>27</span></u> int
<u><span style='color:blue'>is_orphaned_pgrp</span></u>(int pgrp);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
kernel/exit.c</span><span lang=EN-US>232</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;&nbsp;&nbsp; // </span>获取<span lang=EN-US>termios</span>结构中三个模式标志集之一,或者用于判断一个标志集是否有置位标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>29</span></u>
#define <u><span style='color:blue'>_L_FLAG</span></u>(tty,f)&nbsp; ((tty)-&gt;<u><span
style='color:blue'>termios</span></u>.c_lflag &amp; f)&nbsp;&nbsp;&nbsp; // </span>本地模式标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>30</span></u>
#define <u><span style='color:blue'>_I_FLAG</span></u>(tty,f)&nbsp; ((tty)-&gt;<u><span
style='color:blue'>termios</span></u>.c_iflag &amp; f)&nbsp;&nbsp;&nbsp; // </span>输入模式标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>31</span></u>
#define <u><span style='color:blue'>_O_FLAG</span></u>(tty,f)&nbsp; ((tty)-&gt;<u><span
style='color:blue'>termios</span></u>.c_oflag &amp; f)&nbsp;&nbsp;&nbsp; // </span>输出模式标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>32</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>termios</span>结构终端特殊(本地)模式标志集中的一个标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>33</span></u>
#define <u><span style='color:blue'>L_CANON</span></u>(tty)&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>_L_FLAG</span></u>((tty),<u><span style='color:blue'>ICANON</span></u>)&nbsp;&nbsp;&nbsp;
// </span>取规范模式标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>34</span></u>
#define <u><span style='color:blue'>L_ISIG</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_L_FLAG</span></u>((tty),<u><span style='color:
blue'>ISIG</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>取信号标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>35</span></u>
#define <u><span style='color:blue'>L_ECHO</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_L_FLAG</span></u>((tty),<u><span style='color:
blue'>ECHO</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>取回显字符标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>36</span></u>
#define <u><span style='color:blue'>L_ECHOE</span></u>(tty)&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>_L_FLAG</span></u>((tty),<u><span style='color:blue'>ECHOE</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;
// </span>规范模式时取回显擦出标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>37</span></u>
#define <u><span style='color:blue'>L_ECHOK</span></u>(tty)&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>_L_FLAG</span></u>((tty),<u><span style='color:blue'>ECHOK</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;
// </span>规范模式时取<span lang=EN-US>KILL</span>擦除当前行标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>38</span></u>
#define <u><span style='color:blue'>L_ECHOCTL</span></u>(tty)&nbsp; <u><span
style='color:blue'>_L_FLAG</span></u>((tty),<u><span style='color:blue'>ECHOCTL</span></u>)&nbsp;&nbsp;
// </span>取回显控制字符标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>39</span></u> #define
<u><span style='color:blue'>L_ECHOKE</span></u>(tty)&nbsp;&nbsp; <u><span
style='color:blue'>_L_FLAG</span></u>((tty),<u><span style='color:blue'>ECHOKE</span></u>)&nbsp;&nbsp;&nbsp;
// </span>规范模式时取<span lang=EN-US>KILL</span>擦除行并回显标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>40</span></u>
#define <u><span style='color:blue'>L_TOSTOP</span></u>(tty)&nbsp;&nbsp; <u><span
style='color:blue'>_L_FLAG</span></u>((tty),<u><span style='color:blue'>TOSTOP</span></u>)&nbsp;&nbsp;&nbsp;
// </span>对于后台输出发送<span lang=EN-US>SIGTTOU</span>信号。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>41</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>termios</span>结构输入模式标志集中的一个标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>42</span></u>
#define <u><span style='color:blue'>I_UCLC</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_I_FLAG</span></u>((tty),<u><span style='color:
blue'>IUCLC</span></u>)&nbsp;&nbsp;&nbsp;&nbsp; // </span>取大写到小写转换标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>43</span></u>
#define <u><span style='color:blue'>I_NLCR</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_I_FLAG</span></u>((tty),<u><span style='color:
blue'>INLCR</span></u>)&nbsp;&nbsp;&nbsp;&nbsp; // </span>取换行符<span lang=EN-US>NL</span>转回车符<span
lang=EN-US>CR</span>标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>44</span></u>
#define <u><span style='color:blue'>I_CRNL</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_I_FLAG</span></u>((tty),<u><span style='color:
blue'>ICRNL</span></u>)&nbsp;&nbsp;&nbsp;&nbsp; // </span>取回车符<span lang=EN-US>CR</span>转换行符<span
lang=EN-US>NL</span>标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>45</span></u>
#define <u><span style='color:blue'>I_NOCR</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_I_FLAG</span></u>((tty),<u><span style='color:
blue'>IGNCR</span></u>)&nbsp;&nbsp;&nbsp;&nbsp; // </span>取忽略回车符<span
lang=EN-US>CR</span>标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>46</span></u>
#define <u><span style='color:blue'>I_IXON</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_I_FLAG</span></u>((tty),<u><span style='color:
blue'>IXON</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>取输入控制流标志<span
lang=EN-US>XON</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>47</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>termios</span>结构输出模式标志集中的一个标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>48</span></u>
#define <u><span style='color:blue'>O_POST</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_O_FLAG</span></u>((tty),<u><span style='color:
blue'>OPOST</span></u>)&nbsp;&nbsp;&nbsp;&nbsp; // </span>取执行输出处理标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>49</span></u>
#define <u><span style='color:blue'>O_NLCR</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_O_FLAG</span></u>((tty),<u><span style='color:
blue'>ONLCR</span></u>)&nbsp;&nbsp;&nbsp;&nbsp; // </span>取换行符<span lang=EN-US>NL</span>转回车换行符<span
lang=EN-US>CR-NL</span>标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>50</span></u>
#define <u><span style='color:blue'>O_CRNL</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_O_FLAG</span></u>((tty),<u><span style='color:
blue'>OCRNL</span></u>)&nbsp;&nbsp;&nbsp;&nbsp; // </span>取回车符<span lang=EN-US>CR</span>转换行符<span
lang=EN-US>NL</span>标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>51</span></u>
#define <u><span style='color:blue'>O_NLRET</span></u>(tty)&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>_O_FLAG</span></u>((tty),<u><span style='color:blue'>ONLRET</span></u>)&nbsp;&nbsp;&nbsp;
// </span>取换行符<span lang=EN-US>NL</span>执行回车功能的标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>52</span></u>
#define <u><span style='color:blue'>O_LCUC</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>_O_FLAG</span></u>((tty),<u><span style='color:
blue'>OLCUC</span></u>)&nbsp;&nbsp;&nbsp;&nbsp; // </span>取小写转大写字符标志。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>53</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>termios</span>结构控制标志集中波特率。<span
lang=EN-US>CBAUD</span>是波特率屏蔽码(<span lang=EN-US>0000017</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>54</span></u>
#define <u><span style='color:blue'>C_SPEED</span></u>(tty)&nbsp;&nbsp;&nbsp;
((tty)-&gt;<u><span style='color:blue'>termios</span></u>.c_cflag &amp; <u><span
style='color:blue'>CBAUD</span></u>)</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>判断<span lang=EN-US>tty</span>终端是否已挂线(<span
lang=EN-US>hang up</span>),即其传输波特率是否为<span lang=EN-US>B0</span><span
lang=EN-US>0</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>55</span></u>
#define <u><span style='color:blue'>C_HUP</span></u>(tty)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(<u><span style='color:blue'>C_SPEED</span></u>((tty)) == <u><span
style='color:blue'>B0</span></u>)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>56</span></u> </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>
#ifndef <u><span style='color:blue'>MIN</span></u></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>58</span></u>
#define <u><span style='color:blue'>MIN</span></u>(a,b) ((a) &lt; (b) ? (a) :
(b))</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>59</span></u>
#endif</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>60</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>下面定义<span lang=EN-US>tty</span>终端使用的缓冲队列结构数组<span
lang=EN-US>tty_queues </span><span lang=EN-US>tty</span>终端表结构数组<span
lang=EN-US>tty_table</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // QUEUES</span><span
lang=EN-US>tty</span>终端使用的缓冲队列最大数量。伪终端分主从两种(<span lang=EN-US>master</span><span
lang=EN-US>slave</span>)。每个</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // tty</span>终端使用<span
lang=EN-US>3</span><span lang=EN-US>tty </span>缓冲队列,它们分别是用于缓冲键盘或串行输入的读队列<span
lang=EN-US> read_queue</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>用于缓冲屏幕或串行输出的写队列 <span
lang=EN-US>write_queue</span>,以及用于保存规范模式字符的辅助缓冲队列</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // secondary</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>61</span></u>
#define <u><span style='color:blue'>QUEUES</span></u>&nbsp; (3*(<u><span
style='color:blue'>MAX_CONSOLES</span></u>+<u><span style='color:blue'>NR_SERIALS</span></u>+2*<u><span
style='color:blue'>NR_PTYS</span></u>))&nbsp; // </span><span lang=EN-US>54</span>项。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>62</span></u>
static struct <u><span style='color:blue'>tty_queue</span></u> <u><span
style='color:blue'>tty_queues</span></u>[<u><span style='color:blue'>QUEUES</span></u>];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// tty</span>缓冲队列数组。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>63</span></u>
struct <u><span style='color:blue'>tty_struct</span></u> <u><span
style='color:blue'>tty_table</span></u>[256];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// tty</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>tty</span>终端所使用缓冲队列结构在<span lang=EN-US>tty_queues[]</span>数组中的起始项位置。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 8</span>个虚拟控制台终端占用<span
lang=EN-US>tty_queues[]</span>数组开头<span lang=EN-US>24</span>项(<span lang=EN-US>3
X MAX_CONSOLES</span><span lang=EN-US>0 -- 23</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>两个串行终端占用随后的<span
lang=EN-US>6</span>项(<span lang=EN-US>3 X NR_SERIALS</span><span lang=EN-US>24
-- 29</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 4</span>个主伪终端占用随后的<span
lang=EN-US>12</span>项(<span lang=EN-US>3 X NR_PTYS</span><span lang=EN-US>30
-- 41</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 4</span>个从伪终端占用随后的<span
lang=EN-US>12</span>项(<span lang=EN-US>3 X NR_PTYS</span><span lang=EN-US>42
-- 53</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>65</span></u>
#define <u><span style='color:blue'>con_queues</span></u> <u><span
style='color:blue'>tty_queues</span></u></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>66</span></u>
#define <u><span style='color:blue'>rs_queues</span></u> ((3*<u><span
style='color:blue'>MAX_CONSOLES</span></u>) + <u><span style='color:blue'>tty_queues</span></u>)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>67</span></u>
#define <u><span style='color:blue'>mpty_queues</span></u> ((3*(<u><span
style='color:blue'>MAX_CONSOLES</span></u>+<u><span style='color:blue'>NR_SERIALS</span></u>))
+ <u><span style='color:blue'>tty_queues</span></u>)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>68</span></u>
#define <u><span style='color:blue'>spty_queues</span></u> ((3*(<u><span
style='color:blue'>MAX_CONSOLES</span></u>+<u><span style='color:blue'>NR_SERIALS</span></u>+<u><span
style='color:blue'>NR_PTYS</span></u>)) + <u><span style='color:blue'>tty_queues</span></u>)</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>69</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>下面设定各种类型<span
lang=EN-US>tty</span>终端所使用的<span lang=EN-US>tty</span>结构在<span lang=EN-US>tty_table[]</span>数组中的起始项位置。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 8</span>个虚拟控制台终端可用<span
lang=EN-US>tty_table[]</span>数组开头<span lang=EN-US>64</span>项(<span lang=EN-US>0
-- 63</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>两个串行终端使用随后的<span
lang=EN-US>2</span>项(<span lang=EN-US>64 -- 65</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 4</span>个主伪终端使用从<span
lang=EN-US>128</span>开始的项,最多<span lang=EN-US>64</span>项(<span lang=EN-US>128 --
191</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 4</span>个从伪终端使用从<span
lang=EN-US>192</span>开始的项,最多<span lang=EN-US>64</span>项(<span lang=EN-US>192 --
255</span>)。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>70</span></u>
#define <u><span style='color:blue'>con_table</span></u> <u><span
style='color:blue'>tty_table</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>定义控制台终端<span lang=EN-US>tty</span>表符号常数。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>71</span></u>
#define <u><span style='color:blue'>rs_table</span></u> (64+<u><span
style='color:blue'>tty_table</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>串行终端<span lang=EN-US>tty</span>表。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>72</span></u>
#define <u><span style='color:blue'>mpty_table</span></u> (128+<u><span
style='color:blue'>tty_table</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>主伪终端<span lang=EN-US>tty</span>表。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>73</span></u>
#define <u><span style='color:blue'>spty_table</span></u> (192+<u><span
style='color:blue'>tty_table</span></u>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>从伪终端<span lang=EN-US>tty</span>表。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>74</span></u> </span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>75</span></u> int
<u><span style='color:blue'>fg_console</span></u> = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>当前前台控制台号(范围<span lang=EN-US>0--7</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;<u><span style='color:blue'>77</span></u> <b><i>/*</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>78</span></u> <b><i>&nbsp;*
these are the tables used by the machine code handlers.</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>79</span></u> <b><i>&nbsp;*
you can implement virtual consoles.</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>80</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>你可以实现虚拟控制台。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; */</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // tty</span>读写缓冲队列结构地址表。供<span
lang=EN-US>rs_io.s</span>程序使用,用于取得读写缓冲队列结构的地址。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>81</span></u>
struct <u><span style='color:blue'>tty_queue</span></u> * <u><span
style='color:blue'>table_list</span></u>[]={</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;
<u><span style='color:blue'>con_queues</span></u> + 0, <u><span
style='color:blue'>con_queues</span></u> + 1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>前台控制台读、写队列结构地址。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>83</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>rs_queues</span></u> + 0, <u><span
style='color:blue'>rs_queues</span></u> + 1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>串行终端<span lang=EN-US>1</span>读、写队列结构地址。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>84</span></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>rs_queues</span></u> + 3, <u><span
style='color:blue'>rs_queues</span></u> + 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>串行终端<span lang=EN-US>2</span>读、写队列结构地址。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>85</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'>86</span></u> </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>new_console
- </span>指定的新控制台号。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>87</span></u>
void <u><span style='color:blue'>change_console</span></u>(unsigned int
new_console)</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>如果参数指定的控制台已经在前台或者参数无效,则退出。否则设置当前前台控制台号,同</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>时更新<span lang=EN-US>table_list[]</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 (new_console == <u><span style='color:blue'>fg_console</span></u> ||
new_console &gt;= <u><span style='color:blue'>NR_CONSOLES</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;</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;
<u><span style='color:blue'>fg_console</span></u> = new_console;</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;
<u><span style='color:blue'>table_list</span></u>[0] = <u><span
style='color:blue'>con_queues</span></u> + 0 + <u><span style='color:blue'>fg_console</span></u>*3;</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;
<u><span style='color:blue'>table_list</span></u>[1] = <u><span
style='color:blue'>con_queues</span></u> + 1 + <u><span style='color:blue'>fg_console</span></u>*3;</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;
<u><span style='color:blue'>update_screen</span></u>();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// kernel/chr_drv/console.c</span><span lang=EN-US>936</span>行。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>95</span></u> }</span></p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>96</span></u> </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>queue
- </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>该进程。</p>
<p class=a><span lang=EN-US>&nbsp;<u><span style='color:blue'>97</span></u>
static void <u><span style='color:blue'>sleep_if_empty</span></u>(struct <u><span
style='color:blue'>tty_queue</span></u> * queue)</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>cli</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>100</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (!(<u><span
style='color:blue'>current</span></u>-&gt;signal &amp; ~current-&gt;blocked)
&amp;&amp; <u><span style='color:blue'>EMPTY</span></u>(queue))</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>interruptible_sleep_on</span></u>(&amp;queue-&gt;proc_list);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>102</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>sti</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>103</span></u><span
lang=EN-US> }</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>若队列缓冲区满则让进程进入可中断的睡眠状态。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>参数:<span lang=EN-US>queue
- </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> static void <u><span style='color:blue'>sleep_if_full</span></u>(struct
<u><span style='color:blue'>tty_queue</span></u> * queue)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>106</span></u><span
lang=EN-US> {</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>&lt;
128</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; if (!<u><span
style='color:blue'>FULL</span></u>(queue))</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;</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; <u><span
style='color:blue'>cli</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; while (!(<u><span
style='color:blue'>current</span></u>-&gt;signal &amp; ~current-&gt;blocked)
&amp;&amp; <u><span style='color:blue'>LEFT</span></u>(queue)&lt;128)</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'>interruptible_sleep_on</span></u>(&amp;queue-&gt;proc_list);</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; <u><span
style='color:blue'>sti</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>113</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>114</span></u><span
lang=EN-US> </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'>115</span></u><span
lang=EN-US> void <u><span style='color:blue'>wait_for_keypress</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>116</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>117</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>sleep_if_empty</span></u>(<u><span style='color:blue'>tty_table</span></u>[<u><span
style='color:blue'>fg_console</span></u>].secondary);</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> </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>termios</span>结构中设置的各种标志,将指定<span
lang=EN-US>tty</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>tty
- </span>指定终端的<span lang=EN-US>tty</span>结构指针。</p>
<p class=a><u><span lang=EN-US style='color:blue'>120</span></u><span
lang=EN-US> void <u><span style='color:blue'>copy_to_cooked</span></u>(struct <u><span
style='color:blue'>tty_struct</span></u> * tty)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>121</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>122</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signed char c;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>123</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先检查当前终端<span
lang=EN-US>tty</span>结构中缓冲队列指针是否有效。如果三个队列指针都是<span lang=EN-US>NULL</span>,则说明</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>内核<span lang=EN-US>tty</span>初始化函数有问题。</p>
<p class=a><u><span lang=EN-US style='color:blue'>124</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(tty-&gt;read_q
|| tty-&gt;write_q || tty-&gt;secondary)) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>printk</span></u>(<i>&quot;copy_to_cooked: missing
queues\n\r&quot;</i>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>126</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>127</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>termios</span>结构中的输入和本地标志,对从<span lang=EN-US>tty</span>读队列缓冲区中取出的每个</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>字符进行适当的处理,然后放入辅助队列<span
lang=EN-US>secondary</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>_POSIX_VDISABLE</span><span lang=EN-US>\0</span>),那么在对字符处理过程忠,若字符代码值等于</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // _POSIX_VDISABLE</span>的值时,表示禁止使用相应特殊控制字符的功能。</p>
<p class=a><u><span lang=EN-US style='color:blue'>128</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (1) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>EMPTY</span></u>(tty-&gt;read_q))</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
break;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>FULL</span></u>(tty-&gt;secondary))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>132</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;
break;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<u><span style='color:blue'>GETCH</span></u>(tty-&gt;read_q,c);&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;// </span>取一字符到<span lang=EN-US>c</span>,并前移尾指针。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果该字符是回车符<span
lang=EN-US>CR</span><span lang=EN-US>13</span>),那么若回车转换行标志<span lang=EN-US>CRNL</span>置位,则将字符转换为换行符</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // NL</span><span lang=EN-US>10</span>)。否则如果忽略回车标志<span
lang=EN-US>NOCR</span>置位,则忽略该字符,继续处理其他字符。如果字</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>符是换行符<span lang=EN-US>NL</span><span
lang=EN-US>10</span>),并且换行转回车标志<span lang=EN-US>NLCR</span>置位,则将其转换为回车符<span
lang=EN-US>CR</span><span lang=EN-US>13</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (c==13) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>I_CRNL</span></u>(tty))</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
c</span><span lang=EN-US>=10;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>137</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;
else if (<u><span style='color:blue'>I_NOCR</span></u>(tty))</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>139</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
} else if (c==10 &amp;&amp; <u><span style='color:blue'>I_NLCR</span></u>(tty))</span></p>
<p class=a><u><span
lang=EN-US style='color:blue'>140</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;
c</span><span lang=EN-US>=13;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果大写转小写输入标志<span
lang=EN-US>UCLC</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>I_UCLC</span></u>(tty))</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
c</span><span lang=EN-US>=<u><span style='color:blue'>tolower</span></u>(c);</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果本地模式标志集中规范模式标志<span
lang=EN-US>CANON </span>已置位,则对读取的字符进行以下处理。 首先,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果该字符是键盘终止控制字符<span
lang=EN-US>KILL(^U)</span>,则对已输入的当前行执行删除处理。删除一行字</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>符的循环过程如是:如果 <span
lang=EN-US>tty</span>辅助队列不空,并且取出的辅助队列中最后一个字符不是换行</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>NL</span><span
lang=EN-US>10</span>),并且该字符不是文件结束字符(<span lang=EN-US>^D</span>),则循环执行下列代码:</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果本地回显标志<span
lang=EN-US>ECHO </span>置位,那么:若字符是控制字符(值 <span lang=EN-US>&lt; 32</span>),则往<span
lang=EN-US>tty</span>写队列中放</p>
<p class=a><span lang=EN-US>&nbsp; &nbsp;&nbsp;// </span>入擦除控制字符<span
lang=EN-US>ERASE</span><span lang=EN-US>^H</span>)。然后再放入一个擦除字符<span
lang=EN-US>ERASE</span>,并且调用该<span lang=EN-US>tty</span>写函数,把</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>写队列中的所有字符输出到终端屏幕上。 另外,因为控制字符在放入写队列时需要用<span
lang=EN-US>2</span>个字</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>节表示(例如<span
lang=EN-US>^V</span>),因此要求特别对控制字符多放入一个<span lang=EN-US>ERASE</span>。最后将<span
lang=EN-US>tty</span>辅助队列头指针</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>后退<span lang=EN-US>1</span>字节。另外,如果定义了<span
lang=EN-US>_POSIX_VDISABLE</span><span lang=EN-US>\0</span>),那么在对字符处理过程忠,若字符</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>代码值等于 <span
lang=EN-US>_POSIX_VDISABLE</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;
if (<u><span style='color:blue'>L_CANON</span></u>(tty)) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>144</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'>KILL_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u>) &amp;&amp;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(c==<u><span style='color:blue'>KILL_CHAR</span></u>(tty))) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* deal with killing the input line */</i></b></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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while(!(<u><span style='color:blue'>EMPTY</span></u>(tty-&gt;secondary) ||</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(c=<u><span style='color:blue'>LAST</span></u>(tty-&gt;secondary))==10 ||</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
((<u><span style='color:blue'>EOF_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u>) &amp;&amp;</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;&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;
(c==<u><span style='color:blue'>EOF_CHAR</span></u>(tty))))) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>L_ECHO</span></u>(tty)) {&nbsp; &nbsp;// </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;&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 (c&lt;32)&nbsp;&nbsp;&nbsp; // </span>控制字符要删<span lang=EN-US>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;&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'>PUTCH</span></u>(127,tty-&gt;write_q);</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;&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'>PUTCH</span></u>(127,tty-&gt;write_q);</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;&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;
tty-&gt;<u><span style='color:blue'>write</span></u>(tty);</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;&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;
}</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;&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'>DEC</span></u>(tty-&gt;secondary-&gt;<u><span
style='color:blue'>head</span></u>);</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;&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><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&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;&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>ERASE</span><span lang=EN-US>^H</span>),那么:如果<span lang=EN-US>tty</span>的辅助队列为空,或者其最后一个</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>字符是换行符<span
lang=EN-US>NL(10)</span>,或者是文件结束符,则继续处理其他字符。如果本地回显标志<span lang=EN-US>ECHO</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>位,那么:若字符是控制字符(值<span
lang=EN-US>&lt; 32</span>),则往<span lang=EN-US>tty</span>的写队列中放入擦除字符<span
lang=EN-US>ERASE</span>。再放入</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>一个擦除字符<span
lang=EN-US>ERASE</span>,并且调用该<span lang=EN-US>tty</span>的写函数。最后将<span
lang=EN-US>tty</span>辅助队列头指针后退<span lang=EN-US>1</span>字节,继</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>续处理其他字符。同样地,如果定义了<span
lang=EN-US>_POSIX_VDISABLE</span><span lang=EN-US>\0</span>),那么在对字符处理过程忠,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>若字符代码值等于 <span
lang=EN-US>_POSIX_VDISABLE </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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((<u><span style='color:blue'>ERASE_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u>) &amp;&amp;</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;&nbsp;&nbsp;&nbsp;&nbsp;
(c==<u><span style='color:blue'>ERASE_CHAR</span></u>(tty))) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>163</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;
if (<u><span style='color:blue'>EMPTY</span></u>(tty-&gt;secondary) ||</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(c=<u><span style='color:blue'>LAST</span></u>(tty-&gt;secondary))==10 ||</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
((<u><span style='color:blue'>EOF_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u>) &amp;&amp;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(c==<u><span style='color:blue'>EOF_CHAR</span></u>(tty))))</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>L_ECHO</span></u>(tty)) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (c&lt;32)</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;&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'>PUTCH</span></u>(127,tty-&gt;write_q);</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'>PUTCH</span></u>(127,tty-&gt;write_q);</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tty-&gt;<u><span style='color:blue'>write</span></u>(tty);</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>174</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'>DEC</span></u>(tty-&gt;secondary-&gt;<u><span
style='color:blue'>head</span></u>);</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</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;
}</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果设置了<span lang=EN-US>IXON</span>标志,则使终端停止<span
lang=EN-US>/</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>STOP</span><span
lang=EN-US>^S</span>),则置<span lang=EN-US>tty </span>停止标志,让<span lang=EN-US>tty </span>暂停输出。同时丢弃该特殊控制字符(不放入</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>辅助队列中),并继续处理其他字符。如果字符是开始字符<span
lang=EN-US>START</span><span lang=EN-US>^Q</span>),则复位<span lang=EN-US>tty</span>停止</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>标志,恢复<span lang=EN-US>tty</span>输出。同时丢弃该控制字符,并继续处理其他字符。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>对于控制台来说,这里的<span
lang=EN-US>tty-&gt;write()</span><span lang=EN-US>console.c</span>中的<span
lang=EN-US>con_write()</span>函数。因此控制台将</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>由于发现<span lang=EN-US>stopped=1</span>而会立刻暂停在屏幕上显示新字符(<span
lang=EN-US>chr_drv/console.c</span>,第<span lang=EN-US>586</span>行)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>对于伪终端也是由于设置了终端<span
lang=EN-US>stopped</span>标志而会暂停写操作(<span lang=EN-US>chr_drv/pty.c</span>,第<span
lang=EN-US>24</span>行)。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>对于串行终端,也应该在发送终端过程中根据终端<span
lang=EN-US>stopped</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;if
(<u><span style='color:blue'>I_IXON</span></u>(tty)) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((<u><span style='color:blue'>STOP_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u>) &amp;&amp;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(c==<u><span style='color:blue'>STOP_CHAR</span></u>(tty))) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tty-&gt;stopped=1;</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;
tty-&gt;<u><span style='color:blue'>write</span></u>(tty);</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</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;
if ((<u><span style='color:blue'>START_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u>) &amp;&amp;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(c==<u><span style='color:blue'>START_CHAR</span></u>(tty))) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tty-&gt;stopped=0;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tty-&gt;<u><span style='color:blue'>write</span></u>(tty);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>189</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;
continue;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>190</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;
}</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;&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>ISIG</span>标志置位,表示终端键盘可以产生信号,则在收到控制字符<span lang=EN-US>INTR</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // QUIT</span><span lang=EN-US>SUSP
</span><span lang=EN-US>DSUSP </span>时,需要为进程产生相应的信号。 如果该字符是键盘中断符(<span
lang=EN-US>^C</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>则向当前进程之进程组中所有进程发送键盘中断信号<span
lang=EN-US>SIGINT</span>,并继续处理下一字符。 如果该</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>字符是退出符(<span
lang=EN-US>^\</span>),则向当前进程之进程组中所有进程发送键盘退出信号<span lang=EN-US>SIGQUIT</span>,并继续</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>处理下一字符。如果字符是暂停符(<span
lang=EN-US>^Z</span>),则向当前进程发送暂停信号<span lang=EN-US>SIGTSTP</span>。同样,若定</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>义了<span lang=EN-US>_POSIX_VDISABLE</span><span
lang=EN-US>\0</span>),那么在对字符处理过程忠,若字符代码值等于<span lang=EN-US>_POSIX_VDISABLE</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>的值时,表示禁止使用相应特殊控制字符的功能。以下不再啰嗦了
<span lang=EN-US>:-)</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;
if (<u><span style='color:blue'>L_ISIG</span></u>(tty)) {</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if ((<u><span style='color:blue'>INTR_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u>) &amp;&amp;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(c==<u><span style='color:blue'>INTR_CHAR</span></u>(tty))) {</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;&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'>kill_pg</span></u>(tty-&gt;pgrp, <u><span
style='color:blue'>SIGINT</span></u>, 1);</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;</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;&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'>198</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'>QUIT_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u>) &amp;&amp;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(c==<u><span style='color:blue'>QUIT_CHAR</span></u>(tty))) {</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;&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'>kill_pg</span></u>(tty-&gt;pgrp, <u><span
style='color:blue'>SIGQUIT</span></u>, 1);</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;</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;&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'>203</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'>SUSPEND_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u>) &amp;&amp;</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(c==<u><span style='color:blue'>SUSPEND_CHAR</span></u>(tty))) {</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;&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'>is_orphaned_pgrp</span></u>(tty-&gt;pgrp))</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;&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'>kill_pg</span></u>(tty-&gt;pgrp, <u><span
style='color:blue'>SIGTSTP</span></u>, 1);</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
continue;</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;&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'>209</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><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果该字符是换行符<span
lang=EN-US>NL</span><span lang=EN-US>10</span>),或者是文件结束符<span lang=EN-US>EOF</span><span
lang=EN-US>4</span><span lang=EN-US>^D</span>),表示一行字符已处理完,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>则把辅助缓冲队列中当前含有字符行数值<span
lang=EN-US>secondary.data</span><span lang=EN-US>1</span>。如果在函数<span
lang=EN-US>tty_read()</span>中取</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>走一行字符,该值即会被减<span
lang=EN-US>1</span>,参见<span lang=EN-US>315</span>行。</p>
<p class=a><u><span lang=EN-US style='color:blue'>210</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (c==10 || (<u><span style='color:blue'>EOF_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u> &amp;&amp;</span></p>
<p class=a><u><span
lang=EN-US style='color:blue'>211</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;
c</span><span lang=EN-US>==<u><span style='color:blue'>EOF_CHAR</span></u>(tty)))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>212</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;
tty-&gt;secondary-&gt;data++;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果本地模式标志集中回显标志<span
lang=EN-US>ECHO</span>在置位状态,那么,如果字符是换行符<span lang=EN-US>NL</span><span
lang=EN-US>10</span>),则将</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>换行符<span lang=EN-US>NL</span><span
lang=EN-US>10</span>)和回车符<span lang=EN-US>CR</span><span lang=EN-US>13</span>)放入<span
lang=EN-US>tty</span>写队列缓冲区中;如果字符是控制字符(值<span lang=EN-US>&lt;32</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>并且回显控制字符标志<span
lang=EN-US>ECHOCTL</span>置位,则将字符<span lang=EN-US>'^'</span>和字符 <span
lang=EN-US>c+64 </span>放入<span lang=EN-US>tty</span>写队列中(也即会</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>显示<span lang=EN-US>^C</span><span
lang=EN-US>^H</span><span lang=EN-US>)</span>;否则将该字符直接放入<span lang=EN-US>tty</span>写缓冲队列中。最后调用该<span
lang=EN-US>tty</span>写操作函数。</p>
<p class=a><u><span lang=EN-US style='color:blue'>213</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>L_ECHO</span></u>(tty)) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>214</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 (c==10) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>215</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'>PUTCH</span></u>(10,tty-&gt;write_q);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>216</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'>PUTCH</span></u>(13,tty-&gt;write_q);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>217</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;
} else if (c&lt;32) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>218</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;if (<u><span style='color:blue'>L_ECHOCTL</span></u>(tty))
{</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>219</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'>PUTCH</span></u>(<i>'^'</i>,tty-&gt;write_q);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>220</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'>PUTCH</span></u>(c+64,tty-&gt;write_q);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>221</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;
}</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>222</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;
} else</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>223</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'>PUTCH</span></u>(c,tty-&gt;write_q);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>224</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;
tty-&gt;<u><span style='color:blue'>write</span></u>(tty);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>225</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><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>每一次循环末将处理过的字符放入辅助队列中。</p>
<p class=a><u><span lang=EN-US style='color:blue'>226</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'>PUTCH</span></u>(c,tty-&gt;secondary);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>227</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>最后在退出循环体后唤醒等待该辅助缓冲队列的进程(如果有的话)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>228</span></u><span
lang=EN-US>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<u><span
style='color:blue'>wake_up</span></u>(&amp;tty-&gt;secondary-&gt;proc_list);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>229</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>230</span></u><span
lang=EN-US> </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>231</span></u><span
lang=EN-US> <b><i>/*</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>232</span></u><span
lang=EN-US> <b><i>&nbsp;* Called when we need to send a SIGTTIN or SIGTTOU to
our process</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>233</span></u><span
lang=EN-US> <b><i>&nbsp;* group</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>234</span></u><span
lang=EN-US> <b><i>&nbsp;* </i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>235</span></u><span
lang=EN-US> <b><i>&nbsp;* We only request that a system call be restarted if
there was if the </i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>236</span></u><span
lang=EN-US> <b><i>&nbsp;* default signal handler is being used.&nbsp; The
reason for this is that if</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>237</span></u><span
lang=EN-US> <b><i>&nbsp;* a job is catching SIGTTIN or SIGTTOU, the signal
handler may not want </i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>238</span></u><span
lang=EN-US> <b><i>&nbsp;* the system call to be restarted blindly.&nbsp; If
there is no way to reset the</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>239</span></u><span
lang=EN-US> <b><i>&nbsp;* terminal pgrp back to the current pgrp (perhaps
because the controlling</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>240</span></u><span
lang=EN-US> <b><i>&nbsp;* tty has been released on logout), we don't want to be
in an infinite loop</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>241</span></u><span
lang=EN-US> <b><i>&nbsp;* while restarting the system call, and have it always
generate a SIGTTIN</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>242</span></u><span
lang=EN-US> <b><i>&nbsp;* or SIGTTOU.&nbsp; The default signal handler will
cause the process to stop</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>243</span></u><span
lang=EN-US> <b><i>&nbsp;* thus avoiding the infinite loop problem.&nbsp;
Presumably the job-control</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>244</span></u><span
lang=EN-US> <b><i>&nbsp;* cognizant parent will fix things up before
continuging its child process.</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>245</span></u><span
lang=EN-US> <b><i>&nbsp;*/</i></b></span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; /* </span>当需要发送信号<span
lang=EN-US>SIGTTIN </span><span lang=EN-US> SIGTTOU </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>在进程使用默认信号处理句柄情况下,我们仅要求一个系统调用被重新启动,如果</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>有系统调用因本信号而被中断。这样做的原因是,如果一个作业正在捕获<span
lang=EN-US>SIGTTIN</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span><span
lang=EN-US> SIGTTOU</span>信号,那么相应信号句柄并不会希望系统调用被盲目地重新启动。如果</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>没有其他方法把终端的<span
lang=EN-US>pgrp</span>复位到当前<span lang=EN-US>pgrp</span>(例如可能由于在<span
lang=EN-US>logout</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> SIGTTIN </span><span lang=EN-US> SIGTTOU </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>把问题搞定。</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>向使用终端的进程组中所有进程发送信号。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>在后台进程组中的一个进程访问控制终端时,该函数用于向后台进程组中的所有进程发送</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // SIGTTIN</span><span
lang=EN-US>SIGTTOU</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'>246</span></u><span
lang=EN-US> int <u><span style='color:blue'>tty_signal</span></u>(int sig,
struct <u><span style='color:blue'>tty_struct</span></u> *tty)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>247</span></u><span
lang=EN-US> {</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>232</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>sig</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>248</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>is_orphaned_pgrp</span></u>(<u><span style='color:blue'>current</span></u>-&gt;pgrp))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>249</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'>EIO</span></u>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* don't stop an orphaned pgrp */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>250</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (void) <u><span
style='color:blue'>kill_pg</span></u>(<u><span style='color:blue'>current</span></u>-&gt;pgrp,sig,1);&nbsp;&nbsp;&nbsp;
// </span>发送信号<span lang=EN-US>sig</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>sig</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'>251</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((<u><span
style='color:blue'>current</span></u>-&gt;blocked &amp; (1&lt;&lt;(sig-1))) ||</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>252</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
((int) <u><span style='color:blue'>current</span></u>-&gt;<u><span
style='color:blue'>sigaction</span></u>[sig-1].sa_handler == 1)) </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>253</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'>EIO</span></u>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* Our signal will be ignored */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>254</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (<u><span
style='color:blue'>current</span></u>-&gt;<u><span style='color:blue'>sigaction</span></u>[sig-1].sa_handler)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>255</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'>EINTR</span></u>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<b><i>/* We _will_ be interrupted :-) */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>256</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'>257</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'>ERESTARTSYS</span></u>;&nbsp;&nbsp;&nbsp; <b><i>/*
We _will_ be interrupted :-) */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>258</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;
<b><i>/* (but restart after we continue) */</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>259</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>260</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; //// tty</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>channel
- </span>子设备号;<span lang=EN-US>buf </span>用户缓冲区指针;<span lang=EN-US>nr - </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'>261</span></u><span
lang=EN-US> int <u><span style='color:blue'>tty_read</span></u>(unsigned
channel, char * <u><span style='color:blue'>buf</span></u>, int nr)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>262</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>263</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct <u><span
style='color:blue'>tty_struct</span></u> * tty;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>264</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct <u><span
style='color:blue'>tty_struct</span></u> * other_tty = <u><span
style='color:blue'>NULL</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>265</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char c, * b=<u><span
style='color:blue'>buf</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>266</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int minimum,<u><span
style='color:blue'>time</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>267</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先判断参数有效性并取终端的<span
lang=EN-US>tty</span>结构指针。如果<span lang=EN-US>tty</span>终端的三个缓冲队列指针都是<span
lang=EN-US>NULL</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>则返回<span lang=EN-US>EIO</span>出错信息。如果<span
lang=EN-US>tty</span>终端是一个伪终端,则再取得另一个对应伪终端的<span lang=EN-US>tty</span>结构</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // other_tty</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>268</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (channel &gt;
255)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>269</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'>EIO</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>270</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tty = <u><span
style='color:blue'>TTY_TABLE</span></u>(channel);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>271</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(!(tty-&gt;write_q || tty-&gt;read_q || tty-&gt;secondary))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>272</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'>EIO</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果当前进程使用的是这里正在处理的<span
lang=EN-US>tty</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>SIGTTIN</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'>273</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((<u><span
style='color:blue'>current</span></u>-&gt;tty == channel) &amp;&amp;
(tty-&gt;pgrp != <u><span style='color:blue'>current</span></u>-&gt;pgrp)) </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>274</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'>tty_signal</span></u>(<u><span
style='color:blue'>SIGTTIN</span></u>, tty));</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果当前终端是伪终端,那么对应的另一个伪终端就是<span
lang=EN-US>other_tty</span>。若这里<span lang=EN-US>tty</span>是主伪终端,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>那么<span lang=EN-US>other_tty</span>就是对应的从伪终端,反之也然。</p>
<p class=a><u><span lang=EN-US style='color:blue'>275</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (channel &amp;
0x80)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>276</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
other_tty = <u><span style='color:blue'>tty_table</span></u> + (channel ^
0x40);</span></p>
<p class=a><span lang=EN-US>&nbsp;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>然后根据<span lang=EN-US>
VTIME </span><span lang=EN-US>VMIN </span>对应的控制字符数组值设置读字符操作超时定时值<span
lang=EN-US>time</span>和最少需</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>要读取的字符个数<span
lang=EN-US>minimum</span>。在非规范模式下,这两个是超时定时值。<span lang=EN-US>VMIN</span>表示为了满足读</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>操作而需要读取的最少字符个数。<span
lang=EN-US>VTIME</span>是一个<span lang=EN-US>1/10</span>秒计数计时值。</p>
<p class=a><u><span lang=EN-US style='color:blue'>277</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>time</span></u> = 10L*tty-&gt;<u><span
style='color:blue'>termios</span></u>.c_cc[<u><span style='color:blue'>VTIME</span></u>];&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;// </span>设置读操作超时定时值。</p>
<p class=a><u><span lang=EN-US style='color:blue'>278</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minimum = tty-&gt;<u><span
style='color:blue'>termios</span></u>.c_cc[<u><span style='color:blue'>VMIN</span></u>];&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>tty</span>终端处于规范模式,则设置最小要读取字符数<span
lang=EN-US>minimum </span>等于进程欲读字符数<span lang=EN-US>nr</span>。同</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>时把进程读取<span
lang=EN-US>nr</span>字符的超时时间值设置为极大值(不会超时)。否则说明终端处于非规范模</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>式下,若此时设置了最少读取字符数<span
lang=EN-US>minimum</span>,则先临时设置进城读超时定时值为无限大,以</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>让进程先读取辅助队列中已有字符。如果读到的字符数不足
<span lang=EN-US>minimum </span>的话,后面代码会根据</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>指定的超时值<span
lang=EN-US>time </span>来设置进程的读超时值 <span lang=EN-US>timeout</span>,并会等待读取其余字符。参见<span
lang=EN-US>328</span>行。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>若此时没有设置最少读取字符数<span
lang=EN-US>minimum</span>(为<span lang=EN-US>0</span>),则将其设置为进程欲读字符数<span
lang=EN-US>nr</span>,并且如</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>果设置了超时定时值<span
lang=EN-US>time</span>的话,就把进程读字符超时定时值<span lang=EN-US>timeout</span>设置为系统当前时间值</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; //&nbsp; + </span>指定的超时值<span
lang=EN-US>time</span>,同时复位<span lang=EN-US>time</span>。 另外,如果以上设置的最少读取字符数<span
lang=EN-US>minimum</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>于进程欲读取的字符数<span
lang=EN-US>nr</span>,则让<span lang=EN-US>minimum=nr</span>。即对于规范模式下的读取操作,它不受<span
lang=EN-US>VTIME</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>VMIN</span>对应控制字符值的约束和控制,它们仅在非规范模式(生模式)操作中起作用。</p>
<p class=a><u><span lang=EN-US style='color:blue'>279</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>L_CANON</span></u>(tty)) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>280</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
minimum = nr;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>281</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;timeout = 0xffffffff;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>282</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'>time</span></u> = 0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>283</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (minimum)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>284</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;timeout = 0xffffffff;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>285</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'>286</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
minimum = nr;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>287</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>time</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>288</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;timeout = <u><span style='color:blue'>time</span></u>
+ <u><span style='color:blue'>jiffies</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>289</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'>time</span></u> = 0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>290</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'>291</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (minimum&gt;nr)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>292</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
minimum = nr;&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;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>现在我们开始从辅助队列中循环取出字符并放到用户缓冲区<span
lang=EN-US>buf </span>中。当欲读的字节数大于<span lang=EN-US>0</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>另一终端把写队列缓冲区中字符复制到当前伪终端读队列缓冲区中,并经行规程函数转换后</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>放入当前伪终端辅助队列中。</p>
<p class=a><u><span lang=EN-US style='color:blue'>293</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (nr&gt;0) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>294</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (other_tty)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>295</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;
other_tty-&gt;<u><span style='color:blue'>write</span></u>(other_tty);</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果<span lang=EN-US>tty</span>辅助缓冲队列为空,或者设置了规范模式标志并且<span
lang=EN-US>tty</span>读队列缓冲区未满,并且辅</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>助队列中字符行数为<span
lang=EN-US>0</span>,那么,如果没有设置过进程读字符超时值(为<span lang=EN-US>0</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>断睡眠状态,返回后继续处理。由于规范模式时内核以行为单位为用户提供数据,因此在该</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>模式下辅助队列中必须起码有一行字符可供取用,即<span
lang=EN-US>secondary.data</span>起码是<span lang=EN-US>1</span>才行。</p>
<p class=a><u><span lang=EN-US style='color:blue'>296</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'>cli</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>297</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>EMPTY</span></u>(tty-&gt;secondary) || (<u><span
style='color:blue'>L_CANON</span></u>(tty) &amp;&amp;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>298</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;
!<u><span style='color:blue'>FULL</span></u>(tty-&gt;read_q) &amp;&amp;
!tty-&gt;secondary-&gt;data)) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>299</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;timeout ||</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>300</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;
(<u><span style='color:blue'>current</span></u>-&gt;signal &amp;
~current-&gt;blocked)) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>301</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'>sti</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>302</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;
break;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>303</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;
}</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>304</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'>IS_A_PTY_SLAVE</span></u>(channel) &amp;&amp; <u><span
style='color:blue'>C_HUP</span></u>(other_tty))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>305</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;
break;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>306</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'>interruptible_sleep_on</span></u>(&amp;tty-&gt;secondary-&gt;proc_list);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>307</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'>sti</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>308</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;
continue;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>309</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'>310</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'>sti</span></u>();</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>下面开始正式执行取字符操作。需读字符数<span
lang=EN-US>nr</span>依次递减,直到<span lang=EN-US>nr=0</span>或者辅助缓冲队列为空。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>在这个循环过程中,首先取辅助缓冲队列字符<span
lang=EN-US>c</span>,并且把缓冲队列尾指针<span lang=EN-US>tail</span>向右移动一个</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>字符位置。如果所取字符是文件结束符(<span
lang=EN-US>^D</span>)或者是换行符<span lang=EN-US>NL</span><span lang=EN-US>10</span>),则把辅助缓冲队列中</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>含有字符行数值减<span
lang=EN-US>1</span>。 如果该字符是文件结束符(<span lang=EN-US>^D</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>buf</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>NL</span><span lang=EN-US>10</span>),则也退出循环。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>除此之外,只要还没有取完欲读字符数<span
lang=EN-US>nr</span>并且辅助队列不空,就继续取队列中的字符。</p>
<p class=a><u><span lang=EN-US style='color:blue'>311</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
do {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>312</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'>GETCH</span></u>(tty-&gt;secondary,c);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>313</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'>EOF_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u> &amp;&amp;</span></p>
<p class=a><u><span
lang=EN-US style='color:blue'>314</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;
c</span><span lang=EN-US>==<u><span style='color:blue'>EOF_CHAR</span></u>(tty))
|| c==10)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>315</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;
tty-&gt;secondary-&gt;data--;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>316</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'>EOF_CHAR</span></u>(tty) != <u><span
style='color:blue'>_POSIX_VDISABLE</span></u> &amp;&amp;</span></p>
<p class=a><u><span
lang=EN-US style='color:blue'>317</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;
c</span><span lang=EN-US>==<u><span style='color:blue'>EOF_CHAR</span></u>(tty))
&amp;&amp; <u><span style='color:blue'>L_CANON</span></u>(tty))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>318</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;
break;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>319</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;
else {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>320</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'>put_fs_byte</span></u>(c,b++);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>321</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;
if (!--nr)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>322</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;
break;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>323</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;
}</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>324</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 (c==10 &amp;&amp; <u><span style='color:blue'>L_CANON</span></u>(tty))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>325</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;
break;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>326</span></u><span
lang=EN-US>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
while (nr&gt;0 &amp;&amp; !<u><span style='color:blue'>EMPTY</span></u>(tty-&gt;secondary));</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>执行到此,那么如果 <span
lang=EN-US>tty </span>终端处于规范模式下,说明我们可能读到了换行符或者遇到了文件</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>结束符。如果是处于非规范模式下,那么说明我们已经读取了<span
lang=EN-US>nr</span>个字符,或者辅助队列已经</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>被取空了。于是我们首先唤醒等待读队列的进程,然后看看是否设置过超时定时值<span
lang=EN-US>time</span>。如</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>果超时定时值<span
lang=EN-US>time</span>不为<span lang=EN-US>0</span>,我们就要求等待一定的时间让其他进程可以把字符写入读队列中。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>于是设置进程读超时定时值为系统当前时间<span
lang=EN-US>jiffies + </span>读超时值<span lang=EN-US>time</span>。当然,如果终端处于</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>规范模式,或者已经读取了<span
lang=EN-US>nr</span>个字符,我们就可以直接退出这个大循环了。</p>
<p class=a><u><span lang=EN-US style='color:blue'>327</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'>wake_up</span></u>(&amp;tty-&gt;read_q-&gt;proc_list);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>328</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (<u><span style='color:blue'>time</span></u>)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>329</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;timeout = <u><span
style='color:blue'>time</span></u>+<u><span style='color:blue'>jiffies</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>330</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
(<u><span style='color:blue'>L_CANON</span></u>(tty) || b-<u><span
style='color:blue'>buf</span></u> &gt;= minimum)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>331</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;
break;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>332</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>tty</span>字符循环操作结束,因此复位进程的读取超时定时值<span
lang=EN-US>timeout</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>(b-buf)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>333</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>current</span></u>-&gt;timeout = 0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>334</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((<u><span
style='color:blue'>current</span></u>-&gt;signal &amp; ~current-&gt;blocked)
&amp;&amp; !(b-<u><span style='color:blue'>buf</span></u>))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>335</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'>ERESTARTSYS</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>336</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (b-<u><span
style='color:blue'>buf</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>337</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>338</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; //// tty</span>写函数。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>把用户缓冲区中的字符放入<span
lang=EN-US>tty</span>写队列缓冲区中。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>参数:<span lang=EN-US>channel
- </span>子设备号;<span lang=EN-US>buf - </span>缓冲区指针;<span lang=EN-US>nr - </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'>339</span></u><span
lang=EN-US> int <u><span style='color:blue'>tty_write</span></u>(unsigned
channel, char * <u><span style='color:blue'>buf</span></u>, int nr)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>340</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>341</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static cr_flag=0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>342</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct <u><span
style='color:blue'>tty_struct</span></u> * tty;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>343</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char c, *b=<u><span
style='color:blue'>buf</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>344</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先判断参数有效性并取终端的<span
lang=EN-US>tty</span>结构指针。如果<span lang=EN-US>tty</span>终端的三个缓冲队列指针都是<span
lang=EN-US>NULL</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>则返回<span lang=EN-US>EIO</span>出错信息。</p>
<p class=a><u><span lang=EN-US style='color:blue'>345</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (channel &gt;
255)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>346</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'>EIO</span></u>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>347</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tty = <u><span
style='color:blue'>TTY_TABLE</span></u>(channel);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>348</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(!(tty-&gt;write_q || tty-&gt;read_q || tty-&gt;secondary))</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>349</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'>EIO</span></u>;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果若终端本地模式标志集中设置了<span
lang=EN-US>TOSTOP</span>,表示后台进程输出时需要发送信号<span lang=EN-US>SIGTTOU</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果当前进程使用的是这里正在处理的<span
lang=EN-US>tty</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>SIGTTOU</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'>350</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (<u><span
style='color:blue'>L_TOSTOP</span></u>(tty) &amp;&amp; </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>351</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(<u><span style='color:blue'>current</span></u>-&gt;tty == channel) &amp;&amp;
(tty-&gt;pgrp != <u><span style='color:blue'>current</span></u>-&gt;pgrp)) </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>352</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'>tty_signal</span></u>(<u><span
style='color:blue'>SIGTTOU</span></u>, tty));</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>现在我们开始从用户缓冲区<span
lang=EN-US>buf</span>中循环取出字符并放到写队列缓冲区中。当欲写字节数大于<span lang=EN-US>0</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>则执行以下循环操作。在循环过程中,如果此时<span
lang=EN-US>tty</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'>353</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (nr&gt;0) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>354</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'>sleep_if_full</span></u>(tty-&gt;write_q);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>355</span></u><span
lang=EN-US>&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;signal &amp;
~current-&gt;blocked)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>356</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;
break;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>当要写的字符数<span
lang=EN-US>nr</span>还大于<span lang=EN-US>0</span>并且<span lang=EN-US>tty</span>写队列缓冲区不满,则循环执行以下操作。首先从用户</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>缓冲区中取<span lang=EN-US>1</span>字节。如果终端输出模式标志集中的执行输出处理标志
<span lang=EN-US>OPOST </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'>357</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (nr&gt;0 &amp;&amp; !<u><span style='color:blue'>FULL</span></u>(tty-&gt;write_q))
{</span></p>
<p class=a><u><span
lang=EN-US style='color:blue'>358</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;
c</span><span lang=EN-US>=<u><span style='color:blue'>get_fs_byte</span></u>(b);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>359</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'>O_POST</span></u>(tty)) {</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果该字符是回车符<span
lang=EN-US>'\r'</span><span lang=EN-US>CR</span><span lang=EN-US>13</span>)并且回车符转换行符标志<span
lang=EN-US>OCRNL</span>置位,则将该字符换成</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>换行符<span lang=EN-US>'\n'</span><span
lang=EN-US>NL</span><span lang=EN-US>10</span>);否则如果该字符是换行符<span lang=EN-US>'\n'</span><span
lang=EN-US>NL</span><span lang=EN-US>10</span>)并且换行转回车功能标志</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // ONLRET</span>置位的话,则将该字符换成回车符<span
lang=EN-US>'\r'</span><span lang=EN-US>CR</span><span lang=EN-US>13</span>)。</p>
<p class=a><u><span lang=EN-US style='color:blue'>360</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;
if (c==<i>'\r'</i> &amp;&amp; <u><span style='color:blue'>O_CRNL</span></u>(tty))</span></p>
<p class=a><u><span
lang=EN-US style='color:blue'>361</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;
c</span><span lang=EN-US>=<i>'\n'</i>;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>362</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;
else if (c==<i>'\n'</i> &amp;&amp; <u><span style='color:blue'>O_NLRET</span></u>(tty))</span></p>
<p class=a><u><span
lang=EN-US style='color:blue'>363</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;
c</span><span lang=EN-US>=<i>'\r'</i>;</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果该字符是换行符<span
lang=EN-US>'\n' </span>并且回车标志<span lang=EN-US>cr_flag</span>没有置位,但换行转回车<span
lang=EN-US>-</span>换行标志<span lang=EN-US>ONLCR</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>置位的话,则将<span
lang=EN-US>cr_flag</span>标志置位,并将一回车符放入写队列中。然后继续处理下一个字符。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>如果小写转大写标志<span
lang=EN-US>OLCUC</span>置位的话,就将该字符转成大写字符。</p>
<p class=a><u><span lang=EN-US style='color:blue'>364</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;
if (c==<i>'\n'</i> &amp;&amp; !cr_flag &amp;&amp; <u><span style='color:blue'>O_NLCR</span></u>(tty))
{</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>365</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;
cr_flag = 1;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>366</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'>PUTCH</span></u>(13,tty-&gt;write_q);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>367</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;
continue;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>368</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;
}</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>369</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;
if (<u><span style='color:blue'>O_LCUC</span></u>(tty))&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'>370</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;
c</span><span lang=EN-US>=<u><span style='color:blue'>toupper</span></u>(c);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>371</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;
}</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>接着把用户数据缓冲指针<span
lang=EN-US>b</span>前移<span lang=EN-US>1</span>字节;欲写字节数减<span lang=EN-US>1</span>字节;复位<span
lang=EN-US>cr_flag</span>标志,并将该</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>字节放入<span lang=EN-US>tty</span>写队列中。</p>
<p class=a><u><span lang=EN-US style='color:blue'>372</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++; nr--;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>373</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;
cr_flag = 0;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>374</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'>PUTCH</span></u>(c,tty-&gt;write_q);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>375</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><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>若要求的字符全部写完,或者写队列已满,则程序退出循环。此时会调用对应<span
lang=EN-US>tty</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>tty</span>是控制台终端,那么<span
lang=EN-US>tty-&gt;write()</span>调用的是<span lang=EN-US>con_write()</span>;如果<span
lang=EN-US>tty</span>是串行终端,</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span><span lang=EN-US>tty-&gt;write()</span>调用的是<span
lang=EN-US>rs_write()</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'>376</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tty-&gt;<u><span style='color:blue'>write</span></u>(tty);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>377</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (nr&gt;0)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>378</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'>schedule</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>379</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'>380</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (b-<u><span
style='color:blue'>buf</span></u>);&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'>381</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>382</span></u><span
lang=EN-US> </span></p>
<p class=a><u><span lang=EN-US style='color:blue'>383</span></u><span
lang=EN-US> <b><i>/*</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>384</span></u><span
lang=EN-US> <b><i>&nbsp;* Jeh, sometimes I really like the 386.</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>385</span></u><span
lang=EN-US> <b><i>&nbsp;* This routine is called from an interrupt,</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>386</span></u><span
lang=EN-US> <b><i>&nbsp;* and there should be absolutely no problem</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>387</span></u><span
lang=EN-US> <b><i>&nbsp;* with sleeping even in an interrupt (I hope).</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>388</span></u><span
lang=EN-US> <b><i>&nbsp;* Of course, if somebody proves me wrong, I'll</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>389</span></u><span
lang=EN-US> <b><i>&nbsp;* hate intel for all time :-). We'll have to</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>390</span></u><span
lang=EN-US> <b><i>&nbsp;* be careful and see to reinstating the interrupt</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>391</span></u><span
lang=EN-US> <b><i>&nbsp;* chips before calling this, though.</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>392</span></u><span
lang=EN-US> <b><i>&nbsp;*</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>393</span></u><span
lang=EN-US> <b><i>&nbsp;* I don't think we sleep here under normal
circumstances</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>394</span></u><span
lang=EN-US> <b><i>&nbsp;* anyway, which is good, as the task sleeping might be</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>395</span></u><span
lang=EN-US> <b><i>&nbsp;* totally innocent.</i></b></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>396</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>386</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>intel</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp; * </span>一辈子<span
lang=EN-US style='font-family:Wingdings'>J</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>我不认为在通常环境下会处在这里睡眠,这样很好,因为任务睡眠</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></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; //// tty</span>中断处理调用函数<span
lang=EN-US> - </span>字符规范模式处理。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>参数:<span lang=EN-US>tty
- </span>指定的<span lang=EN-US>tty</span>终端号。</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>将指定<span lang=EN-US>tty</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>rs_io.s</span><span lang=EN-US>109</span>)和键盘中断(<span lang=EN-US>kerboard.S</span><span
lang=EN-US>69</span>)中被调用。</p>
<p class=a><u><span lang=EN-US style='color:blue'>397</span></u><span
lang=EN-US> void <u><span style='color:blue'>do_tty_interrupt</span></u>(int
tty)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>398</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>399</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>copy_to_cooked</span></u>(<u><span style='color:blue'>TTY_TABLE</span></u>(tty));</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>400</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>401</span></u><span
lang=EN-US> </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'>402</span></u><span
lang=EN-US> void <u><span style='color:blue'>chr_dev_init</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>403</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>404</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>405</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; //// tty</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'>406</span></u><span
lang=EN-US> void <u><span style='color:blue'>tty_init</span></u>(void)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>407</span></u><span
lang=EN-US> {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>408</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>409</span></u><span
lang=EN-US> </span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>首先初始化所有终端的缓冲队列结构,设置初值。对于串行终端的读<span
lang=EN-US>/</span>写缓冲队列,将它们的</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // data</span>字段设置为串行端口基地址值。串口<span
lang=EN-US>1</span><span lang=EN-US>0x3f8</span>,串口<span
lang=EN-US>2</span><span lang=EN-US>0x2f8</span>。然后先初步设置所有</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>终端的<span lang=EN-US>tty</span>结构。其中特殊字符数组<span
lang=EN-US>c_cc[]</span>设置的初值定义在<span lang=EN-US>include/linux/tty.h</span>文件中。</p>
<p class=a><u><span lang=EN-US style='color:blue'>410</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0 ; i &lt; <u><span
style='color:blue'>QUEUES</span></u> ; i++)</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>411</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'>tty_queues</span></u>[i] = (struct <u><span
style='color:blue'>tty_queue</span></u>) {0,0,0,0,<i>&quot;&quot;</i>};</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>412</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>rs_queues</span></u>[0] = (struct <u><span style='color:
blue'>tty_queue</span></u>) {0x3f8,0,0,0,<i>&quot;&quot;</i>};</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>413</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>rs_queues</span></u>[1] = (struct <u><span style='color:
blue'>tty_queue</span></u>) {0x3f8,0,0,0,<i>&quot;&quot;</i>};</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>414</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>rs_queues</span></u>[3] = (struct <u><span style='color:
blue'>tty_queue</span></u>) {0x2f8,0,0,0,<i>&quot;&quot;</i>};</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>415</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>rs_queues</span></u>[4] = (struct <u><span style='color:
blue'>tty_queue</span></u>) {0x2f8,0,0,0,<i>&quot;&quot;</i>};</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>416</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0 ; i&lt;256
; i++) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>417</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'>tty_table</span></u>[i] =&nbsp; (struct <u><span
style='color:blue'>tty_struct</span></u>) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>418</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;
{0, 0, 0, 0, 0, <u><span style='color:blue'>INIT_C_CC</span></u>},</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>419</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;
0, 0, 0, <u><span style='color:blue'>NULL</span></u>, <u><span
style='color:blue'>NULL</span></u>, <u><span style='color:blue'>NULL</span></u>,
<u><span style='color:blue'>NULL</span></u></span></p>
<p class=a><u><span lang=EN-US style='color:blue'>420</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'>421</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>console.c</span><span lang=EN-US>834</span>行)。把<span lang=EN-US>
con_init()</span>放在这里,是因为我们需要根</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>据显示卡类型和显示内存容量来确定系统中虚拟控制台的数量<span
lang=EN-US>NR_CONSOLES</span>。该值被用于随后</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>的控制台<span lang=EN-US>tty
</span>结构初始化循环中。对于控制台的<span lang=EN-US>tty </span>结构,<span lang=EN-US>425--430</span>行是<span
lang=EN-US>tty</span>结构中包含的</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // termios</span>结构字段。其中输入模式标志集被初始化为<span
lang=EN-US>ICRNL</span>标志;输出模式标志被初始化为含</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>有后处理标志<span
lang=EN-US>OPOST</span>和把<span lang=EN-US>NL</span>转换成<span lang=EN-US>CRNL</span>的标志<span
lang=EN-US>ONLCR</span>;本地模式标志集被初始化含有<span lang=EN-US>IXON</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // ICANON</span><span
lang=EN-US>ECHO</span><span lang=EN-US>ECHOCTL</span><span lang=EN-US>ECHOKE</span>标志;控制字符数组<span
lang=EN-US>c_cc[]</span>被设置含有初始值<span lang=EN-US>INIT_C_CC</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 435</span>行上初始化控制台终端<span
lang=EN-US>tty</span>结构中的读缓冲、写缓冲和辅助缓冲队列结构,它们分别指向</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // tty </span>缓冲队列结构数组<span
lang=EN-US>tty_table[]</span>中的相应结构项。参见<span lang=EN-US>61--73</span>行上的相关说明。</p>
<p class=a><u><span lang=EN-US style='color:blue'>422</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>con_init</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>423</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0 ; i&lt;<u><span
style='color:blue'>NR_CONSOLES</span></u> ; i++) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>424</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'>con_table</span></u>[i] = (struct <u><span
style='color:blue'>tty_struct</span></u>) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>425</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'>ICRNL</span></u>,&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<b><i>/*
change incoming CR to NL */</i></b>&nbsp;&nbsp; /* CR</span><span lang=EN-US>NL
*/</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>426</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'>OPOST</span></u>|<u><span style='color:blue'>ONLCR</span></u>,
&nbsp;<b><i>/* change outgoing NL to CRNL */</i></b> /*NL</span><span
lang=EN-US>CRNL*/</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>427</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;
0,&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;
// </span>控制模式标志集。</p>
<p class=a><u><span lang=EN-US style='color:blue'>428</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'>IXON</span></u> | <u><span style='color:blue'>ISIG</span></u>
| <u><span style='color:blue'>ICANON</span></u> | <u><span style='color:blue'>ECHO</span></u>
| <u><span style='color:blue'>ECHOCTL</span></u> | <u><span style='color:blue'>ECHOKE</span></u>,
// </span>本地标志集。</p>
<p class=a><u><span lang=EN-US style='color:blue'>429</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;
0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><i>/*
console termio */</i></b>&nbsp;&nbsp;&nbsp; // </span>线路规程,<span lang=EN-US>0
-- TTY</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>430</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'>INIT_C_CC</span></u>},&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>c_cc[]</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>431</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;
0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><i>/*
initial pgrp */</i></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span>所属初始进程组<span
lang=EN-US>pgrp</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>432</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;
0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><i>/*
initial session */</i></b>&nbsp;&nbsp; // </span>初始会话组<span lang=EN-US>session</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>433</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;
0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><i>/*
initial stopped */</i></b>&nbsp;&nbsp; // </span>初始停止标志<span lang=EN-US>stopped</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>434</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'>con_write</span></u>,&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><u><span lang=EN-US style='color:blue'>435</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'>con_queues</span></u>+0+i*3,<u><span
style='color:blue'>con_queues</span></u>+1+i*3,<u><span style='color:blue'>con_queues</span></u>+2+i*3</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>436</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'>437</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>tty</span>结构各字段。<span lang=EN-US>450</span>行初始化串行终端<span lang=EN-US>tty
</span>结构中的读<span lang=EN-US>/</span>写和辅助缓</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>冲队列结构,它们分别指向<span
lang=EN-US>tty </span>缓冲队列结构数组<span lang=EN-US>tty_table[]</span>中的相应结构项。参见<span
lang=EN-US>61--</span></p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // 73</span>行上的相关说明。</p>
<p class=a><u><span lang=EN-US style='color:blue'>438</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0 ; i&lt;<u><span
style='color:blue'>NR_SERIALS</span></u> ; i++) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>439</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'>rs_table</span></u>[i] = (struct <u><span
style='color:blue'>tty_struct</span></u>) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>440</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;
{0, <b><i>/* no translation */</i></b>&nbsp;&nbsp; // </span>输入模式标志集。<span
lang=EN-US>0</span>,无须转换。</p>
<p class=a><u><span lang=EN-US style='color:blue'>441</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;
0,&nbsp; <b><i>/* no translation */</i></b>&nbsp;&nbsp; // </span>输出模式标志集。<span
lang=EN-US>0</span>,无须转换。</p>
<p class=a><u><span lang=EN-US style='color:blue'>442</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'>B2400</span></u>
| <u><span style='color:blue'>CS8</span></u>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>控制模式标志集。<span lang=EN-US>2400bps</span><span lang=EN-US>8</span>位数据位。</p>
<p class=a><u><span lang=EN-US style='color:blue'>443</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;
0,&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><u><span lang=EN-US style='color:blue'>444</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;
0,&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>0 -- TTY</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>445</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'>INIT_C_CC</span></u>},&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'>446</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;
0,&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><u><span lang=EN-US style='color:blue'>447</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;
0,&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><u><span lang=EN-US style='color:blue'>448</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;
0,&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><u><span lang=EN-US style='color:blue'>449</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'>rs_write</span></u>,&nbsp;&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'>450</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'>rs_queues</span></u>+0+i*3,<u><span
style='color:blue'>rs_queues</span></u>+1+i*3,<u><span style='color:blue'>rs_queues</span></u>+2+i*3&nbsp;
// </span>三个队列。</p>
<p class=a><u><span lang=EN-US style='color:blue'>451</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'>452</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>tty</span>结构。伪终端是配对使用的,即一个主(<span lang=EN-US>master</span>)伪终端配</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>有一个从(<span lang=EN-US>slave</span>)伪终端。因此对它们都要进行初始化设置。在循环中,我们首先初始化</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>每个主伪终端的<span
lang=EN-US>tty</span>结构,然后再初始化其对应的从伪终端的<span lang=EN-US>tty</span>结构。</p>
<p class=a><u><span lang=EN-US style='color:blue'>453</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0 ; i&lt;<u><span
style='color:blue'>NR_PTYS</span></u> ; i++) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>454</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'>mpty_table</span></u>[i] = (struct <u><span
style='color:blue'>tty_struct</span></u>) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>455</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;
{0, <b><i>/* no translation */</i></b>&nbsp;&nbsp; // </span>输入模式标志集。<span
lang=EN-US>0</span>,无须转换。</p>
<p class=a><u><span lang=EN-US style='color:blue'>456</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;
0,&nbsp; <b><i>/* no translation */</i></b>&nbsp;&nbsp; // </span>输出模式标志集。<span
lang=EN-US>0</span>,无须转换。</p>
<p class=a><u><span lang=EN-US style='color:blue'>457</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'>B9600</span></u> | <u><span style='color:blue'>CS8</span></u>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>控制模式标志集。<span lang=EN-US>9600bps</span><span lang=EN-US>8</span>位数据位。</p>
<p class=a><u><span lang=EN-US style='color:blue'>458</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;
0,&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><u><span lang=EN-US style='color:blue'>459</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;
0,&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>0 -- TTY</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>460</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'>INIT_C_CC</span></u>},&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'>461</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;
0,&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><u><span lang=EN-US style='color:blue'>462</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;
0,&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><u><span lang=EN-US style='color:blue'>463</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;
0,&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><u><span lang=EN-US style='color:blue'>464</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'>mpty_write</span></u>,&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'>465</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'>mpty_queues</span></u>+0+i*3,<u><span
style='color:blue'>mpty_queues</span></u>+1+i*3,<u><span style='color:blue'>mpty_queues</span></u>+2+i*3</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>466</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'>467</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'>spty_table</span></u>[i] = (struct <u><span
style='color:blue'>tty_struct</span></u>) {</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>468</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;
{0, <b><i>/* no translation */</i></b>&nbsp;&nbsp; // </span>输入模式标志集。<span
lang=EN-US>0</span>,无须转换。</p>
<p class=a><u><span lang=EN-US style='color:blue'>469</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;
0,&nbsp; <b><i>/* no translation */</i></b>&nbsp;&nbsp; // </span>输出模式标志集。<span
lang=EN-US>0</span>,无须转换。</p>
<p class=a><u><span lang=EN-US style='color:blue'>470</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'>B9600</span></u> | <u><span style='color:blue'>CS8</span></u>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>控制模式标志集。<span lang=EN-US>9600bps</span><span lang=EN-US>8</span>位数据位。</p>
<p class=a><u><span lang=EN-US style='color:blue'>471</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'>IXON</span></u> | <u><span style='color:blue'>ISIG</span></u>
| <u><span style='color:blue'>ICANON</span></u>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// </span>本地模式标志集。</p>
<p class=a><u><span lang=EN-US style='color:blue'>472</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;
0,&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>0 -- TTY</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>473</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'>INIT_C_CC</span></u>},&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'>474</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;
0,&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><u><span lang=EN-US style='color:blue'>475</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;
0,&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><u><span lang=EN-US style='color:blue'>476</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;
0,&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><u><span lang=EN-US style='color:blue'>477</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'>spty_write</span></u>,&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'>478</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'>spty_queues</span></u>+0+i*3,<u><span
style='color:blue'>spty_queues</span></u>+1+i*3,<u><span style='color:blue'>spty_queues</span></u>+2+i*3</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>479</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'>480</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>1</span><span lang=EN-US>2</span><span lang=EN-US>serial.c</span><span
lang=EN-US>37</span>行),并显示系统含有的虚拟</p>
<p class=a><span lang=EN-US>&nbsp;&nbsp;&nbsp; // </span>控制台数<span lang=EN-US>NR_CONSOLES
</span>和伪终端数<span lang=EN-US>NR_PTYS</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>481</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>rs_init</span></u>();</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>482</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>printk</span></u>(<i>&quot;%d virtual consoles\n\r&quot;</i>,<u><span
style='color:blue'>NR_CONSOLES</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>483</span></u><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <u><span
style='color:blue'>printk</span></u>(<i>&quot;%d pty's\n\r&quot;</i>,<u><span
style='color:blue'>NR_PTYS</span></u>);</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>484</span></u><span
lang=EN-US> }</span></p>
<p class=a><u><span lang=EN-US style='color:blue'>485</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>
<p class=MsoNormal><span lang=EN-US>&nbsp;</span></p>
</div>
</body>
</html>