<html xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="utf-8"><meta name="generator" content="pdf2htmlEX"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><link rel="stylesheet" href="https://csdnimg.cn/release/download_crawler_static/css/base.min.css"><link rel="stylesheet" href="https://csdnimg.cn/release/download_crawler_static/css/fancy.min.css"><link rel="stylesheet" href="https://csdnimg.cn/release/download_crawler_static/7808779/raw.css"><script src="https://csdnimg.cn/release/download_crawler_static/js/compatibility.min.js"></script><script src="https://csdnimg.cn/release/download_crawler_static/js/pdf2htmlEX.min.js"></script><script>try{pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});}catch(e){}</script><title></title></head><body><div id="sidebar" style="display: none"><div id="outline"></div></div><div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/7808779/bg1.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">下载</div><div class="c x2 y2 w2 h3"><div class="t m0 x3 h4 y3 ff2 fs1 fc1 sc0 ls0 ws0">第<span class="ff3">1</span>章<span class="_ _0"> </span><span class="ff3">Linux</span>操作系统</div><div class="t m0 x4 h5 y4 ff4 fs2 fc0 sc0 ls0 ws1">1 9 9 1<span class="_"> </span><span class="ff5 ws0">年<span class="_ _1"></span><span class="ff4">3<span class="_ _1"></span></span>月,<span class="_ _2"></span><span class="ff4 ls1">Linus Benedict T<span class="_ _3"></span><span class="ls0 ws1">o r v a l d s<span class="_"> </span><span class="ff5 ls2 ws0">为他的<span class="_ _2"> </span><span class="ff4">A<span class="_ _4"></span><span class="ls0 ws1">T 3 8 6<span class="_"> </span><span class="ff5 ls3 ws0">计算机买了一个多任务操作系统:</span></span></span></span></span></span></span></div><div class="t m0 x5 h5 y5 ff4 fs2 fc0 sc0 ls0 ws2">M i n i x<span class="_"> </span><span class="ff5 ls2 ws0">。他使用这个操作系统来开发自己的多任务系统,并称之为<span class="_ _5"> </span></span>L i n u x<span class="_"> </span><span class="ff5 ws0">。<span class="_ _6"></span></span>1 9 9 1<span class="_"> </span><span class="ff5 ws0">年<span class="_ _1"></span><span class="ff4">9<span class="_ _6"></span></span><span class="ls4">月,他向</span></span></div><div class="t m0 x5 h5 y6 ff4 fs2 fc0 sc0 ls0 ws3">I n t e r n e t<span class="ff5 ls5 ws0">网上的其他一些<span class="_ _7"> </span></span>M i n i x<span class="_"> </span><span class="ff5 ls6 ws0">用户发电子邮件,发布了第一个系统原型,这样就揭开了<span class="_ _8"> </span></span>L i n u x</div><div class="t m0 x5 h5 y7 ff5 fs2 fc0 sc0 ls7 ws0">工程的序幕。从那时起,有许多程序员都开始支持<span class="_ _9"> </span><span class="ff4 ls0 ws4">L i n u x</span><span class="ls8">。他们增加设备驱动程序,开发应用</span></div><div class="t m0 x5 h5 y8 ff5 fs2 fc0 sc0 ls9 ws0">程序,他们的目标是符合<span class="_ _a"> </span><span class="ff4 ls0 ws5">P O S I X<span class="_"> </span></span><span class="ls4">标准。现在的<span class="_ _2"> </span><span class="ff4 ls0 ws5">L i n u x<span class="_"> </span></span><span class="lsa">功能已经非常强大了,但是<span class="_ _b"> </span><span class="ff4 ls0 ws5">L i n u x<span class="_"> </span></span><span class="ls0">更吸引</span></span></span></div><div class="t m0 x5 h5 y9 ff5 fs2 fc0 sc0 lsb ws0">人的地方在于,它是免费的<span class="_ _8"> </span><span class="ff4">(<span class="_ _1"></span></span><span class="lsc">当然并不像免费啤酒那样,不是完全免费<span class="_ _c"> </span><span class="ff4">)</span><span class="lsd">。现在人们正在把</span></span></div><div class="t m0 x5 h5 ya ff4 fs2 fc0 sc0 ls0 ws6">L i n u x<span class="_"> </span><span class="ff5 lse ws0">移植到其他平台上。</span></div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div></body></html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/7808779/bg2.jpg"><div class="c x2 y2 w2 h3"><div class="t m0 x6 h2 yb ff1 fs0 fc0 sc0 ls0 ws0">下载</div><div class="t m0 x7 h4 yc ff2 fs1 fc1 sc0 ls0 ws0">第<span class="ff3">2</span>章<span class="_ _d"> </span><span class="ff3">Linux</span>内核</div><div class="t m0 x8 h5 yd ff4 fs2 fc0 sc0 ls0 ws7">L i n u x<span class="ff5 lsf ws0">的基础就是它的内核。用户可以替换某个库,或者将所有库都进行替换,但是只要</span></div><div class="t m0 x9 h5 ye ff4 fs2 fc0 sc0 ls0 ws8">L i n u x<span class="_"> </span><span class="ff5 ls10 ws0">内核存在,它就还是<span class="_ _e"> </span></span>L i n u x<span class="_"> </span><span class="ff5 ls11 ws0">。内核包括设备驱动程序、内核管理、进程管理以及通信管</span></div><div class="t m0 x9 h5 yf ff5 fs2 fc0 sc0 ls12 ws0">理。内核高手总是遵循<span class="_ _a"> </span><span class="ff4 ls0 ws9">P O S I X<span class="_"> </span></span><span class="ls13">规则,该规则有时会使编程变得简单,有时会使它变得比较复</span></div><div class="t m0 x9 h5 y10 ff5 fs2 fc0 sc0 ls14 ws0">杂。如果用户的程序在一个新的<span class="_ _a"> </span><span class="ff4 ls0 ws4">L i n u x</span><span class="ls15">内核版本上行为发生了变化,可能是因为实现了一个新</span></div><div class="t m0 x9 h5 y11 ff5 fs2 fc0 sc0 ls0 ws0">的<span class="_ _6"></span><span class="ff4 wsa">P O S I X<span class="_"> </span></span><span class="ls16">规则。如果读者想了解更多的关于<span class="_ _b"> </span></span><span class="ff4 wsa">L i n u x<span class="_"> </span></span><span class="ls16">内核编程的信息,可以阅读《<span class="_ _a"> </span><span class="ff4 ls17">Linux Kernel</span></span></div><div class="t m0 x9 h5 y12 ff4 fs2 fc0 sc0 ls0 ws6">H a c k e r<span class="_"> </span><span class="ff5 ws0">’<span class="_ _f"></span><span class="ff4 ls18">s Guide<span class="_ _6"></span><span class="ff5 ls0">》<span class="_ _10"></span>。</span></span></span></div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/7808779/bg3.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">下载</div><div class="c x2 y2 w2 h3"><div class="t m0 xa h4 yc ff2 fs1 fc1 sc0 ls0 ws0">第<span class="ff3">3<span class="_ _6"></span></span>章<span class="_ _0"> </span><span class="ff3">Linux libc</span>包</div><div class="t m0 x4 h5 yd ff4 fs2 fc0 sc0 ls0 wsb">L i b c<span class="ff5 ws0">:<span class="_ _6"></span><span class="ff4 ls19">ISO 8859.1<span class="_ _6"></span></span>;位于<span class="_ _2"></span></span>< l i n u x / p a r a m . h ><span class="_"> </span><span class="ff5 ls1a ws0">中;包括<span class="_ _1"></span></span>Y P<span class="_"> </span><span class="ff5 ls1b ws0">函数、加密函数、一些基本的影子</span></div><div class="t m0 x5 h5 ye ff5 fs2 fc0 sc0 ls0 ws0">过程<span class="_ _6"></span><span class="ff4">(<span class="_ _6"></span></span><span class="ls1c">默认情况不包含<span class="_ _11"></span><span class="ff4">)</span></span>,……在<span class="_ _11"></span><span class="ff4 wsc">l i b c o m p t<span class="_"> </span></span><span class="ls1d">中有一些为了保持兼容性而提供的老过程<span class="_ _a"> </span><span class="ff4">(<span class="_ _4"></span><span class="ff5 ls0">默认情况下</span></span></span></div><div class="t m0 x5 h5 yf ff5 fs2 fc0 sc0 ls0 ws0">不激活<span class="_ _11"></span><span class="ff4">)</span><span class="ls1e">;提供英文、法文,或者德文的错误信息;在<span class="_ _b"> </span></span><span class="ff4 wsd">l i b c u r s e s<span class="_"> </span></span><span class="ls1d">中有一些具有<span class="_ _11"></span><span class="ff4 ls1f">bsd 4.4lite<span class="_ _6"></span></span></span>兼容性</div><div class="t m0 x5 h5 y10 ff5 fs2 fc0 sc0 ls20 ws0">的屏幕处理过程;在<span class="_ _2"> </span><span class="ff4 ls0 wse">l i b b s d<span class="_"> </span></span><span class="ls0">中有一些<span class="_ _11"></span><span class="ff4 wse">b s d<span class="_ _6"></span></span><span class="ls1d">兼容的过程;在<span class="_ _2"> </span></span><span class="ff4 wse">l i b t e r m c a p<span class="_"> </span></span><span class="ls21">中有一些屏幕处理过程;在</span></span></div><div class="t m0 x5 h5 y11 ff4 fs2 fc0 sc0 ls0 wsf">l i b d b m<span class="_"> </span><span class="ff5 ls5 ws0">中有用于数据库管理的过程;在<span class="_ _a"> </span></span>l i b m<span class="ff5 ls1a ws0">中有数学过程;在<span class="_ _2"> </span></span>c r t O . o ? ? ?<span class="_ _6"></span><span class="ff5 ls22 ws0">中有执行程序的入口,</span></div><div class="t m0 x5 h5 y12 ff5 fs2 fc0 sc0 ls0 ws0">在<span class="_ _6"></span><span class="ff4 ws10">l i b i e e e ? ? ?<span class="_"> </span></span><span class="ls23">有一些字节信息<span class="_ _11"></span><span class="ff4">(<span class="_ _6"></span></span><span class="ls24">请别再笑话我了,能不能给我提供一些信息?<span class="_ _9"> </span><span class="ff4">)</span></span></span>,在<span class="_ _1"></span><span class="ff4 ws10">l i b g m o n<span class="_"> </span></span>中是</div><div class="t m0 x5 h6 y13 ff5 fs2 fc0 sc0 ls25 ws0">用户空间的配置信息。</div><div class="t m0 x4 h5 y14 ff5 fs2 fc0 sc0 ls1d ws0">我希望由某位<span class="_ _11"></span><span class="ff4 ls26">Linux libc<span class="_ _6"></span></span><span class="ls27">开发人员来编写本章。现在我能说的唯一的一句话是<span class="_ _12"> </span><span class="ff4 ls0 ws11">a . o u t</span><span class="ls0">可执行</span></span></div><div class="t m0 x5 h5 y15 ff5 fs2 fc0 sc0 ls23 ws0">格式将会变化成<span class="_ _11"></span><span class="ff4 ls0 ws12">e l f (<span class="_"> </span></span>可执行并可链接<span class="_ _2"></span><span class="ff4">)</span><span class="ls0">格式<span class="_ _6"></span><span class="ff4">(<span class="_ _6"></span></span></span>出版者注:这个变化已经发生了<span class="_ _e"> </span><span class="ff4">)<span class="_ _6"></span></span><span class="ls2">,而后者又意味着</span></div><div class="t m0 x5 h5 y16 ff5 fs2 fc0 sc0 ls28 ws0">在创建共享库方面的一个变化。当前这两种格式<span class="_ _a"> </span><span class="ff4 ls0 ws6">( a . o u t<span class="_"> </span></span><span class="ls0">和<span class="_ _6"></span><span class="ff4 ws6">e l f )</span>都支持。</span></div><div class="t m0 x4 h5 y17 ff4 fs2 fc0 sc0 ls26 ws0">Linux libc<span class="ff5 ls29">包的绝大部分都是遵守库<span class="_ _e"> </span></span><span class="ls0 ws13">G N U</span><span class="ff5 ls2a">公共许可证的,尽管有些文件是遵守特殊的版权</span></div><div class="t m0 x5 h5 y18 ff5 fs2 fc0 sc0 ls2 ws0">规定的,例如<span class="_ _7"> </span><span class="ff4 ls0 ws14">c r t O . o<span class="_"> </span></span><span class="ls2b">。对商业版本来说,这就意味着一个限制<span class="_ _13"> </span><span class="ff4">,<span class="_ _6"></span></span><span class="ls2c">即禁止静态链接可执行程序。</span></span></div><div class="t m0 x5 h5 y19 ff5 fs2 fc0 sc0 ls1d ws0">在这里动态链接可执行程序又是一个特殊的例外。<span class="_ _b"> </span><span class="ff4 ls0 ws15">F S F (</span>自由软件基金会<span class="_ _11"></span><span class="ff4">)</span><span class="ls0">的<span class="_ _6"></span><span class="ff4 ls2d">Richard Stallman<span class="_ _6"></span></span>说</span></div><div class="t m0 x5 h6 y1a ff5 fs2 fc0 sc0 ls0 ws0">过:</div><div class="t m0 x4 h6 y1b ff5 fs2 fc0 sc0 ls2e ws0">在我看来,我们应该明确地允许发行不带伴随库的动态链接可执行程序,只要组成该可</div><div class="t m0 x5 h5 y1c ff5 fs2 fc0 sc0 ls1a ws0">执行程序的对象文件按照第<span class="_ _e"> </span><span class="ff4">5</span><span class="ls2d">节的规定是不受限制的。…<span class="_ _12"> </span>…,所以我决定现在就允许这样做。</span></div><div class="t m0 x5 h5 y1d ff5 fs2 fc0 sc0 ls1c ws0">实际上,要更新<span class="_ _11"></span><span class="ff4 ls0 ws6">L G P L</span><span class="ls2f">将需要等到我有时间的时候,并且需要检查一下新版本。</span></div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/7808779/bg4.jpg"><div class="c x2 y2 w2 h3"><div class="t m0 x6 h2 yb ff1 fs0 fc0 sc0 ls0 ws0">下载</div><div class="t m0 xb h4 y3 ff2 fs1 fc1 sc0 ls0 ws0">第<span class="ff3">4</span>章<span class="_ _d"> </span>系<span class="_ _14"> </span>统<span class="_ _14"> </span>调<span class="_ _14"> </span>用</div><div class="t m0 x8 h5 y4 ff5 fs2 fc0 sc0 ls12 ws0">系统调用是向操作系统<span class="_ _e"> </span><span class="ff4">(<span class="_ _6"></span></span><span class="ls0">内核<span class="_ _1"></span><span class="ff4">)<span class="_ _6"></span></span><span class="ls30">所作出的一次申请,请求操作系统做一次硬件<span class="_ _8"> </span><span class="ff4">/<span class="_ _6"></span></span><span class="ls31">系统相关的</span></span></span></div><div class="t m0 x9 h5 y5 ff5 fs2 fc0 sc0 ls32 ws0">操作,或者是作一次只有系统才能做的操作。以<span class="_ _2"> </span><span class="ff4 ls2">Linux 1.2<span class="_ _6"></span></span><span class="ls0">为例,它总共定义了<span class="_ _11"></span><span class="ff4 ws6">1 4 0</span><span class="lsa">个系统调用。</span></span></div><div class="t m0 x9 h5 y6 ff5 fs2 fc0 sc0 ls1d ws0">有些系统调用<span class="_ _11"></span><span class="ff4">(</span><span class="ls0">如<span class="ff4 ls33">close ( ))<span class="_ _6"></span></span>是在<span class="_ _6"></span><span class="ff4 ls31">Linux libc<span class="_ _6"></span></span><span class="ls34">中实现的。这种实现常常需要调用一个宏,而该宏最</span></span></div><div class="t m0 x9 h5 y7 ff5 fs2 fc0 sc0 ls0 ws0">后会调用<span class="_ _11"></span><span class="ff4 ls35">syscall ( )<span class="_ _6"></span></span>。传送给<span class="_ _11"></span><span class="ff4 ls36">syscall ( )<span class="_ _6"></span></span><span class="ls2b">的参数是系统调用的编号,在编号后面的参数是其他一</span></div><div class="t m0 x9 h5 y8 ff5 fs2 fc0 sc0 ls37 ws0">些必需的变元。如果通过实现一个新的<span class="_ _9"> </span><span class="ff4 ls0 ws16">l i b c<span class="_"> </span></span><span class="ls1e">库而更新了<span class="_ _2"></span><span class="ff4 ls0 ws16">< s y s / s y s c a l l . h ></span><span class="lsc">,则真正的系统调用编</span></span></div><div class="t m0 x9 h5 y9 ff5 fs2 fc0 sc0 ls0 ws0">号可以在<span class="_ _11"></span><span class="ff4 ws17">< l i n u x / u n i s t d . h ><span class="_ _6"></span></span><span class="ls38">中找到。如果新的系统调用在<span class="_ _e"> </span></span><span class="ff4 ws17">l i b c<span class="_"> </span></span><span class="ls39">中还没有代理程序,用户可以使用</span></div><div class="t m0 x9 h5 ya ff4 fs2 fc0 sc0 ls2 ws0">syscall ( )<span class="ff5 ls3a">。下面给出一个例子,可以像下面一样使用<span class="_ _a"> </span></span><span class="ls9">syscall ( )<span class="_ _6"></span><span class="ff5 ls1c">来关闭一个文件<span class="_ _1"></span><span class="ff4">(<span class="_ _6"></span></span><span class="ls0">不提倡<span class="_ _1"></span><span class="ff4">)</span>:</span></span></span></div><div class="t m0 x8 h5 y1e ff5 fs2 fc0 sc0 ls0 ws0">在<span class="ff4 ws18">i 3 8 6<span class="_ _1"></span></span><span class="ls3b">体系结构下,除了系统调用编号以外,系统调用只能带<span class="_ _15"> </span><span class="ff4">5<span class="_ _6"></span></span><span class="ls3c">个以下的变元,这是由于</span></span></div><div class="t m0 x9 h5 y1f ff5 fs2 fc0 sc0 ls3d ws0">受到了硬件寄存器数目的限制。如果读者是在另一个体系结构下运行<span class="_ _8"> </span><span class="ff4 ls0 ws4">L i n u x<span class="_"> </span></span><span class="ls3e">的,可以检查一下</span></div><div class="t m0 x9 h5 y20 ff4 fs2 fc0 sc0 ls0 ws19">< a s m / u n i s t d . h ><span class="ff5 ws0">中的<span class="_ _1"></span></span>_ s y s c a l l<span class="_"> </span><span class="ff5 ls3f ws0">宏,看看硬件支持多少个变元,或者说开发人员选择支持多少个变</span></div><div class="t m0 x9 h5 y21 ff5 fs2 fc0 sc0 ls0 ws0">元。这些<span class="_ _11"></span><span class="ff4 ws1a">_ s y s c a l l<span class="_"> </span></span><span class="ls1d">可以用于取代<span class="_ _11"></span><span class="ff4 ls36">syscall ( )</span><span class="ls40">,但是并不提倡用户这么做,这是因为由这些宏扩展</span></span></div><div class="t m0 x9 h6 y22 ff5 fs2 fc0 sc0 ls41 ws0">而成的完整的函数有可能在库中早已存在了。</div><div class="t m0 x8 h5 y23 ff5 fs2 fc0 sc0 ls1d ws0">所以,只有内核高手才能去使用<span class="_ _e"> </span><span class="ff4 ls0 ws1b">_ s y s c a l l</span><span class="ls42">宏。为了说明这一点,下面给出一个使用<span class="_ _a"> </span><span class="ff4 ls0 ws1b">_ s y s c a l l</span></span></div><div class="t m0 x9 h5 y24 ff5 fs2 fc0 sc0 ls0 ws0">宏的<span class="_ _6"></span><span class="ff4 lse">close ( )<span class="_ _6"></span></span>的例子:</div><div class="t m0 x8 h5 y25 ff5 fs2 fc0 sc0 ls0 ws0">在<span class="ff4 ws1c">_ s y s c a l l 1<span class="_"> </span></span><span class="ls43">宏扩展以后,得到函数<span class="_ _7"> </span><span class="ff4 ls19">close ( )<span class="_ _6"></span></span><span class="ls1d">。这样,我们就有两个<span class="_ _2"></span><span class="ff4 ls44">close ( )</span>了,一个在<span class="_ _1"></span></span></span><span class="ff4 ws1c">l i b c</span></div><div class="t m0 x9 h5 y26 ff5 fs2 fc0 sc0 ls3b ws0">中,另一个在我们的程序中。如果系统调用失败,<span class="_ _15"> </span><span class="ff4 ls45">syscall ( )</span><span class="ls0">或者<span class="_ _1"></span><span class="ff4 ws1d">_ s y s c a l l<span class="_"> </span></span><span class="ls5">宏的返回值是-<span class="_ _2"> </span><span class="ff4">1</span></span>;</span></div><div class="t m0 x9 h5 y27 ff5 fs2 fc0 sc0 ls46 ws0">而如果系统调用成功,则返回值将是<span class="_ _a"> </span><span class="ff4">0</span><span class="ls47">或者更大的数值,如果系统调用失败,我们可以查看一</span></div><div class="t m0 x9 h5 y28 ff5 fs2 fc0 sc0 ls0 ws0">下全局变量<span class="_ _11"></span><span class="ff4 ws6">e r r n o<span class="_"> </span></span><span class="ls48">,看看到底发生了什么。</span></div><div class="t m0 x8 h5 y29 ff5 fs2 fc0 sc0 ls49 ws0">下面这些系统调用在<span class="_ _11"></span><span class="ff4 ls0 ws6">B S D<span class="_ _6"></span></span><span class="ls0">和<span class="_ _6"></span><span class="ff4">Sys V<span class="_ _11"></span></span><span class="ls1c">中是可用的,但<span class="_ _1"></span><span class="ff4 lse">Linux 1.2<span class="_ _6"></span></span></span>不支持:</span></div><div class="t m0 x8 h5 y2a ff4 fs2 fc0 sc0 ls44 ws0">audit ( )<span class="_ _6"></span><span class="ff5 ls0">、<span class="_ _6"></span></span><span class="ls19">audition ( )<span class="_ _6"></span><span class="ff5 ls0">、</span>auditsvc ( )<span class="_ _6"></span><span class="ff5 ls0">、<span class="_ _6"></span></span><span class="ls4a">fchroot ( )<span class="ff5 ls0">、<span class="_ _6"></span></span>getauid ( )<span class="_ _6"></span><span class="ff5 ls0">、<span class="_ _6"></span></span><span class="ls4b">getdents ( )<span class="_ _6"></span><span class="ff5 ls0">、</span><span class="ls4c">getmsg ( )<span class="ff5 ls0">、</span></span></span></span></span></div><div class="t m0 x9 h5 y2b ff4 fs2 fc0 sc0 ls2 ws0">mincore ( )<span class="ff5 ls0">、<span class="_ _6"></span></span><span class="ls30">poll ( )<span class="_ _6"></span><span class="ff5 ls0">、</span><span class="ls25">putmsg ( )<span class="ff5 ls0">、<span class="_ _6"></span></span></span></span>setaudit ( )<span class="ff5 ls0">、</span>setauid ( )<span class="ff5 ls0">。</span></div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/7808779/bg5.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">下载</div><div class="c x2 y2 w2 h3"><div class="t m0 xc h4 y3 ff2 fs1 fc1 sc0 ls0 ws0">第<span class="ff3">5<span class="_ _6"></span></span>章<span class="_ _16"> </span>“瑞士军刀”<span class="_ _17"></span>:<span class="ff3">ioctl</span></div><div class="t m0 x4 h5 y4 ff4 fs2 fc0 sc0 ls0 ws6">i o c t l<span class="ff5 ws0">代表输入<span class="_ _11"></span><span class="ff4">/<span class="_ _6"></span></span><span class="ls4d">输出控制,它用于通过文件描述符来操作字符设备。<span class="_ _a"> </span></span></span>i o c t l<span class="_"> </span><span class="ff5 ls4e ws0">的格式如下所示:</span></div><div class="t m0 x4 h5 y5 ff4 fs2 fc0 sc0 ls4f ws0">ioctl (unsigned int fd, unsigned int request, unsigned long ar<span class="ls0 ws6">g u m e n t )</span></div><div class="t m0 x4 h5 y6 ff5 fs2 fc0 sc0 ls50 ws0">如果出错则返回值为-<span class="_ _e"> </span><span class="ff4">1<span class="_ _6"></span></span><span class="lse">,如果请求成功则返回值将大于或者等于<span class="_ _15"> </span><span class="ff4">0</span><span class="ls51">,这就像其他系统调</span></span></div><div class="t m0 x5 h5 y7 ff5 fs2 fc0 sc0 ls30 ws0">用一样。内核能区分特殊文件和普通文件。特殊文件一般可以在<span class="_ _18"> </span><span class="ff4 ls0 ws8">/ d e v<span class="_"> </span></span><span class="ls0">和<span class="_ _6"></span><span class="ff4 ws8">/ p r o c<span class="_"> </span></span><span class="ls52">中找到。它们与</span></span></div><div class="t m0 x5 h6 y8 ff5 fs2 fc0 sc0 ls53 ws0">普通文件的区别在于,它们隐藏了驱动程序的接口,并不是一个包含着文本或二进制数据的</div><div class="t m0 x5 h5 y9 ff5 fs2 fc0 sc0 ls0 ws0">真正的<span class="_ _11"></span><span class="ff4">(<span class="_ _6"></span></span>常规的<span class="_ _11"></span><span class="ff4">)<span class="_ _6"></span></span><span class="ls6">文件。这是<span class="_ _2"></span></span><span class="ff4 wsb">U n i x<span class="_"> </span></span><span class="ls54">的特点,它允许用户对每一个文件都可以使用普通的读<span class="_ _8"> </span><span class="ff4">/<span class="_ _6"></span></span></span>写操</div><div class="t m0 x5 h6 ya ff5 fs2 fc0 sc0 ls55 ws0">作。但是,如果用户想要对特殊文件或者普通文件进行更多的处理,用户可以使用……对了,</div><div class="t m0 x5 h5 y2c ff5 fs2 fc0 sc0 ls0 ws0">就是<span class="_ _6"></span><span class="ff4 ws15">i o c t l<span class="_ _6"></span></span>。用户把<span class="_ _11"></span><span class="ff4 ws15">i o c t l</span><span class="ls2">用于特殊文件的机会比用于普通文件的机会要多得多,但是在普通文件</span></div><div class="t m0 x5 h5 y2d ff5 fs2 fc0 sc0 ls56 ws0">上也可以使用<span class="_ _1"></span><span class="ff4 ls0 ws6">i o c t l<span class="_"> </span></span><span class="ls0">。</span></div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>