<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://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/622b92b83d2fbb000754c79f/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/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://static.pudn.com/prod/directory_preview_static/622b92b83d2fbb000754c79f/bg1.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0"> </div><div class="t m0 x2 h3 y2 ff2 fs1 fc0 sc1 ls1 ws0">第一篇:起步篇<span class="ff3 sc0 ls0"> </span></div><div class="t m0 x3 h4 y3 ff1 fs2 fc0 sc0 ls2 ws0"> <span class="ff2 ls0">千里之行,始于足下。<span class="ff1"> </span></span></div><div class="t m0 x3 h5 y4 ff4 fs3 fc0 sc1 ls3 ws0">第一章<span class="ff5 sc0 ls4 ws1"> UNIX</span>初步<span class="ff5 sc0 ls0"> </span></div><div class="t m0 x4 h4 y5 ff1 fs2 fc0 sc0 ls5 ws0">UNIX<span class="_ _0"> </span><span class="ff2 ls0">自<span class="_ _1"> </span></span><span class="ls6">1969<span class="_ _0"> </span><span class="ff2 ls0">年诞生以来,已经发展为<span class="_ _1"> </span></span><span class="ls7 ws2">System III & V</span><span class="ff2 ls0">、</span><span class="ls8">BSD<span class="_ _0"> </span><span class="ff2 ls0">和<span class="_ _1"> </span></span><span class="ls9">Linux<span class="_ _0"> </span><span class="ff2 ls0">三大分支。<span class="ff1"> </span></span></span></span></span></div><div class="t m0 x4 h4 y6 ff1 fs2 fc0 sc0 ls0 ws0">UniX<span class="_ _0"> </span><span class="ff2">通过<span class="_ _1"> </span></span><span class="lsa">shell<span class="_ _0"> </span></span><span class="ff2">与用户交互,它是用户与系统间的界面。使用好<span class="_ _1"> </span></span><span class="lsa">shell<span class="_ _0"> </span></span><span class="ff2">对于学习使用<span class="_ _1"> </span></span><span class="ls5">UNIX<span class="_ _0"> </span></span><span class="ff2">来说是必须</span></div><div class="t m0 x3 h4 y7 ff2 fs2 fc0 sc0 ls0 ws0">的。不需要你记住所有的命令,但基础的文件操作、目录操作及系统命令等却是必须的。<span class="ff1"> </span></div><div class="t m0 x4 h4 y8 ff1 fs2 fc0 sc0 lsb ws0">Vi<span class="_ _0"> </span><span class="ff2 ls0">对于初学者是难点,不过只要通过一段时间的练习就能习惯;而且你会很快发现,它功能强大、更</span></div><div class="t m0 x3 h4 y9 ff2 fs2 fc0 sc0 ls0 ws0">加灵活。这里不多说了:)<span class="ff1"> </span></div><div class="t m0 x3 h5 ya ff4 fs3 fc0 sc1 ls3 ws0">第二章<span class="ff5 sc0 ls0"> <span class="_ _2"> </span></span>编程套件<span class="ff5 sc0 ls0"> </span></div><div class="t m0 x4 h4 yb ff2 fs2 fc0 sc0 ls0 ws0">学习<span class="_ _1"> </span><span class="ff1 ls5">UNIX<span class="_ _0"> </span></span>对于初学者有几种选择。一种就是最直接的,在本机上安装<span class="_ _1"> </span><span class="ff1 ls5">UNIX<span class="_ _0"> </span></span>系统,不如说<span class="_ _1"> </span><span class="ff1 ls9">Linux<span class="_ _0"> </span></span>分支</div><div class="t m0 x3 h4 yc ff2 fs2 fc0 sc0 ls0 ws0">中的<span class="_ _1"> </span><span class="ff1 lsc ws3">Red Hat<span class="_ _0"> </span></span>等;一种是在<span class="_ _1"> </span><span class="ff1 lsd">Windows<span class="_ _0"> </span></span>环境下使用虚拟机方式安装<span class="_ _1"> </span><span class="ff1 ls5">UNIX<span class="_ _0"> </span></span>系统;另一种则是使用网络终端</div><div class="t m0 x3 h4 yd ff2 fs2 fc0 sc0 ls0 ws0">登录到网络环境中的某个<span class="_ _1"> </span><span class="ff1 ls5">UNIX<span class="_ _0"> </span></span>系统中。<span class="ff1"> </span></div><div class="t m0 x4 h4 ye ff2 fs2 fc0 sc0 ls0 ws0">如果你相对黑洞洞的<span class="_ _1"> </span><span class="ff1 ls5">UNIX<span class="_ _0"> </span></span>字符界面更喜欢舒适美观的<span class="_ _1"> </span><span class="ff1 lsd">Windows<span class="_ _0"> </span></span>界面,那么推荐你选择第三种方式。</div><div class="t m0 x3 h4 yf ff2 fs2 fc0 sc0 ls0 ws0">开发套件包括:编辑器<span class="_ _1"> </span><span class="ff1 lse">UltraEdit</span>、网络终端<span class="_ _1"> </span><span class="ff1 lsf">SecureCRT<span class="_ _0"> </span></span>或其他<span class="_ _3"></span>。<span class="ff1"> </span></div><div class="t m0 x4 h4 y10 ff2 fs2 fc0 sc0 ls0 ws0">编译器就不用说了,自然是<span class="_ _1"> </span><span class="ff1 ls10">cc</span>(<span class="ff1 ls11">gcc<span class="_ _0"> </span></span>或<span class="_ _1"> </span><span class="ff1 ls12">xlc<span class="_ _0"> </span></span>系列)。这是<span class="_ _1"> </span><span class="ff1">C<span class="_ _0"> </span></span>语言开发必不可少的。其中要注意<span class="ff1 ls13">-I</span><span class="ls14">(加载</span></div><div class="t m0 x3 h4 y11 ff2 fs2 fc0 sc0 ls0 ws0">头文件路径)、<span class="ff1 ls13">-L</span>(加载库文件路径)及<span class="ff1 ls13">-D</span>(宏定义)参数的使用。<span class="ff1"> </span></div><div class="t m0 x4 h4 y12 ff1 fs2 fc0 sc0 ls15 ws0">Make<span class="_ _0"> </span><span class="ff2 ls0">工具使用。如何编写<span class="_ _1"> </span></span><span class="ls16">makefile<span class="_ _4"> </span><span class="ff2 ls0">是关键。后面项目中使用时会详细介绍。<span class="ff1"> </span></span></span></div><div class="t m0 x4 h4 y13 ff1 fs2 fc0 sc0 lsb ws0">Gdb<span class="_ _0"> </span><span class="ff2 ls0">调试器。</span>Gdb<span class="_ _0"> </span><span class="ff2 ls0">乃符号级调试工具,它控制程序的内部执行,利用断点设置、单步运行等手段,将</span></div><div class="t m0 x3 h6 y14 ff2 fs2 fc0 sc0 ls0 ws0">程序的执行过程逐步展示在调试者目前。这种调试方式在短代码中可以发挥得很好。事实上,随着软件</div><div class="t m0 x3 h4 y15 ff2 fs2 fc0 sc0 ls0 ws0">项目的扩大化、复杂化和分布化,很少有程序员直接通过<span class="_ _1"> </span><span class="ff1 lsb">Gdb<span class="_ _0"> </span></span>等工具调试;使用日志记录调试方法比</div><div class="t m0 x3 h4 y16 ff1 fs2 fc0 sc0 lsb ws0">Gdb<span class="_ _0"> </span><span class="ff2 ls0">等调试工具更为便捷和广泛。<span class="ff1"> </span></span></div><div class="t m0 x4 h4 y17 ff1 fs2 fc0 sc0 ls0 ws0">C<span class="_ _0"> </span><span class="ff2">工具:</span><span class="ls17">lint<span class="_ _4"> </span></span><span class="ff2">检查源代码是否正确,</span><span class="ls18">gpro<span class="_ _5"></span>f<span class="_ _0"> </span></span><span class="ff2">分析程序时间消费量,</span><span class="lsf">cflow<span class="_ _0"> </span><span class="ff2 ls19">生成<span class="_ _1"> </span></span></span>C<span class="_ _0"> </span><span class="ff2">语言流程图。</span> </div><div class="t m0 x3 h5 y18 ff4 fs3 fc0 sc1 ls3 ws0">第三章<span class="ff5 sc0 ls0"> <span class="_ _2"> </span></span>库的使用<span class="ff5 sc0 ls0"> </span></div><div class="t m0 x4 h4 y19 ff2 fs2 fc0 sc0 ls0 ws0">库分静态库和动态库两种。<span class="ff1"> </span></div><div class="t m0 x4 h4 y1a ff2 fs2 fc0 sc0 ls0 ws0">静态库的操作工具:<span class="ff1 ls10">ar<span class="_ _4"> </span></span>命令。<span class="ff1"> </span></div><div class="t m0 x3 h7 y1b ff2 fs4 fc0 sc1 ls1a ws0">编写及使用静态库<span class="ff3 sc0 ls0"> </span></div><div class="t m0 x4 h4 y1c ff1 fs2 fc0 sc0 ls9 ws0">(1)<span class="ff2 ls0">设计库源码<span class="_ _1"> </span></span><span class="lsf">pr1.c<span class="_ _4"> </span><span class="ff2 ls0">和<span class="_ _1"> </span></span><span class="ls1b">pr2.c </span></span></div><div class="t m0 x5 h2 y1d ff1 fs0 fc0 sc0 ls1c ws4">[root@billstone make_lib]#<span class="_ _3"></span> cat pr1.c </div><div class="t m0 x5 h2 y1e ff1 fs0 fc0 sc0 ls1d ws5">void print1() </div><div class="t m0 x5 h2 y1f ff1 fs0 fc0 sc0 ls0 ws0">{ </div><div class="c x6 y20 w2 h8"><div class="t m0 x0 h9 y21 ff6 fs5 fc1 sc0 ls0 ws0">本页已使用福昕阅读器进行编辑。</div><div class="t m0 x0 h9 y22 ff6 fs5 fc1 sc0 ls0 ws0">福昕软件(C)2005-2007,版权所有,</div><div class="t m0 x0 h9 y23 ff6 fs5 fc1 sc0 ls0 ws0">仅供试用。</div></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,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://static.pudn.com/prod/directory_preview_static/622b92b83d2fbb000754c79f/bg2.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0"> </div><div class="t m0 x5 h2 y24 ff1 fs0 fc0 sc0 ls1e ws6"> </div><div class="t m0 x7 h2 y25 ff1 fs0 fc0 sc0 ls1e ws6"> printf("This <span class="_ _6"></span>is <span class="_ _6"></span>the <span class="_ _6"></span>first <span class="_ _6"></span>lib <span class="_ _6"></span>src!\n"); </div><div class="t m0 x5 h2 y26 ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x5 h2 y27 ff1 fs0 fc0 sc0 ls1c ws4">[root@billstone make_lib]#<span class="_ _3"></span> cat pr2.c </div><div class="t m0 x5 h2 y28 ff1 fs0 fc0 sc0 ls1d ws5">void print2() </div><div class="t m0 x5 h2 y29 ff1 fs0 fc0 sc0 ls0 ws0">{ </div><div class="t m0 x5 h2 y2a ff1 fs0 fc0 sc0 ls1f ws7"> printf("This <span class="_ _6"></span>is <span class="_ _6"></span>the <span class="_ _6"></span>second <span class="_ _6"></span>src <span class="_ _6"></span>lib!\n"); </div><div class="t m0 x5 h2 y2b ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x3 h4 y2c ff1 fs2 fc0 sc0 ls11 ws8"> (2) <span class="ff2 ls0 ws0">编译<span class="ff1 lsf">.c<span class="_ _4"> </span></span>文件<span class="ff1"> </span></span></div><div class="t m0 x5 h2 y2d ff1 fs0 fc0 sc0 ls20 ws9">[bill@billstone make_lib]<span class="_ _3"></span>$ cc -O -c pr1.c pr2.<span class="_ _3"></span>c </div><div class="t m0 x5 h2 y2e ff1 fs0 fc0 sc0 ls21 wsa">[bill@billstone make_lib]$<span class="_ _3"></span> ls -l pr*.o </div><div class="t m0 x5 h2 y2f ff1 fs0 fc0 sc0 ls22 wsb">-rw-rw-r-- 1 <span class="_ _6"></span>bill bill <span class="_ _5"></span>804 4<span class="_ _4"> </span><span class="ff2 ls0 ws0">月</span><span class="ls23 wsc"> <span class="_ _7"></span>15 11:11 pr1.o </span></div><div class="t m0 x5 h2 y30 ff1 fs0 fc0 sc0 ls22 wsb">-rw-rw-r-- 1 <span class="_ _6"></span>bill bill <span class="_ _5"></span>804 4<span class="_ _4"> </span><span class="ff2 ls0 ws0">月</span><span class="ls23 wsc"> <span class="_ _7"></span>15 11:11 pr2.o </span></div><div class="t m0 x4 h4 y31 ff1 fs2 fc0 sc0 ls11 ws0">(3) <span class="_"> </span><span class="ff2 ls0">链接静态库<span class="ff1"> </span></span></div><div class="t m0 x4 h4 y32 ff1 fs2 fc0 sc0 ls2 ws0"> <span class="ff2 ls0">为了在编译程序中正确找到库文件<span class="ff1">,</span>静态库必须按照<span class="_ _1"> </span></span><span class="ls24">lib[name].a<span class="_ _4"> </span><span class="ff2 ls0">的规则命名<span class="ff1">,</span>如下例中</span><span class="ls25">[name]=pr. </span></span></div><div class="t m0 x5 h2 y33 ff1 fs0 fc0 sc0 ls1f wsd">[bill@billstone make_lib]$<span class="_ _3"></span> ar -rsv libpr.a pr1.o pr2.o </div><div class="t m0 x5 h2 y34 ff1 fs0 fc0 sc0 ls26 ws3">a - pr1.o </div><div class="t m0 x5 h2 y35 ff1 fs0 fc0 sc0 ls26 ws3">a - pr2.o </div><div class="t m0 x5 h2 y36 ff1 fs0 fc0 sc0 ls20 ws9">[bill@billstone make_lib]<span class="_ _3"></span>$ ls -l *.a </div><div class="t m0 x5 h2 y37 ff1 fs0 fc0 sc0 ls22 wsb">-rw-rw-r-- 1 <span class="_ _6"></span>bill bill <span class="_ _5"></span>1822 4<span class="_ _4"> </span><span class="ff2 ls0 ws0">月</span><span class="ls27 wse"> 15 <span class="_ _6"></span>11:12 <span class="_ _6"></span>libpr.a </span></div><div class="t m0 x5 h2 y38 ff1 fs0 fc0 sc0 ls20 ws9">[bill@billstone make_lib]<span class="_ _3"></span>$ ar -t libpr.a </div><div class="t m0 x5 h2 y39 ff1 fs0 fc0 sc0 ls28 ws0">pr1.o </div><div class="t m0 x5 h2 y3a ff1 fs0 fc0 sc0 ls28 ws0">pr2.o </div><div class="t m0 x4 h4 y3b ff1 fs2 fc0 sc0 ls11 ws0">(4) <span class="_"> </span><span class="ff2 ls0">调用库函数代码<span class="_ _1"> </span></span><span class="ls29">ma<span class="_ _5"></span>in<span class="_ _5"></span>.c </span></div><div class="t m0 x5 h2 y3c ff1 fs0 fc0 sc0 ls1c wsf">[bill@billstone make_lib]$ cat m<span class="_ _3"></span>ain.c </div><div class="t m0 x5 h2 y3d ff1 fs0 fc0 sc0 ls20 ws9">int main() </div><div class="t m0 x5 h2 y3e ff1 fs0 fc0 sc0 ls0 ws0">{ </div><div class="t m0 x5 h2 y3f ff1 fs0 fc0 sc0 ls2a ws0"> p<span class="_ _6"></span>r<span class="_ _6"></span>i<span class="_ _8"></span>n<span class="_ _6"></span>t<span class="_ _6"></span>1<span class="_ _6"></span>(<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y40 ff1 fs0 fc0 sc0 ls2a ws0"> p<span class="_ _6"></span>r<span class="_ _6"></span>i<span class="_ _8"></span>n<span class="_ _6"></span>t<span class="_ _6"></span>2<span class="_ _6"></span>(<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y41 ff1 fs0 fc0 sc0 ls2b ws0"> </div><div class="t m0 x5 h2 y42 ff1 fs0 fc0 sc0 ls2a ws0"> r<span class="_ _6"></span>e<span class="_ _6"></span>t<span class="_ _6"></span>u<span class="_ _8"></span>r<span class="_ _6"></span>n<span class="_ _6"></span> <span class="_ _6"></span>0<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y43 ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x4 h4 y44 ff1 fs2 fc0 sc0 ls11 ws0">(5) <span class="_"> </span><span class="ff2 ls0">编译链接选项<span class="ff1"> </span></span></div><div class="t m0 x4 h4 y45 ff1 fs2 fc0 sc0 ls2 ws0"> -<span class="_ _6"></span>L<span class="_ _5"></span><span class="ff2 ls0">及</span><span class="ls13">-l<span class="_ _0"> </span><span class="ff2 ls0">参数放在后面<span class="ff1">.</span>其中</span><span class="ls2c">,-L<span class="_ _0"> </span><span class="ff2 ls0">加载库文件路径</span>,-l<span class="_ _0"> </span><span class="ff2 ls0">指明库文件名字</span><span class="lsf">. </span></span></span></div><div class="t m0 x5 h2 y46 ff1 fs0 fc0 sc0 ls2d ws10">[bill@billstone make_lib]<span class="_ _3"></span>$ gcc -o main m<span class="_ _3"></span>ain.c -L./ -lpr </div><div class="t m0 x5 h2 y47 ff1 fs0 fc0 sc0 ls1f wsd">[bill@billstone make_lib]$<span class="_ _3"></span> ls -l main* </div><div class="t m0 x5 h2 y48 ff1 fs0 fc0 sc0 ls2e ws11">-rwxrwxr-x 1 <span class="_ _6"></span>bill bill <span class="_ _5"></span> 11805 4<span class="_ _4"> </span><span class="ff2 ls0 ws0">月</span><span class="ls27 ws12"> <span class="_ _7"></span>15 11:17 main </span></div><div class="t m0 x5 h2 y49 ff1 fs0 fc0 sc0 ls22 wsb">-rw-rw-r-- 1 <span class="_ _6"></span>bill bill <span class="_ _5"></span>50 4<span class="_ _4"> </span><span class="ff2 ls0 ws0">月</span><span class="ls28 ws13"> <span class="_ _7"></span>15 11:15 main.c </span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,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://static.pudn.com/prod/directory_preview_static/622b92b83d2fbb000754c79f/bg3.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0"> </div><div class="t m0 x4 h4 y4a ff1 fs2 fc0 sc0 ls9 ws0">(6)<span class="ff2 ls0">执行目标程序<span class="ff1"> </span></span></div><div class="t m0 x5 h2 y4b ff1 fs0 fc0 sc0 ls20 ws14">[bill@billstone make_lib]$ ./main </div><div class="t m0 x5 h2 y4c ff1 fs0 fc0 sc0 ls28 ws13">This is the first lib src! </div><div class="t m0 x5 h2 y4d ff1 fs0 fc0 sc0 ls1f wsd">This is the second src lib! </div><div class="t m0 x5 h2 y4e ff1 fs0 fc0 sc0 ls21 ws15">[bill@billstone make_lib]$ </div><div class="t m0 x3 h7 y4f ff2 fs4 fc0 sc1 ls2f ws0">编写动态库<span class="ff3 sc0 ls0"> </span></div><div class="t m0 x4 h4 y50 ff1 fs2 fc0 sc0 ls9 ws0">(1)<span class="ff2 ls0">设计库代码<span class="ff1"> </span></span></div><div class="t m0 x5 h2 y51 ff1 fs0 fc0 sc0 ls1c ws4">[bill@billstone make_lib]<span class="_ _3"></span>$ cat pr1.c </div><div class="t m0 x5 h2 y52 ff1 fs0 fc0 sc0 ls2d ws10">int p = 2; </div><div class="t m0 x5 h2 y53 ff1 fs0 fc0 sc0 ls2b ws0"> </div><div class="t m0 x5 h2 y54 ff1 fs0 fc0 sc0 ls1d ws5">void print(){ </div><div class="t m0 x5 h2 y55 ff1 fs0 fc0 sc0 ls1f ws7"> printf("This <span class="_ _6"></span>is <span class="_ _6"></span>the <span class="_ _6"></span>first <span class="_ _6"></span>dll <span class="_ _6"></span>src!\n"); </div><div class="t m0 x5 h2 y56 ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x5 h2 y57 ff1 fs0 fc0 sc0 ls21 ws15">[bill@billstone make_lib]$ <span class="_ _7"></span> </div><div class="t m0 x4 ha y58 ff1 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x4 h4 y59 ff1 fs2 fc0 sc0 ls9 ws0">(2)<span class="ff2 ls0">生成动态库<span class="ff1"> </span></span></div><div class="t m0 x5 h2 y5a ff1 fs0 fc0 sc0 ls20 ws9">[bill@billstone make_lib]<span class="_ _3"></span>$ gcc -O -fpic -shared -<span class="_ _3"></span>o dl.so pr1.c </div><div class="t m0 x5 h2 y5b ff1 fs0 fc0 sc0 ls21 wsa">[bill@billstone make_lib]$<span class="_ _3"></span> ls -l *.so </div><div class="t m0 x5 h2 y5c ff1 fs0 fc0 sc0 ls2e ws11">-rwxrwxr-x 1 <span class="_ _6"></span>bill bill <span class="_ _5"></span> 6592 4<span class="_ _4"> </span><span class="ff2 ls0 ws0">月</span><span class="ls30 ws16"> <span class="_ _7"></span>15 15:19 dl.so </span></div><div class="t m0 x5 h2 y5d ff1 fs0 fc0 sc0 ls21 ws15">[bill@billstone make_lib]$ </div><div class="t m0 x4 ha y5e ff1 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x4 h4 y5f ff1 fs2 fc0 sc0 ls0 ws0"> </div><div class="t m0 x3 h7 y60 ff2 fs4 fc0 sc1 ls1a ws0">动态库的隐式调用<span class="ff3 sc0 ls0"> </span></div><div class="t m0 x4 h4 y61 ff1 fs2 fc0 sc0 ls0 ws0"> <span class="_ _4"></span><span class="ff2">在编译调用库函数代码时指明动态库的位置及名字</span><span class="lsf">, <span class="_ _7"></span></span><span class="ff2">看下面实例</span> </div><div class="t m0 x5 h2 y62 ff1 fs0 fc0 sc0 ls1c wsf">[bill@billstone make_lib]$ cat m<span class="_ _3"></span>ain.c </div><div class="t m0 x5 h2 y63 ff1 fs0 fc0 sc0 ls20 ws9">int main() </div><div class="t m0 x5 h2 y64 ff1 fs0 fc0 sc0 ls0 ws0">{ </div><div class="t m0 x5 h2 y65 ff1 fs0 fc0 sc0 ls2a ws0"> p<span class="_ _6"></span>r<span class="_ _6"></span>i<span class="_ _8"></span>n<span class="_ _6"></span>t<span class="_ _6"></span>(<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y66 ff1 fs0 fc0 sc0 ls2b ws0"> </div><div class="t m0 x5 h2 y67 ff1 fs0 fc0 sc0 ls2a ws0"> r<span class="_ _6"></span>e<span class="_ _6"></span>t<span class="_ _6"></span>u<span class="_ _8"></span>r<span class="_ _6"></span>n<span class="_ _6"></span> <span class="_ _6"></span>0<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y68 ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x5 h2 y69 ff1 fs0 fc0 sc0 ls1e ws17">[bill@billstone make_lib]<span class="_ _3"></span>$ gcc -o tdl main.c <span class="_ _3"></span>./dl.so </div><div class="t m0 x5 h2 y6a ff1 fs0 fc0 sc0 ls1e ws14">[bill@billstone make_lib]$ ./tdl<span class="_ _3"></span> </div><div class="t m0 x5 h2 y6b ff1 fs0 fc0 sc0 ls1f wsd">This is the first dll src! </div><div class="t m0 x5 h2 y6c ff1 fs0 fc0 sc0 ls21 ws15">[bill@billstone make_lib]$ </div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,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://static.pudn.com/prod/directory_preview_static/622b92b83d2fbb000754c79f/bg4.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0"> </div><div class="t m0 x4 ha y6d ff1 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x4 h4 y6e ff2 fs2 fc0 sc0 ls0 ws0">当动态库的位置活名字发生改变时<span class="ff1 lsf">, <span class="_ _9"></span></span>程序将无法正常运行<span class="ff1 ls17">; <span class="_ _9"></span></span>而动态库取代静态库的好处之一则是通过更</div><div class="t m0 x3 h4 y6f ff2 fs2 fc0 sc0 ls0 ws0">新动态库而随时升级库的内容<span class="ff1 lsf">. </span></div><div class="t m0 x4 h4 y70 ff1 fs2 fc0 sc0 ls0 ws0"> </div><div class="t m0 x3 h7 y71 ff2 fs4 fc0 sc1 ls1a ws0">动态库的显式调用<span class="ff3 sc0 ls0"> </span></div><div class="t m0 x4 h4 y72 ff1 fs2 fc0 sc0 ls0 ws0"> <span class="_ _9"></span><span class="ff2">显式调用动态库需要四个函数的支持</span><span class="lsf">, <span class="_ _9"></span></span><span class="ff2">函数<span class="_ _1"> </span></span><span class="ls12">dlopen<span class="_ _4"> </span></span><span class="ff2">打开动态库</span><span class="lsf">, <span class="_ _9"></span></span><span class="ff2">函数<span class="_ _1"> </span></span><span class="ls25">dlsym<span class="_ _4"> </span></span><span class="ff2">获取动态<span class="_ _5"></span>库中对象基址</span><span class="lsf">, <span class="_ _9"></span></span><span class="ff2">函</span></div><div class="t m0 x3 h4 y73 ff2 fs2 fc0 sc0 ls0 ws0">数<span class="_ _1"> </span><span class="ff1 lse">dlerror<span class="_ _0"> </span></span>获取显式动态库操作中的错误信息<span class="ff1 lsf">, <span class="_ _9"></span></span>函数<span class="_ _1"> </span><span class="ff1 ls12">doclose<span class="_ _4"> </span></span>关闭动态库<span class="ff1 lsf">. </span></div><div class="t m0 x5 h2 y74 ff1 fs0 fc0 sc0 ls31 wsf">[bill@billstone make_lib]$ cat m<span class="_ _3"></span>ain.c </div><div class="t m0 x5 h2 y75 ff1 fs0 fc0 sc0 ls2d ws10">#include <dlfcn.h> </div><div class="t m0 x5 h2 y76 ff1 fs0 fc0 sc0 ls2b ws0"> </div><div class="t m0 x5 h2 y77 ff1 fs0 fc0 sc0 ls20 ws9">int main() </div><div class="t m0 x5 h2 y78 ff1 fs0 fc0 sc0 ls0 ws0">{ </div><div class="t m0 x5 h2 y79 ff1 fs0 fc0 sc0 ls21 ws18"> void <span class="_ _6"></span>*pHandle; </div><div class="t m0 x5 h2 y7a ff1 fs0 fc0 sc0 ls27 wse"> void <span class="_ _6"></span>(*pFunc)(); <span class="_ _5"></span>// <span class="ff2 ls0 ws0">指向函数的指针<span class="ff1"> </span></span></div><div class="t m0 x5 h2 y7b ff1 fs0 fc0 sc0 ls2a ws0"> i<span class="_ _6"></span>n<span class="_ _6"></span>t<span class="_ _6"></span> <span class="_ _8"></span>*<span class="_ _6"></span>p<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y7c ff1 fs0 fc0 sc0 ls2b ws0"> </div><div class="t m0 x5 h2 y7d ff1 fs0 fc0 sc0 ls32 ws19"> pHandle <span class="_ _6"></span>= <span class="_ _8"></span>dlopen("./d1.so", <span class="_ _6"></span>RTLD_NOW); // <span class="ff2 ls0 ws0">打开动态库<span class="ff1"> </span></span></div><div class="t m0 x5 h2 y7e ff1 fs0 fc0 sc0 ls1f ws7"> if(!pHandle){ </div><div class="t m0 x5 h2 y7f ff1 fs0 fc0 sc0 ls2a ws0"> p<span class="_ _6"></span>r<span class="_ _6"></span>i<span class="_ _8"></span>n<span class="_ _6"></span>t<span class="_ _6"></span>f<span class="_ _6"></span>(<span class="_ _6"></span>"<span class="_ _6"></span>C<span class="_ _6"></span>a<span class="_ _8"></span>n<span class="_ _6"></span>'<span class="_ _6"></span>t<span class="_ _6"></span> <span class="_ _6"></span>f<span class="_ _6"></span>i<span class="_ _6"></span>n<span class="_ _6"></span>d<span class="_ _6"></span> <span class="_ _8"></span>d<span class="_ _6"></span>1<span class="_ _6"></span>.<span class="_ _6"></span>s<span class="_ _6"></span>o<span class="_ _6"></span> <span class="_ _8"></span>\<span class="_ _6"></span>n<span class="_ _6"></span>"<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y80 ff1 fs0 fc0 sc0 ls2a ws0"> e<span class="_ _6"></span>x<span class="_ _6"></span>i<span class="_ _8"></span>t<span class="_ _6"></span>(<span class="_ _6"></span>1<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y81 ff1 fs0 fc0 sc0 ls2a ws0"> }<span class="_ _6"></span> </div><div class="t m0 x5 h2 y82 ff1 fs0 fc0 sc0 ls30 ws1a"> pFunc <span class="_ _6"></span>= <span class="_ _6"></span>(void <span class="_ _6"></span>(*)())dlsym(pHandle, <span class="_ _6"></span>"print"); // <span class="ff2 ls0 ws0">获取库函数<span class="_ _1"> </span><span class="ff1 ls28">print<span class="_ _9"> </span></span>的地址<span class="ff1"> </span></span></div><div class="t m0 x5 h2 y83 ff1 fs0 fc0 sc0 ls2a ws0"> i<span class="_ _6"></span>f<span class="_ _6"></span>(<span class="_ _8"></span>p<span class="_ _6"></span>F<span class="_ _6"></span>u<span class="_ _6"></span>n<span class="_ _6"></span>c<span class="_ _6"></span>)<span class="_ _6"></span> </div><div class="t m0 x5 h2 y84 ff1 fs0 fc0 sc0 ls2a ws0"> p<span class="_ _6"></span>F<span class="_ _6"></span>u<span class="_ _6"></span>n<span class="_ _6"></span>c<span class="_ _8"></span>(<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y85 ff1 fs0 fc0 sc0 ls2a ws0"> e<span class="_ _6"></span>l<span class="_ _6"></span>s<span class="_ _6"></span>e<span class="_ _8"></span> </div><div class="t m0 x5 h2 y86 ff1 fs0 fc0 sc0 ls2a ws0"> p<span class="_ _6"></span>r<span class="_ _6"></span>i<span class="_ _8"></span>n<span class="_ _6"></span>t<span class="_ _6"></span>f<span class="_ _6"></span>(<span class="_ _6"></span>"<span class="_ _6"></span>C<span class="_ _6"></span>a<span class="_ _8"></span>n<span class="_ _6"></span>'<span class="_ _6"></span>t<span class="_ _6"></span> <span class="_ _6"></span>f<span class="_ _6"></span>i<span class="_ _6"></span>n<span class="_ _6"></span>d<span class="_ _6"></span> <span class="_ _8"></span>f<span class="_ _6"></span>u<span class="_ _6"></span>n<span class="_ _6"></span>c<span class="_ _6"></span>t<span class="_ _6"></span>i<span class="_ _8"></span>o<span class="_ _6"></span>n<span class="_ _6"></span> <span class="_ _6"></span>p<span class="_ _6"></span>r<span class="_ _6"></span>i<span class="_ _6"></span>n<span class="_ _8"></span>t<span class="_ _6"></span>\<span class="_ _6"></span>n<span class="_ _6"></span>"<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y87 ff1 fs0 fc0 sc0 ls2a ws0"> p<span class="_ _6"></span> <span class="_ _6"></span>=<span class="_ _6"></span> <span class="_ _8"></span>(<span class="_ _6"></span>i<span class="_ _6"></span>n<span class="_ _6"></span>t<span class="_ _6"></span> <span class="_ _6"></span>*<span class="_ _6"></span>)<span class="_ _6"></span>d<span class="_ _6"></span>l<span class="_ _8"></span>s<span class="_ _6"></span>y<span class="_ _6"></span>m<span class="_ _6"></span>(<span class="_ _6"></span>p<span class="_ _6"></span>H<span class="_ _6"></span>a<span class="_ _8"></span>n<span class="_ _6"></span>d<span class="_ _6"></span>l<span class="_ _6"></span>e<span class="_ _6"></span>,<span class="_ _6"></span> <span class="_ _8"></span>"<span class="_ _6"></span>p<span class="_ _6"></span>"<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> <span class="_ _5"></span> /<span class="_ _6"></span>/<span class="_ _6"></span> <span class="ff2 ls0">获取库变量<span class="_ _0"> </span><span class="ff1">p<span class="_"> </span></span><span class="ls33">的地<span class="_ _3"></span>址<span class="ff1 ls0"> </span></span></span></div><div class="t m0 x5 h2 y88 ff1 fs0 fc0 sc0 ls2a ws0"> i<span class="_ _6"></span>f<span class="_ _6"></span>(<span class="_ _8"></span>p<span class="_ _6"></span>)<span class="_ _6"></span> </div><div class="t m0 x5 h2 y89 ff1 fs0 fc0 sc0 ls2a ws0"> p<span class="_ _6"></span>r<span class="_ _6"></span>i<span class="_ _8"></span>n<span class="_ _6"></span>t<span class="_ _6"></span>f<span class="_ _6"></span>(<span class="_ _6"></span>"<span class="_ _6"></span>p<span class="_ _6"></span> <span class="_ _8"></span>=<span class="_ _6"></span> <span class="_ _6"></span>%<span class="_ _6"></span>d<span class="_ _6"></span>\<span class="_ _6"></span>n<span class="_ _6"></span>"<span class="_ _6"></span>,<span class="_ _8"></span> <span class="_ _6"></span>*<span class="_ _6"></span>p<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y8a ff1 fs0 fc0 sc0 ls2a ws0"> e<span class="_ _6"></span>l<span class="_ _6"></span>s<span class="_ _6"></span>e<span class="_ _8"></span> </div><div class="t m0 x5 h2 y8b ff1 fs0 fc0 sc0 ls2a ws0"> p<span class="_ _6"></span>r<span class="_ _6"></span>i<span class="_ _8"></span>n<span class="_ _6"></span>t<span class="_ _6"></span>f<span class="_ _6"></span>(<span class="_ _6"></span>"<span class="_ _6"></span>C<span class="_ _6"></span>a<span class="_ _8"></span>n<span class="_ _6"></span>'<span class="_ _6"></span>t<span class="_ _6"></span> <span class="_ _6"></span>f<span class="_ _6"></span>i<span class="_ _6"></span>n<span class="_ _6"></span>d<span class="_ _6"></span> <span class="_ _8"></span>i<span class="_ _6"></span>n<span class="_ _6"></span>t<span class="_ _6"></span> <span class="_ _6"></span>p<span class="_ _6"></span>\<span class="_ _8"></span>n<span class="_ _6"></span>"<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y8c ff1 fs0 fc0 sc0 ls2a ws0"> d<span class="_ _6"></span>l<span class="_ _6"></span>c<span class="_ _6"></span>l<span class="_ _8"></span>o<span class="_ _6"></span>s<span class="_ _6"></span>e<span class="_ _6"></span>(<span class="_ _6"></span>p<span class="_ _6"></span>H<span class="_ _6"></span>a<span class="_ _6"></span>n<span class="_ _8"></span>d<span class="_ _6"></span>l<span class="_ _6"></span>e<span class="_ _6"></span>)<span class="_ _6"></span>;<span class="_ _6"></span> <span class="_ _5"></span> /<span class="_ _6"></span>/<span class="_ _8"></span> <span class="ff2 ls0">关闭动态库<span class="ff1"> </span></span></div><div class="t m0 x5 h2 y8d ff1 fs0 fc0 sc0 ls2b ws0"> </div><div class="t m0 x5 h2 y8e ff1 fs0 fc0 sc0 ls2a ws0"> r<span class="_ _6"></span>e<span class="_ _6"></span>t<span class="_ _6"></span>u<span class="_ _8"></span>r<span class="_ _6"></span>n<span class="_ _6"></span> <span class="_ _6"></span>0<span class="_ _6"></span>;<span class="_ _6"></span> </div><div class="t m0 x5 h2 y8f ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x5 h2 y90 ff1 fs0 fc0 sc0 ls1e ws17">[bill@billstone make_lib]<span class="_ _3"></span>$ gcc -o tds main.c <span class="_ _3"></span>-ldl </div><div class="t m0 x5 h2 y91 ff1 fs0 fc0 sc0 ls1f ws1b">[bill@billstone make_lib]$ ./tds </div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,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://static.pudn.com/prod/directory_preview_static/622b92b83d2fbb000754c79f/bg5.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0"> </div><div class="t m0 x5 h2 y24 ff1 fs0 fc0 sc0 ls1f wsd">This is </div><div class="t m0 x8 h2 y25 ff1 fs0 fc0 sc0 ls1f wsd">the first dll src! </div><div class="t m0 x5 h2 y26 ff1 fs0 fc0 sc0 ls1f wsd">p = 2 </div><div class="t m0 x5 h2 y92 ff1 fs0 fc0 sc0 ls21 ws15">[bill@billstone make_lib]$ <span class="_ _7"></span> </div><div class="t m0 x4 ha y93 ff1 fs4 fc0 sc0 ls0 ws0"> </div><div class="t m0 x4 h4 y94 ff2 fs2 fc0 sc0 ls0 ws0">上面的程序<span class="_ _1"> </span><span class="ff1 ls34">tds<span class="_ _0"> </span></span>显式调用了共享库<span class="_ _1"> </span><span class="ff1 ls6">d1.so<span class="_ _4"> </span></span>中的函数<span class="_ _1"> </span><span class="ff1 ls18">prin<span class="_ _5"></span>t<span class="_ _0"> </span></span>和变量<span class="_ _1"> </span><span class="ff1 ls6">p. </span></div><div class="t m0 x4 h4 y95 ff1 fs2 fc0 sc0 ls0 ws0"> </div><div class="t m0 x9 hb y96 ff2 fs1 fc0 sc0 ls0 ws0">第二篇<span class="ff1 ls35">: <span class="_ _a"></span><span class="ff2">文件子系统</span><span class="ls0"> </span></span></div><div class="t m0 x4 h4 y97 ff1 fs2 fc0 sc0 ls2 ws0"> <span class="ff2 ls0">普天之下<span class="ff1">,</span>莫非王土<span class="ff1">;</span>率土之滨<span class="ff1">,</span>莫非王臣</span><span class="ls36 ws1c">. UNIX<span class="_ _0"> </span></span><span class="ff2 ls0">之中<span class="ff1">,</span>莫非文件</span><span class="lsf">. </span></div><div class="t m0 x3 h5 y98 ff4 fs3 fc0 sc1 ls3 ws0">第四章<span class="ff5 sc0 ls0"> <span class="_ _2"> </span></span><span class="ls37">文件系统结构<span class="ff5 sc0 ls0"> </span></span></div><div class="t m0 x4 h4 y99 ff1 fs2 fc0 sc0 ls2 ws0"> <span class="ff2 ls0">磁盘在使用前</span><span class="lsf">, <span class="_ _9"></span><span class="ff2 ls0">需要分区和格式化</span>. <span class="_ _9"></span><span class="ff2 ls0">格式化操作将在磁盘分区中创建文件系统</span>, <span class="_ _9"></span><span class="ff2 ls0">它们将确定文件的存储</span></span></div><div class="t m0 x3 h4 y9a ff2 fs2 fc0 sc0 ls0 ws0">方式和索引方法<span class="ff1 lsf">, <span class="_ _9"></span></span>确定磁盘空间分配和回收算法<span class="ff1 lsf">. </span></div><div class="t m0 x4 h4 y9b ff1 fs2 fc0 sc0 lsb ws1d"> UNIX<span class="_ _0"> </span><span class="ff2 ls0 ws0">文件系统的存储由<span class="ff1"><</span>目录<span class="ff1">-<span class="ff7">i<span class="_ _0"> </span></span></span>节点<span class="ff1">-</span>数据块<span class="ff1">></span>三级构成<span class="ff1">,</span>其中目录存储了文件的层次结构<span class="ff1 lsf">, <span class="_ _9"> </span></span>数据块存储</span></div><div class="t m0 x3 h4 y9c ff2 fs2 fc0 sc0 ls0 ws0">了文件的具体信息<span class="ff1 lsf">, i<span class="_ _0"> </span></span>节点是连接文件层次结构与其数据内容的桥梁<span class="ff1 lsf">. </span></div><div class="t m0 x4 h4 y9d ff1 fs2 fc0 sc0 lsb ws1d"> UNIX<span class="_ _0"> </span><span class="ff2 ls0 ws0">文件系统将磁盘空间划分为一系列大小相同的块<span class="ff1 lsf">, <span class="_ _9"> </span></span>划分为引导块<span class="ff1 lsf">, <span class="_ _9"> </span></span>超级块<span class="ff1 lsf">, i<span class="_ _0"> </span></span>节点区和数据区四个</span></div><div class="t m0 x3 h4 y9e ff2 fs2 fc0 sc0 ls0 ws0">部分<span class="ff1 lsf">. </span></div><div class="t m0 x4 h4 y9f ff1 fs2 fc0 sc0 ls2 ws0"> <span class="ff2 ls0">文件系统通过<span class="_ _1"> </span><span class="ff1">i<span class="_ _0"> </span></span>节点对文件进行控制和管理</span><span class="lsf">. <span class="_ _9"></span><span class="ff2 ls0">其中</span>, <span class="_ _9"></span><span class="ff2 ls0">每个文件对应一个<span class="_ _a"> </span><span class="ff1">i<span class="_ _a"> </span></span>节点</span>, <span class="_ _9"></span><span class="ff2 ls0">每个<span class="_ _a"> </span><span class="ff1">i<span class="_ _0"> </span></span>节点具有唯一的</span></span></div><div class="t m0 x3 h4 ya0 ff2 fs2 fc0 sc0 ls0 ws0">节点号<span class="ff1 lsf">, <span class="_ _9"></span></span>记录了文件的属性和内容在磁盘上的存储位置<span class="ff1 lsf">. <span class="_ _9"></span></span>但文件名并不记录在<span class="_ _1"> </span><span class="ff1">i<span class="_ _0"> </span></span>节点里<span class="ff1 lsf">, <span class="_ _9"></span></span>而是存储在目录文</div><div class="t m0 x3 h4 ya1 ff2 fs2 fc0 sc0 ls0 ws0">件中<span class="ff1 lsf">. </span></div><div class="t m0 x3 h7 ya2 ff3 fs4 fc0 sc0 ls38 ws0"> <span class="ff2 sc1 ls2f">磁盘文件如何存储</span><span class="ls39">? </span></div><div class="t m0 x4 h4 ya3 ff1 fs2 fc0 sc0 ls2 ws0"> <span class="ff2 ls0">文件系统通过目录记载文件名及其对应的<span class="_ _1"> </span><span class="ff1">i<span class="_ _0"> </span></span>节点编号</span><span class="lsf">, <span class="_ _9"></span><span class="ff2 ls0">通过<span class="_ _a"> </span><span class="ff1">i<span class="_ _0"> </span></span>节点记录文件的信息和内容</span>. <span class="_ _9"> </span><span class="ff2 ls0">事实上</span>, i<span class="_ _0"> </span><span class="ff2 ls0">节</span></span></div><div class="t m0 x3 h4 ya4 ff2 fs2 fc0 sc0 ls0 ws0">点直接记录的只是文件的属性<span class="ff1 lsf">, <span class="_ _9"></span></span>文件的具体内容存储在数据区的数据块中<span class="ff1 lsf">, i<span class="_ _0"> </span></span>节点中仅保留了一个<span class="ff1"><</span>磁盘地</div><div class="t m0 x3 h4 ya5 ff2 fs2 fc0 sc0 ls0 ws0">址表<span class="ff1">></span>来记录文件内容存储的位置<span class="ff1 lsf">. </span></div><div class="t m0 x4 h4 ya6 ff1 fs2 fc0 sc0 ls2 ws0"> <<span class="_ _6"></span><span class="ff2 ls0">磁盘文件表<span class="ff1">></span>由<span class="_ _a"> </span><span class="ff1 ls3a">13<span class="_ _0"> </span></span>个块号组成<span class="ff1 lsf">, <span class="_ _9"> </span></span>每个块号占用<span class="_ _1"> </span><span class="ff1">4<span class="_ _0"> </span></span>个字节<span class="ff1 lsf">, <span class="_ _9"> </span></span>代表了数据区中的一个数据块编号<span class="ff1 ls3b">.UNIX<span class="_ _0"> </span></span>文</span></div><div class="t m0 x3 h4 ya7 ff2 fs2 fc0 sc0 ls0 ws0">件系统采用三级索引结构存储文件<span class="ff1">,</span>它把<span class="ff1"><</span>磁盘地址表<span class="ff1">></span>分为直接索引地址<span class="ff1 lsf">, <span class="_ _9"></span></span>一级索引地址<span class="ff1 lsf">, <span class="_ _9"></span></span>二级索引地址和</div><div class="t m0 x3 h4 ya8 ff2 fs2 fc0 sc0 ls0 ws0">三级索引地址等四个部分<span class="ff1 lsf">. <span class="_ _9"></span></span>其中前<span class="_ _1"> </span><span class="ff1 ls3a">10<span class="_ _0"> </span></span>项为直接索引地址<span class="ff1 lsf">, <span class="_ _9"></span></span>直接指向文件数据所在磁盘快的块号<span class="ff1 lsf">. <span class="_ _9"></span></span>第</div><div class="t m0 x3 h4 ya9 ff1 fs2 fc0 sc0 ls3c ws0">11/12/13<span class="_ _4"> </span><span class="ff2 ls0">项分别为一级<span class="ff1">/</span>二级<span class="ff1">/</span>三级索引地址</span><span class="lsf">. <span class="_ _9"></span><span class="ff2 ls0">一级间接索引的含义在于其存储的并非文件数据所在磁盘块</span></span></div><div class="t m0 x3 h4 yaa ff2 fs2 fc0 sc0 ls0 ws0">的块号<span class="ff1 lsf">, <span class="_ _9"></span></span>而是先指向一个<span class="ff1"><</span>磁盘块号表<span class="ff1">></span>然后再指向具体磁盘块的块号<span class="ff1 lsf">. <span class="_ _9"></span></span>同理<span class="ff1 lsf">, <span class="_ _9"></span></span>二级<span class="ff1">/</span>三级间接索引则是先间</div><div class="t m0 x3 h4 yab ff2 fs2 fc0 sc0 ls0 ws0">接指向了两次<span class="ff1"><</span>磁盘块号表<span class="ff1">></span>才指向具体磁盘快的块号<span class="ff1 lsf">. </span></div><div class="t m0 x4 h4 yac ff1 fs2 fc0 sc0 ls2 ws0"> <span class="ff2 ls0">如果文件系统的数据块大小为<span class="_ _1"> </span></span><span class="ls17">1kB, <span class="_ _7"></span><span class="ff2 ls0">每个<span class="ff1"><</span>磁盘块号表<span class="ff1">><span class="_ _5"></span></span>能够记录<span class="_ _1"> </span></span><span class="ls6">256<span class="_ _4"> </span><span class="ff2 ls0">个数据项</span><span class="lsf">. <span class="_ _9"> </span><span class="ff2 ls0">那么</span>, <span class="_ _9"> </span><span class="ff2 ls0">直接索引能管辖</span></span></span></span></div><div class="t m0 x3 h4 yad ff1 fs2 fc0 sc0 ls6 ws0">10<span class="_ _0"> </span><span class="ff2 ls0">个数据块</span><span class="ls3d">, <span class="_ _9"></span><span class="ff2 ls0">而一级索引能管辖<span class="_ _1"> </span></span></span>1*</div><div class="t m0 xa h4 yae ff1 fs2 fc0 sc0 ls6 ws0">256<span class="_ _4"> </span><span class="ff2 ls0">个数据块</span><span class="lsf">, <span class="_ _9"> </span><span class="ff2 ls0">二级索引能管辖<span class="_ _1"> </span></span><span class="ls15">1*256*256(65536)<span class="ff2 ls0">个<span class="_ _3"></span>数据块<span class="ff1 lsf">, <span class="_ _9"></span></span>三级索引</span></span></span></div><div class="t m0 x3 h4 yaf ff2 fs2 fc0 sc0 ls0 ws0">能管辖<span class="_ _1"> </span><span class="ff1 ls3a">1*256*25<span class="_ _5"></span>6*256(1677<span class="_ _5"></span>7216)</span>个数据块<span class="ff1 lsf">. </span></div><div class="t m0 x4 h4 yb0 ff1 fs2 fc0 sc0 ls2 ws0"> <span class="ff2 ls0">例题</span><span class="ls17">: <span class="_ _9"></span><span class="ff2 ls0">大小为<span class="_ _1"> </span></span><span class="ls6">56000K<span class="_ _4"> </span><span class="ff2 ls0">的文件<span class="ff1">,</span>占用多少索引块空间</span><span class="ls3e">? </span></span></span></div><div class="t m0 x4 h4 yb1 ff1 fs2 fc0 sc0 ls2 ws0"> <span class="ff2 ls0">答</span><span class="ls17">: <span class="_ _9"></span><span class="ff2 ls0">因为</span><span class="ws1e">(10+256) < 5600<span class="_ _3"></span>0 < (10+256+<span class="_ _3"></span>65536), <span class="_ _7"></span><span class="ff2 ls0 ws0">故该文件具有二级间接索引</span><span class="ls3b ws1f">. (560<span class="_ _5"></span>00-10-256)/256<span class="_ _5"></span>=217.7, </span></span></span></div><div class="t m0 x3 h4 yb2 ff2 fs2 fc0 sc0 ls0 ws0">则文件需要二级间接索引块为<span class="_ _1"> </span><span class="ff1 ls6">218<span class="_ _4"> </span></span>个<span class="ff1">,</span>所以总索引块需要<span class="_ _1"> </span><span class="ff1 ls6">1(</span>一级间接索引块<span class="ff1 ls3f">)+1(</span>二级间接索引块<span class="ff1 ls17">)+218=220. </span></div><div class="t m0 x3 h7 yb3 ff3 fs4 fc0 sc0 ls38 ws0"> <span class="ff2 sc1 ls2f">磁盘文件读取示例</span><span class="ls0">(<span class="ff2 sc1">仿<span class="_ _2"> </span></span><span class="ls40">ls<span class="_"> </span><span class="ff2 sc1 ls2f">命令</span><span class="ls41">) </span></span></span></div><div class="t m0 x4 h4 yb4 ff1 fs2 fc0 sc0 ls2 ws0"> <span class="ff2 ls0">通过<span class="_ _1"> </span></span><span class="lsf">stat<span class="_ _0"> </span><span class="ff2 ls19">结构中<span class="_ _1"> </span></span><span class="ls1b">st_mode<span class="_ _4"> </span><span class="ff2 ls0">判断文件类型<span class="ff1"> </span></span></span></span></div><div class="t m0 x5 h2 yb5 ff1 fs0 fc0 sc0 ls1e ws17">int GetFileType(mode_t <span class="ls21 wsa">st_mode, ch<span class="_ _3"></span>ar *resp){ </span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>