<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/62750b88602a7856fe4a7121/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/62750b88602a7856fe4a7121/bg1.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">linux<span class="_ _0"> </span><span class="ff2">操作系统下<span class="_ _0"> </span></span>c<span class="_ _0"> </span><span class="ff2">语言编程入门</span><unix<span class="_ _0"> </span><span class="ff2">操作系统下同样适用</span>></div><div class="t m0 x1 h3 y3 ff2 fs0 fc0 sc0 ls0 ws0">加入时间<span class="ff1">: 2004-06-01 </span>价格<span class="ff1">: 10 </span>点击<span class="ff1">: 7346 </span>荐稿人<span class="ff1">: </span>小鱼<span class="ff1"> </span>原作者<span class="ff1">: </span></div><div class="t m0 x1 h3 y4 ff2 fs0 fc0 sc0 ls0 ws0">信息<span class="ff1">: </span>最新文章结算清单<span class="ff1"> >> </span>荐稿赚废墟币<span class="ff1"> >> </span>本站帮助说明<span class="ff1"> >><span class="_ _1"></span> </span>小鱼收藏集</div><div class="t m0 x1 h3 y5 ff2 fs0 fc0 sc0 ls0 ws0">导航<span class="_ _1"></span><span class="ff1">: <span class="_ _1"></span></span>首页<span class="ff1"> <span class="_ _1"></span>>> <span class="_ _1"></span></span>书<span class="_ _1"></span>库<span class="ff1"> <span class="_ _1"></span>>> <span class="_ _1"></span></span>栏目<span class="_ _1"></span><span class="ff1"> >><span class="_ _1"></span> linux<span class="_ _0"> </span></span>操<span class="_ _1"></span>作系统<span class="_ _1"></span>下<span class="_ _2"> </span><span class="ff1">c<span class="_ _0"> </span></span>语言编<span class="_ _1"></span>程入门<span class="_ _3"></span><span class="ff1"><unix<span class="_ _0"> </span></span>操作<span class="_ _1"></span>系统下<span class="_ _1"></span>同样适<span class="_ _1"></span>用</div><div class="t m0 x1 h4 y6 ff1 fs0 fc0 sc0 ls0 ws0">> </div><div class="t m0 x1 h4 y7 ff1 fs0 fc0 sc0 ls0 ws0"> </div><div class="t m0 x1 h3 y8 ff1 fs0 fc0 sc0 ls0 ws0">linux<span class="_ _0"> </span><span class="ff2">操作系统下<span class="_ _0"> </span></span>c<span class="_ _0"> </span><span class="ff2">语言编程入门</span> </div><div class="t m0 x1 h3 y9 ff2 fs0 fc0 sc0 ls0 ws0">整理编写:<span class="ff1">007xiong </span></div><div class="t m0 x1 h3 ya ff2 fs0 fc0 sc0 ls0 ws0">原文:<span class="ff1">Hoyt<span class="_ _0"> </span></span>等<span class="ff1"> </span></div><div class="t m0 x1 h3 yb ff1 fs0 fc0 sc0 ls0 ws0">(<span class="ff2">一</span>)<span class="ff2">目录介绍</span> </div><div class="t m0 x1 h3 yc ff1 fs0 fc0 sc0 ls0 ws0">1)Linux<span class="_ _0"> </span><span class="ff2">程序设计入门</span>--<span class="ff2">基础知识</span> </div><div class="t m0 x1 h3 yd ff1 fs0 fc0 sc0 ls0 ws0">2)Linux<span class="_ _0"> </span><span class="ff2">程序设计入门</span>--<span class="ff2">进程介绍</span> </div><div class="t m0 x1 h3 ye ff1 fs0 fc0 sc0 ls0 ws0">3)Linux<span class="_ _0"> </span><span class="ff2">程序设计入门</span>--<span class="ff2">文件操作</span> </div><div class="t m0 x1 h3 yf ff1 fs0 fc0 sc0 ls0 ws0">4)Linux<span class="_ _0"> </span><span class="ff2">程序设计入门</span>--<span class="ff2">时间概念</span> </div><div class="t m0 x1 h3 y10 ff1 fs0 fc0 sc0 ls0 ws0">5)Linux<span class="_ _0"> </span><span class="ff2">程序设计入门</span>--<span class="ff2">信号处理</span> </div><div class="t m0 x1 h3 y11 ff1 fs0 fc0 sc0 ls0 ws0">6)Linux<span class="_ _0"> </span><span class="ff2">程序设计入门</span>--<span class="ff2">消息管理</span> </div><div class="t m0 x1 h3 y12 ff1 fs0 fc0 sc0 ls0 ws0">7)Linux<span class="_ _0"> </span><span class="ff2">程序设计入门</span>--<span class="ff2">线程操作</span> </div><div class="t m0 x1 h3 y13 ff1 fs0 fc0 sc0 ls0 ws0">8)Linux<span class="_ _0"> </span><span class="ff2">程序设计入门</span>--<span class="ff2">网络编程</span> </div><div class="t m0 x1 h3 y14 ff1 fs0 fc0 sc0 ls0 ws0">9)Linux<span class="_ _0"> </span><span class="ff2">下<span class="_ _0"> </span></span>C<span class="_ _0"> </span><span class="ff2">开发工具介绍</span> </div><div class="t m0 x1 h3 y15 ff1 fs0 fc0 sc0 ls0 ws0">(<span class="ff2">二</span>)<span class="ff2">具体内容</span> </div><div class="t m0 x1 h3 y16 ff1 fs0 fc0 sc0 ls0 ws0">1)Linux<span class="_ _0"> </span><span class="ff2">程序设计入门</span>--<span class="ff2">基础知识</span> </div><div class="t m0 x1 h3 y17 ff1 fs0 fc0 sc0 ls0 ws0">Linux<span class="_ _0"> </span><span class="ff2">下<span class="_ _0"> </span></span>C<span class="_ _0"> </span><span class="ff2">语言编程基础知识</span> </div><div class="t m0 x1 h3 y18 ff2 fs0 fc0 sc0 ls0 ws0">前言<span class="ff1">: </span></div><div class="t m0 x1 h3 y19 ff2 fs0 fc0 sc0 ls0 ws0">这篇文章介绍在<span class="_ _0"> </span><span class="ff1">LINUX<span class="_ _0"> </span></span>下进行<span class="_ _0"> </span><span class="ff1">C<span class="_ _0"> </span></span>语言编程所需要的基础知识<span class="ff1">.</span>在这篇文章当中<span class="ff1">,</span>我们将<span class="ff1"> </span></div><div class="t m0 x1 h3 y1a ff2 fs0 fc0 sc0 ls0 ws0">会学到以下内容<span class="ff1">: </span></div><div class="t m0 x1 h3 y1b ff2 fs0 fc0 sc0 ls0 ws0">源程序编译<span class="ff1"> </span></div><div class="t m0 x1 h3 y1c ff1 fs0 fc0 sc0 ls0 ws0">Makefile<span class="_ _0"> </span><span class="ff2">的编写</span> </div><div class="t m0 x1 h3 y1d ff2 fs0 fc0 sc0 ls0 ws0">程序库的链接<span class="ff1"> </span></div><div class="t m0 x1 h3 y1e ff2 fs0 fc0 sc0 ls0 ws0">程序的调试<span class="ff1"> </span></div><div class="t m0 x1 h3 y1f ff2 fs0 fc0 sc0 ls0 ws0">头文件和系统求助<span class="ff1"> </span></div><div class="t m0 x1 h4 y20 ff1 fs0 fc0 sc0 ls0 ws0">---------------------------------------------------------------------------- </div><div class="t m0 x1 h4 y21 ff1 fs0 fc0 sc0 ls0 ws0">---- </div><div class="t m0 x1 h3 y22 ff1 fs0 fc0 sc0 ls0 ws0">1.<span class="ff2">源程序的编译</span> </div><div class="t m0 x1 h3 y23 ff2 fs0 fc0 sc0 ls0 ws0">在<span class="_ _0"> </span><span class="ff1">Linux<span class="_ _0"> </span></span>下面<span class="ff1">,</span>如果要编译一个<span class="_ _0"> </span><span class="ff1">C<span class="_ _0"> </span></span>语言源程序<span class="ff1">,</span>我们要使用<span class="_ _0"> </span><span class="ff1">GNU<span class="_ _0"> </span></span>的<span class="_ _0"> </span><span class="ff1">gcc<span class="_ _0"> </span></span>编译器<span class="ff1">. </span>下面我们<span class="ff1"> </span></div><div class="t m0 x1 h3 y24 ff2 fs0 fc0 sc0 ls0 ws0">以一个实例来说明如何使用<span class="_ _0"> </span><span class="ff1">gcc<span class="_ _0"> </span></span>编译器<span class="ff1">. </span></div><div class="t m0 x1 h3 y25 ff2 fs0 fc0 sc0 ls0 ws0">假设我们有下面一个非常简单的源程序<span class="ff1">(hello.c): </span></div><div class="t m0 x1 h4 y26 ff1 fs0 fc0 sc0 ls0 ws0">int main(int argc,char **ar<span class="_ _4"></span>gv) </div><div class="t m0 x1 h4 y27 ff1 fs0 fc0 sc0 ls0 ws0">{ </div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,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/62750b88602a7856fe4a7121/bg2.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h4 y28 ff1 fs0 fc0 sc0 ls0 ws0">printf("Hello Linux\n"); </div><div class="t m0 x1 h4 y29 ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x1 h3 y3 ff2 fs0 fc0 sc0 ls0 ws0">要编译这个程序<span class="ff1">,</span>我们只要在命令行下执行<span class="ff1">: </span></div><div class="t m0 x1 h4 y2a ff1 fs0 fc0 sc0 ls0 ws0">gcc -o hello hello.c </div><div class="t m0 x1 h3 y5 ff1 fs0 fc0 sc0 ls0 ws0">gcc <span class="ff2">编译器就会为我们生成一个<span class="_ _0"> </span></span>hello<span class="_ _0"> </span><span class="ff2">的可执行文件</span>.<span class="ff2">执行</span>./hello<span class="_ _0"> </span><span class="ff2">就可以看到程序的输出</span> </div><div class="t m0 x1 h3 y2b ff2 fs0 fc0 sc0 ls0 ws0">结果了<span class="ff1">.</span>命令行中<span class="ff1"> gcc<span class="_ _0"> </span></span>表示我们是用<span class="_ _0"> </span><span class="ff1">gcc<span class="_ _0"> </span></span>来编译我们的源程序<span class="ff1">,-o </span>选项表示我们要求编译<span class="ff1"> </span></div><div class="t m0 x1 h3 y2c ff2 fs0 fc0 sc0 ls0 ws0">器给我们输出的可执行文件名为<span class="_ _0"> </span><span class="ff1">hello </span>而<span class="_ _0"> </span><span class="ff1">hello.c<span class="_ _0"> </span></span>是我们的源程序文件<span class="ff1">. </span></div><div class="t m0 x1 h3 y2d ff1 fs0 fc0 sc0 ls0 ws0">gcc<span class="_ _0"> </span><span class="ff2">编译器有许多选项</span>,<span class="ff2">一般来说我们只要知道其中的几个就够了</span>. -o<span class="_ _0"> </span><span class="ff2">选项我们已经知道</span> </div><div class="t m0 x1 h3 y8 ff2 fs0 fc0 sc0 ls0 ws0">了<span class="ff1">,</span>表示我们要求输出的可执行文件名<span class="ff1">. -c<span class="_ _0"> </span></span>选项表示我们只要求编译器输出目标代码<span class="ff1">,</span>而<span class="ff1"> </span></div><div class="t m0 x1 h3 y9 ff2 fs0 fc0 sc0 ls0 ws0">不必要输出可执行文件<span class="ff1">. -g<span class="_ _0"> </span></span>选项表示我们要求编译器在编译的时候提供我们以后对程序<span class="ff1"> </span></div><div class="t m0 x1 h3 ya ff2 fs0 fc0 sc0 ls0 ws0">进行调试的信息<span class="ff1">. </span></div><div class="t m0 x1 h3 y2e ff2 fs0 fc0 sc0 ls0 ws0">知道了这三个选项<span class="ff1">,</span>我们就可以编译我们自己所写的简单的源程序了<span class="ff1">,</span>如果你想要知道更<span class="ff1"> </span></div><div class="t m0 x1 h3 yb ff2 fs0 fc0 sc0 ls0 ws0">多的选项<span class="ff1">,</span>可以查看<span class="_ _0"> </span><span class="ff1">gcc<span class="_ _0"> </span></span>的帮助文档<span class="ff1">,</span>那里有着许多对其它选项的详细说明<span class="ff1">. </span></div><div class="t m0 x1 h3 y2f ff1 fs0 fc0 sc0 ls0 ws0">2.Makefile<span class="_ _0"> </span><span class="ff2">的编写</span> </div><div class="t m0 x1 h3 yc ff2 fs0 fc0 sc0 ls0 ws0">假设我们有下面这样的一个程序<span class="ff1">,</span>源代码如下<span class="ff1">: </span></div><div class="t m0 x1 h4 y30 ff1 fs0 fc0 sc0 ls0 ws0">/* main.c */ </div><div class="t m0 x1 h4 y31 ff1 fs0 fc0 sc0 ls0 ws0">#include "mytool1.h" </div><div class="t m0 x1 h4 y32 ff1 fs0 fc0 sc0 ls0 ws0">#include "mytool2.h" </div><div class="t m0 x1 h4 y33 ff1 fs0 fc0 sc0 ls0 ws0">int main(int argc,char **ar<span class="_ _4"></span>gv) </div><div class="t m0 x1 h4 y34 ff1 fs0 fc0 sc0 ls0 ws0">{ </div><div class="t m0 x1 h4 y35 ff1 fs0 fc0 sc0 ls0 ws0">mytool1_print("hello"); </div><div class="t m0 x1 h4 y36 ff1 fs0 fc0 sc0 ls0 ws0">mytool2_print("hello"); </div><div class="t m0 x1 h4 y37 ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x1 h4 y38 ff1 fs0 fc0 sc0 ls0 ws0">/* mytool1.h */ </div><div class="t m0 x1 h4 y39 ff1 fs0 fc0 sc0 ls0 ws0">#ifndef _MYT<span class="_ _4"></span>OOL_1_H </div><div class="t m0 x1 h4 y3a ff1 fs0 fc0 sc0 ls0 ws0">#define _MYTOOL_1_H </div><div class="t m0 x1 h4 y3b ff1 fs0 fc0 sc0 ls0 ws0">void mytool1_print(char *print_str); </div><div class="t m0 x1 h4 y3c ff1 fs0 fc0 sc0 ls0 ws0">#endif </div><div class="t m0 x1 h4 y3d ff1 fs0 fc0 sc0 ls0 ws0">/* mytool1.c */ </div><div class="t m0 x1 h4 y3e ff1 fs0 fc0 sc0 ls0 ws0">#include "mytool1.h" </div><div class="t m0 x1 h4 y3f ff1 fs0 fc0 sc0 ls0 ws0">void mytool1_print(char *print_str) </div><div class="t m0 x1 h4 y40 ff1 fs0 fc0 sc0 ls0 ws0">{ </div><div class="t m0 x1 h4 y41 ff1 fs0 fc0 sc0 ls0 ws0">printf("This is mytool1 print %s\n",print_str); </div><div class="t m0 x1 h4 y42 ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x1 h4 y43 ff1 fs0 fc0 sc0 ls0 ws0">/* mytool2.h */ </div><div class="t m0 x1 h4 y44 ff1 fs0 fc0 sc0 ls0 ws0">#ifndef _MYT<span class="_ _4"></span>OOL_2_H </div><div class="t m0 x1 h4 y20 ff1 fs0 fc0 sc0 ls0 ws0">#define _MYTOOL_2_H </div><div class="t m0 x1 h4 y21 ff1 fs0 fc0 sc0 ls0 ws0">void mytool2_print(char *print_str); </div><div class="t m0 x1 h4 y45 ff1 fs0 fc0 sc0 ls0 ws0">#endif </div><div class="t m0 x1 h4 y46 ff1 fs0 fc0 sc0 ls0 ws0">/* mytool2.c */ </div><div class="t m0 x1 h4 y47 ff1 fs0 fc0 sc0 ls0 ws0">#include "mytool2.h" </div><div class="t m0 x1 h4 y48 ff1 fs0 fc0 sc0 ls0 ws0">void mytool2_print(char *print_str) </div><div class="t m0 x1 h4 y26 ff1 fs0 fc0 sc0 ls0 ws0">{ </div><div class="t m0 x1 h4 y27 ff1 fs0 fc0 sc0 ls0 ws0">printf("This is mytool2 print %s\n",print_str); </div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,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/62750b88602a7856fe4a7121/bg3.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h4 y28 ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x1 h3 y49 ff2 fs0 fc0 sc0 ls0 ws0">当然由于这个程序是很短的我们可以这样来编译<span class="ff1"> </span></div><div class="t m0 x1 h4 y4a ff1 fs0 fc0 sc0 ls0 ws0">gcc -c main.c </div><div class="t m0 x1 h4 y2a ff1 fs0 fc0 sc0 ls0 ws0">gcc -c mytool1.c </div><div class="t m0 x1 h4 y4b ff1 fs0 fc0 sc0 ls0 ws0">gcc -c mytool2.c </div><div class="t m0 x1 h4 y6 ff1 fs0 fc0 sc0 ls0 ws0">gcc -o main main.o mytool1.o mytool2.o </div><div class="t m0 x1 h3 y2c ff2 fs0 fc0 sc0 ls0 ws0">这样的话我们也可以产生<span class="_ _0"> </span><span class="ff1">main<span class="_ _0"> </span></span>程序<span class="ff1">,</span>而且也不时很麻烦<span class="ff1">.</span>但是如果我们考虑一下如果有一<span class="ff1"> </span></div><div class="t m0 x1 h3 y2d ff2 fs0 fc0 sc0 ls0 ws0">天我们修改了其中的一个文件<span class="ff1">(</span>比如说<span class="_ _0"> </span><span class="ff1">mytool1.c)</span>那么我们难道还要重新输入上面的命令<span class="ff1"> </span></div><div class="t m0 x1 h3 y8 ff1 fs0 fc0 sc0 ls0 ws0">?<span class="ff2">也许你会说</span>,<span class="ff2">这个很容易解决啊</span>,<span class="ff2">我写一个<span class="_ _0"> </span></span>SHELL<span class="_ _0"> </span><span class="ff2">脚本</span>,<span class="ff2">让她帮我去完成不就可以了</span>.<span class="ff2">是的</span> </div><div class="t m0 x1 h3 y9 ff2 fs0 fc0 sc0 ls0 ws0">对于这个程序来说<span class="ff1">,</span>是可以起到作用的<span class="ff1">.</span>但是当我们把事情想的更复杂一点<span class="ff1">,</span>如果我们的程<span class="ff1"> </span></div><div class="t m0 x1 h3 ya ff2 fs0 fc0 sc0 ls0 ws0">序有几百个源程序的时候<span class="ff1">,</span>难道也要编译器重新一个一个的去编译<span class="ff1">? </span></div><div class="t m0 x1 h3 y2e ff2 fs0 fc0 sc0 ls0 ws0">为此<span class="ff1">,</span>聪明的程序员们想出了一个很好的工具来做这件事情<span class="ff1">,</span>这就是<span class="_ _0"> </span><span class="ff1">make.</span>我们只要执行以<span class="ff1"> </span></div><div class="t m0 x1 h3 yb ff2 fs0 fc0 sc0 ls0 ws0">下<span class="_ _0"> </span><span class="ff1">make,</span>就可以把上面的问题解决掉<span class="ff1">.</span>在我们执行<span class="_ _0"> </span><span class="ff1">make<span class="_ _0"> </span></span>之前<span class="ff1">,</span>我们要先编写一个非常重要的<span class="ff1"> </span></div><div class="t m0 x1 h3 y2f ff2 fs0 fc0 sc0 ls0 ws0">文件<span class="ff1">.--Makefile.</span>对于上面的那个程序来说<span class="ff1">,</span>可能的一个<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span></span>的文件是<span class="ff1">: </span></div><div class="t m0 x1 h3 yc ff1 fs0 fc0 sc0 ls0 ws0"># <span class="ff2">这是上面那个程序的<span class="_ _0"> </span></span>Makefile<span class="_ _0"> </span><span class="ff2">文件</span> </div><div class="t m0 x1 h4 y30 ff1 fs0 fc0 sc0 ls0 ws0">main:main.o mytool1.o mytool2.o </div><div class="t m0 x1 h4 y31 ff1 fs0 fc0 sc0 ls0 ws0">gcc -o main main.o mytool1.o mytool2.o </div><div class="t m0 x1 h4 y32 ff1 fs0 fc0 sc0 ls0 ws0">main.o:main.c mytool1.h mytool2.h </div><div class="t m0 x1 h4 y33 ff1 fs0 fc0 sc0 ls0 ws0">gcc -c main.c </div><div class="t m0 x1 h4 y34 ff1 fs0 fc0 sc0 ls0 ws0">mytool1.o:mytool1.c mytool1.h </div><div class="t m0 x1 h4 y35 ff1 fs0 fc0 sc0 ls0 ws0">gcc -c mytool1.c </div><div class="t m0 x1 h4 y36 ff1 fs0 fc0 sc0 ls0 ws0">mytool2.o:mytool2.c mytool2.h </div><div class="t m0 x1 h4 y37 ff1 fs0 fc0 sc0 ls0 ws0">gcc -c mytool2.c </div><div class="t m0 x1 h3 y4c ff2 fs0 fc0 sc0 ls0 ws0">有了这个<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span></span>文件<span class="ff1">,</span>不过我们什么时候修改了源程序当中的什么文件<span class="ff1">,</span>我们只要执行<span class="ff1"> </span></div><div class="t m0 x1 h3 y15 ff1 fs0 fc0 sc0 ls0 ws0">make<span class="_ _0"> </span><span class="ff2">命令</span>,<span class="ff2">我们的编译器都只会去编译和我们修改的文件有关的文件</span>,<span class="ff2">其它的文件她连理</span> </div><div class="t m0 x1 h3 y4d ff2 fs0 fc0 sc0 ls0 ws0">都不想去理的<span class="ff1">. </span></div><div class="t m0 x1 h3 y16 ff2 fs0 fc0 sc0 ls0 ws0">下面我们学习<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span></span>是如何编写的<span class="ff1">. </span></div><div class="t m0 x1 h3 y17 ff2 fs0 fc0 sc0 ls0 ws0">在<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span></span>中也<span class="ff1">#</span>开始的行都是注释行<span class="ff1">.Makefile<span class="_ _0"> </span></span>中最重要的是描述文件的依赖关系的说<span class="ff1"> </span></div><div class="t m0 x1 h3 y18 ff2 fs0 fc0 sc0 ls0 ws0">明<span class="ff1">.</span>一般的格式是<span class="ff1">: </span></div><div class="t m0 x1 h4 y3e ff1 fs0 fc0 sc0 ls0 ws0">target: components </div><div class="t m0 x1 h4 y3f ff1 fs0 fc0 sc0 ls0 ws0">T<span class="_ _5"></span>AB rule </div><div class="t m0 x1 h5 y1b ff3 fs0 fc0 sc0 ls0 ws0">第<span class="ff2">一行表示的是依赖关系<span class="ff1">.</span></span>第<span class="ff2">二行是</span>规则<span class="ff1">. </span></div><div class="t m0 x1 h5 y1c ff2 fs0 fc0 sc0 ls0 ws0">比如说我们上面的那个<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span></span>文件的<span class="ff3">第</span>二行<span class="ff1"> </span></div><div class="t m0 x1 h4 y42 ff1 fs0 fc0 sc0 ls0 ws0">main:main.o mytool1.o mytool2.o </div><div class="t m0 x1 h5 y1e ff2 fs0 fc0 sc0 ls0 ws0">表示我们的目标<span class="ff1">(target)main<span class="_ _0"> </span></span>的依赖对<span class="ff3">象<span class="ff1">(components)</span></span>是<span class="_ _0"> </span><span class="ff1">main.o mytool1.o mytool2.<span class="_ _4"></span>o </span></div><div class="t m0 x1 h5 y1f ff2 fs0 fc0 sc0 ls0 ws0">当<span class="ff3">倚</span>赖的对<span class="ff3">象</span>在目标修改后修改的话<span class="ff1">,</span>就要去执行<span class="ff3">规则</span>一行所<span class="ff3">指定</span>的命令<span class="ff1">.</span>就<span class="ff3">象</span>我们的上<span class="ff1"> </span></div><div class="t m0 x1 h5 y4e ff2 fs0 fc0 sc0 ls0 ws0">面那个<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span><span class="ff3">第</span></span>三行所说的一样要执行<span class="ff1"> gcc -o main main.o mytool1.o mytool2.o </span></div><div class="t m0 x1 h5 y4f ff2 fs0 fc0 sc0 ls0 ws0">注<span class="ff3">意规则</span>一行中的<span class="_ _0"> </span><span class="ff1">T<span class="_ _5"></span>AB<span class="_ _0"> </span><span class="ff2">表示那里是一个<span class="_ _0"> </span></span>T<span class="_ _5"></span>AB<span class="_ _0"> </span><span class="ff3">键</span> </span></div><div class="t m0 x1 h5 y22 ff1 fs0 fc0 sc0 ls0 ws0">Makefile<span class="_ _0"> </span><span class="ff2">有三个非常有用的<span class="ff3">变量</span></span>.<span class="ff3">分别<span class="ff2">是</span></span>$@,$^,$<<span class="ff2">代表的<span class="ff3">意义分别</span>是</span>: </div><div class="t m0 x1 h5 y23 ff1 fs0 fc0 sc0 ls0 ws0">$@--<span class="ff2">目标文件</span>,$^--<span class="ff2">所有的依赖文件</span>,$<--<span class="ff3">第<span class="ff2">一个依赖文件</span></span>. </div><div class="t m0 x1 h5 y24 ff2 fs0 fc0 sc0 ls0 ws0">如果我们使用上面三个<span class="ff3">变量<span class="ff1">,</span></span>那么我们可以简<span class="ff3">化</span>我们的<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span></span>文件为<span class="ff1">: </span></div><div class="t m0 x1 h5 y25 ff1 fs0 fc0 sc0 ls0 ws0"># <span class="ff2">这是简<span class="ff3">化</span>后的<span class="_ _0"> </span></span>Makefile </div><div class="t m0 x1 h4 y26 ff1 fs0 fc0 sc0 ls0 ws0">main:main.o mytool1.o mytool2.o </div><div class="t m0 x1 h4 y27 ff1 fs0 fc0 sc0 ls0 ws0">gcc -o $@ $^ </div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,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/62750b88602a7856fe4a7121/bg4.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h4 y28 ff1 fs0 fc0 sc0 ls0 ws0">main.o:main.c mytool1.h mytool2.h </div><div class="t m0 x1 h4 y29 ff1 fs0 fc0 sc0 ls0 ws0">gcc -c $< </div><div class="t m0 x1 h4 y4a ff1 fs0 fc0 sc0 ls0 ws0">mytool1.o:mytool1.c mytool1.h </div><div class="t m0 x1 h4 y2a ff1 fs0 fc0 sc0 ls0 ws0">gcc -c $< </div><div class="t m0 x1 h4 y4b ff1 fs0 fc0 sc0 ls0 ws0">mytool2.o:mytool2.c mytool2.h </div><div class="t m0 x1 h4 y6 ff1 fs0 fc0 sc0 ls0 ws0">gcc -c $< </div><div class="t m0 x1 h5 y2c ff2 fs0 fc0 sc0 ls0 ws0">经过简<span class="ff3">化</span>后我们的<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span></span>是简单了一点<span class="ff1">,</span>不过人们有时候还想简单一点<span class="ff1">.</span>这里我们学习<span class="ff1"> </span></div><div class="t m0 x1 h5 y2d ff2 fs0 fc0 sc0 ls0 ws0">一个<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span></span>的<span class="ff3">缺省规则<span class="ff1"> </span></span></div><div class="t m0 x1 h4 y50 ff1 fs0 fc0 sc0 ls0 ws0">..c.o: </div><div class="t m0 x1 h4 y51 ff1 fs0 fc0 sc0 ls0 ws0">gcc -c $< </div><div class="t m0 x1 h5 ya ff2 fs0 fc0 sc0 ls0 ws0">这个<span class="ff3">规则</span>表示所有的<span class="ff1"> .o<span class="_ _0"> </span></span>文件都是依赖<span class="ff3">与相应</span>的<span class="ff1">.c<span class="_ _0"> </span></span>文件的<span class="ff1">.</span>例如<span class="_ _0"> </span><span class="ff1">mytool.o<span class="_ _0"> </span></span>依赖于<span class="_ _0"> </span><span class="ff1">mytool.c </span></div><div class="t m0 x1 h5 y2e ff2 fs0 fc0 sc0 ls0 ws0">这样<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span></span>还可以<span class="ff3">变</span>为<span class="ff1">: </span></div><div class="t m0 x1 h5 yb ff1 fs0 fc0 sc0 ls0 ws0"># <span class="ff2">这是<span class="ff3">再</span>一<span class="ff3">次</span>简<span class="ff3">化</span>后的<span class="_ _0"> </span></span>Makefile </div><div class="t m0 x1 h4 y52 ff1 fs0 fc0 sc0 ls0 ws0">main:main.o mytool1.o mytool2.o </div><div class="t m0 x1 h4 y53 ff1 fs0 fc0 sc0 ls0 ws0">gcc -o $@ $^ </div><div class="t m0 x1 h4 y30 ff1 fs0 fc0 sc0 ls0 ws0">..c.o: </div><div class="t m0 x1 h4 y31 ff1 fs0 fc0 sc0 ls0 ws0">gcc -c $< </div><div class="t m0 x1 h5 yf ff2 fs0 fc0 sc0 ls0 ws0">好了<span class="ff1">,</span>我们的<span class="_ _0"> </span><span class="ff1">Makefile </span>也<span class="ff3">差</span>不多了<span class="ff1">,</span>如果想知道更多的关于<span class="_ _0"> </span><span class="ff1">Makefile<span class="_ _0"> </span><span class="ff3">规则</span></span>可以查看<span class="ff3">相应</span>的<span class="ff1"> </span></div><div class="t m0 x1 h3 y10 ff2 fs0 fc0 sc0 ls0 ws0">文档<span class="ff1">. </span></div><div class="t m0 x1 h3 y11 ff1 fs0 fc0 sc0 ls0 ws0">3.<span class="ff2">程序库的链接</span> </div><div class="t m0 x1 h3 y12 ff2 fs0 fc0 sc0 ls0 ws0">试着编译下面这个程序<span class="ff1"> </span></div><div class="t m0 x1 h4 y36 ff1 fs0 fc0 sc0 ls0 ws0">/* temp.c */ </div><div class="t m0 x1 h4 y37 ff1 fs0 fc0 sc0 ls0 ws0">#include <math.h> </div><div class="t m0 x1 h4 y38 ff1 fs0 fc0 sc0 ls0 ws0">int main(int argc,char **ar<span class="_ _4"></span>gv) </div><div class="t m0 x1 h4 y39 ff1 fs0 fc0 sc0 ls0 ws0">{ </div><div class="t m0 x1 h4 y3a ff1 fs0 fc0 sc0 ls0 ws0">double value; </div><div class="t m0 x1 h4 y3b ff1 fs0 fc0 sc0 ls0 ws0">printf("V<span class="_ _6"></span>alue:%f\n",value); </div><div class="t m0 x1 h4 y3c ff1 fs0 fc0 sc0 ls0 ws0">} </div><div class="t m0 x1 h5 y18 ff2 fs0 fc0 sc0 ls0 ws0">这个程序<span class="ff3">相</span>当简单<span class="ff1">,</span>但是当我们用<span class="ff1"> gcc -o temp temp.c </span>编译时会出<span class="ff3">现</span>下面所示的<span class="ff3">错误<span class="ff1">. </span></span></div><div class="t m0 x1 h4 y3f ff1 fs0 fc0 sc0 ls0 ws0">/tmp/cc33Kydu.o: In function `main': </div><div class="t m0 x1 h4 y40 ff1 fs0 fc0 sc0 ls0 ws0">/tmp/cc33Kydu.o(.text+0xe): undefined reference to `log' </div><div class="t m0 x1 h4 y41 ff1 fs0 fc0 sc0 ls0 ws0">collect2: ld returned 1 exit status </div><div class="t m0 x1 h5 y1d ff2 fs0 fc0 sc0 ls0 ws0">出<span class="ff3">现</span>这个<span class="ff3">错误</span>是<span class="ff3">因</span>为编译器<span class="ff3">找</span>不到<span class="_ _0"> </span><span class="ff1">log<span class="_ _0"> </span></span>的具体实<span class="ff3">现<span class="ff1">.</span>虽</span>然我们<span class="ff3">包括</span>了<span class="ff3">正确</span>的头文件<span class="ff1">,</span>但是我<span class="ff1"> </span></div><div class="t m0 x1 h5 y1e ff2 fs0 fc0 sc0 ls0 ws0">们在编译的时候还是要连接<span class="ff3">确定</span>的库<span class="ff1">.</span>在<span class="_ _0"> </span><span class="ff1">Linux<span class="_ _0"> </span></span>下<span class="ff1">,</span>为了使用<span class="ff3">数</span>学<span class="ff3">函数<span class="ff1">,</span></span>我们必<span class="ff3">须</span>和<span class="ff3">数</span>学库<span class="ff1"> </span></div><div class="t m0 x1 h5 y1f ff2 fs0 fc0 sc0 ls0 ws0">连接<span class="ff1">,</span>为此我们要加入<span class="ff1"> -lm </span>选项<span class="ff1">. gcc -o temp temp.c -lm<span class="_ _0"> </span></span>这样<span class="ff3">才</span>能够<span class="ff3">正确</span>的编译<span class="ff1">.</span>也许<span class="ff1"> </span></div><div class="t m0 x1 h5 y4e ff2 fs0 fc0 sc0 ls0 ws0">有人要问<span class="ff1">,</span>前面我们用<span class="_ _0"> </span><span class="ff1">printf<span class="_ _0"> </span><span class="ff3">函数</span></span>的时候<span class="ff3">怎</span>么<span class="ff3">没</span>有连接库<span class="ff3">呢<span class="ff1">?</span></span>是这样的<span class="ff1">,</span>对于一<span class="ff3">些</span>常用的<span class="ff3">函<span class="ff1"> </span></span></div><div class="t m0 x1 h5 y4f ff3 fs0 fc0 sc0 ls0 ws0">数<span class="ff2">的实</span>现<span class="ff1">,gcc<span class="_ _0"> </span><span class="ff2">编译器会自</span></span>动<span class="ff2">去连接一</span>些<span class="ff2">常用库<span class="ff1">,</span>这样我们就</span>没<span class="ff2">有必要自己去</span>指定<span class="ff2">了<span class="ff1">. </span>有时<span class="ff1"> </span></span></div><div class="t m0 x1 h5 y22 ff2 fs0 fc0 sc0 ls0 ws0">候我们在编译程序的时候还要<span class="ff3">指定</span>库的<span class="ff3">路径<span class="ff1">,</span></span>这个时候我们要用到编译器的<span class="ff1"> -L<span class="_ _0"> </span></span>选项<span class="ff3">指定<span class="ff1"> </span></span></div><div class="t m0 x1 h5 y23 ff3 fs0 fc0 sc0 ls0 ws0">路径<span class="ff1">.<span class="ff2">比如说我们有一个库在</span> /home/hoyt/mylib<span class="_ _0"> </span><span class="ff2">下</span>,<span class="ff2">这样我们编译的时候还要加上</span> -L/h </span></div><div class="t m0 x1 h5 y24 ff1 fs0 fc0 sc0 ls0 ws0">ome/hoyt/mylib.<span class="ff2">对于一<span class="ff3">些</span>标<span class="ff3">准</span>库来说</span>,<span class="ff2">我们<span class="ff3">没</span>有必要<span class="ff3">指</span>出<span class="ff3">路径</span></span>.<span class="ff2">只要它们在起<span class="ff3">缺省</span>库的<span class="ff3">路</span></span> </div><div class="t m0 x1 h5 y25 ff3 fs0 fc0 sc0 ls0 ws0">径<span class="ff2">下就可以了<span class="ff1">.</span>系统的</span>缺省<span class="ff2">库的</span>路径<span class="ff1">/lib /usr/lib /usr/local/lib <span class="ff2">在这三个</span></span>路径<span class="ff2">下面<span class="ff1"> </span></span></div><div class="t m0 x1 h5 y54 ff2 fs0 fc0 sc0 ls0 ws0">的库<span class="ff1">,</span>我们可以不<span class="ff3">指定路径<span class="ff1">. </span></span></div><div class="t m0 x1 h5 y55 ff2 fs0 fc0 sc0 ls0 ws0">还有一个问题<span class="ff1">,</span>有时候我们使用了<span class="ff3">某</span>个<span class="ff3">函数<span class="ff1">,</span></span>但是我们不知道库的名<span class="ff3">字<span class="ff1">,</span></span>这个时候<span class="ff3">怎</span>么<span class="ff3">办呢<span class="ff1"> </span></span></div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,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/62750b88602a7856fe4a7121/bg5.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h5 y2 ff1 fs0 fc0 sc0 ls0 ws0">?<span class="ff2">很<span class="ff3">抱歉</span></span>,<span class="ff2">对于这个问题我也不知道<span class="ff3">答案</span></span>,<span class="ff2">我只有一个<span class="ff3">傻办法</span></span>.<span class="ff2">首先</span>,<span class="ff2">我到标<span class="ff3">准</span>库<span class="ff3">路径</span>下面去</span> </div><div class="t m0 x1 h5 y49 ff3 fs0 fc0 sc0 ls0 ws0">找<span class="ff2">看看有</span>没<span class="ff2">有和我用的</span>函数相<span class="ff2">关的库<span class="ff1">,</span>我就这样</span>找<span class="ff2">到了线程<span class="ff1">(thread)</span></span>函数<span class="ff2">的库文件<span class="ff1">(libp </span></span></div><div class="t m0 x1 h5 y3 ff1 fs0 fc0 sc0 ls0 ws0">thread.a). <span class="ff2">当然</span>,<span class="ff2">如果<span class="ff3">找</span>不到</span>,<span class="ff2">只有一个<span class="ff3">笨方法</span></span>.<span class="ff2">比如我要<span class="ff3">找<span class="_ _0"> </span></span></span>sin<span class="_ _0"> </span><span class="ff2">这个<span class="ff3">函数</span>所在的库</span>. <span class="ff2">就只</span> </div><div class="t m0 x1 h5 y4 ff2 fs0 fc0 sc0 ls0 ws0">好用<span class="ff1"> nm -o /lib/*.so|grep sin>~/sin </span>命令<span class="ff1">,</span>然后看<span class="ff1">~/sin<span class="_ _0"> </span></span>文件<span class="ff1">,</span>到那里面去<span class="ff3">找</span>了<span class="ff1">. </span>在<span class="_ _0"> </span><span class="ff1">s </span></div><div class="t m0 x1 h5 y5 ff1 fs0 fc0 sc0 ls0 ws0">in<span class="_ _0"> </span><span class="ff2">文件当中</span>,<span class="ff2">我会<span class="ff3">找</span>到这样的一行<span class="_ _0"> </span></span>libm-2.1.2.so:00009fa0 <span class="_ _4"></span>W sin <span class="ff2">这样我就知道了<span class="_ _0"> </span></span>sin<span class="_ _0"> </span><span class="ff2">在</span> </div><div class="t m0 x1 h5 y2b ff1 fs0 fc0 sc0 ls0 ws0">libm-2.1.2.so<span class="_ _0"> </span><span class="ff2">库里面</span>,<span class="ff2">我用</span> -lm<span class="_ _0"> </span><span class="ff2">选项就可以了</span>(<span class="ff2">去掉前面的<span class="_ _0"> </span></span>lib<span class="_ _0"> </span><span class="ff2">和后面的<span class="ff3">版</span>本标<span class="ff3">志</span></span>,<span class="ff2">就<span class="ff3">剩</span></span> </div><div class="t m0 x1 h5 y2c ff2 fs0 fc0 sc0 ls0 ws0">下<span class="_ _0"> </span><span class="ff1">m<span class="_ _0"> </span></span>了所以是<span class="ff1"> -lm). </span>如果你知道<span class="ff3">怎</span>么<span class="ff3">找<span class="ff1">,</span>请赶快告诉</span>我<span class="ff1">,</span>我<span class="ff3">回</span>非常<span class="ff3">感激</span>的<span class="ff1">.<span class="ff3">谢谢</span>! </span></div><div class="t m0 x1 h3 y2d ff1 fs0 fc0 sc0 ls0 ws0">4.<span class="ff2">程序的调试</span> </div><div class="t m0 x1 h5 y8 ff2 fs0 fc0 sc0 ls0 ws0">我们编写的程序不<span class="ff3">太</span>可能一<span class="ff3">次性</span>就会成<span class="ff3">功</span>的<span class="ff1">,</span>在我们的程序当中<span class="ff1">,</span>会出<span class="ff3">现</span>许许多多我<span class="ff1"> </span></div><div class="t m0 x1 h5 y9 ff2 fs0 fc0 sc0 ls0 ws0">们想不到的<span class="ff3">错误<span class="ff1">,</span></span>这个时候我们就要对我们的程序进行调试了<span class="ff1">. </span></div><div class="t m0 x1 h5 ya ff2 fs0 fc0 sc0 ls0 ws0">最常用的调试<span class="ff3">软</span>件是<span class="_ _0"> </span><span class="ff1">gdb.</span>如果你想在<span class="ff3">图形界</span>面下调试程序<span class="ff1">,</span>那么你<span class="ff3">现</span>在可以选<span class="ff3">择<span class="_ _0"> </span><span class="ff1">xxgdb.</span>记<span class="ff1"> </span></span></div><div class="t m0 x1 h5 y2e ff3 fs0 fc0 sc0 ls0 ws0">得<span class="ff2">要在编译的时候加入<span class="ff1"> -g<span class="_ _0"> </span></span>选项<span class="ff1">.</span>关于<span class="_ _0"> </span><span class="ff1">gdb<span class="_ _0"> </span></span>的使用可以看<span class="_ _0"> </span><span class="ff1">gdb<span class="_ _0"> </span></span>的帮助文件<span class="ff1">.</span>由于我</span>没<span class="ff2">有用过这<span class="ff1"> </span></span></div><div class="t m0 x1 h5 yb ff2 fs0 fc0 sc0 ls0 ws0">个<span class="ff3">软</span>件<span class="ff1">,</span>所以我也不能够说出如何使用<span class="ff1">. </span>不过我不<span class="ff3">喜欢</span>用<span class="_ _0"> </span><span class="ff1">gdb.<span class="ff3">跟踪</span></span>一个程序是很烦的事情<span class="ff1"> </span></div><div class="t m0 x1 h5 y2f ff1 fs0 fc0 sc0 ls0 ws0">,<span class="ff2">我一般用在程序当中输出中间<span class="ff3">变量</span>的<span class="ff3">值</span>来调试程序的</span>.<span class="ff2">当然你可以选<span class="ff3">择</span>自己的<span class="ff3">办法</span></span>,<span class="ff3">没<span class="ff2">有</span></span> </div><div class="t m0 x1 h5 yc ff2 fs0 fc0 sc0 ls0 ws0">必要去学<span class="ff3">别</span>人的<span class="ff1">.<span class="ff3">现</span></span>在有了许多<span class="_ _0"> </span><span class="ff1">IDE<span class="_ _0"> </span><span class="ff3">环境</span>,</span>里面已经自己<span class="ff3">带</span>了调试器了<span class="ff1">.</span>你可以选<span class="ff3">择</span>几个试<span class="ff1"> </span></div><div class="t m0 x1 h5 yd ff2 fs0 fc0 sc0 ls0 ws0">一试<span class="ff3">找</span>出自己<span class="ff3">喜欢</span>的一个用<span class="ff1">. </span></div><div class="t m0 x1 h3 ye ff1 fs0 fc0 sc0 ls0 ws0">5.<span class="ff2">头文件和系统求助</span> </div><div class="t m0 x1 h5 yf ff2 fs0 fc0 sc0 ls0 ws0">有时候我们只知道一个<span class="ff3">函数</span>的<span class="ff3">大</span>概<span class="ff3">形</span>式<span class="ff1">,</span>不<span class="ff3">记得确切</span>的表<span class="ff3">达</span>式<span class="ff1">,<span class="ff3">或</span></span>者是不<span class="ff3">记得</span>着<span class="ff3">函数<span class="ff1"> </span></span></div><div class="t m0 x1 h3 y10 ff2 fs0 fc0 sc0 ls0 ws0">在那个头文件进行了说明<span class="ff1">.</span>这个时候我们可以求助系统<span class="ff1">. </span></div><div class="t m0 x1 h5 y11 ff2 fs0 fc0 sc0 ls0 ws0">比如说我们想知道<span class="_ _0"> </span><span class="ff1">fread<span class="_ _0"> </span></span>这个<span class="ff3">函数</span>的<span class="ff3">确切形</span>式<span class="ff1">,</span>我们只要执行<span class="ff1"> man fread </span>系统就会输出着<span class="ff1"> </span></div><div class="t m0 x1 h5 y12 ff3 fs0 fc0 sc0 ls0 ws0">函数<span class="ff2">的详细解释的<span class="ff1">.</span>和这个</span>函数<span class="ff2">所在的头文件<span class="ff1"><stdio.h></span>说明了<span class="ff1">. </span>如果我们要<span class="_ _0"> </span><span class="ff1">write<span class="_ _0"> </span></span>这个</span>函<span class="ff1"> </span></div><div class="t m0 x1 h5 y13 ff3 fs0 fc0 sc0 ls0 ws0">数<span class="ff2">的说明<span class="ff1">,</span>当我们执行<span class="_ _0"> </span><span class="ff1">man write<span class="_ _0"> </span></span>时<span class="ff1">,</span>输出的结果</span>却<span class="ff2">不是我们所需要的<span class="ff1">. </span></span>因<span class="ff2">为我们要的是<span class="_ _0"> </span><span class="ff1">w </span></span></div><div class="t m0 x1 h5 y14 ff1 fs0 fc0 sc0 ls0 ws0">rite<span class="_ _0"> </span><span class="ff2">这个<span class="ff3">函数</span>的说明</span>,<span class="ff2">可是出来的<span class="ff3">却</span>是<span class="_ _0"> </span></span>write<span class="_ _0"> </span><span class="ff2">这个命令的说明</span>.<span class="ff2">为了<span class="ff3">得</span>到<span class="_ _0"> </span></span>write<span class="_ _0"> </span><span class="ff2">的<span class="ff3">函数</span>说明</span> </div><div class="t m0 x1 h5 y4c ff2 fs0 fc0 sc0 ls0 ws0">我们要用<span class="ff1"> man 2 write. 2<span class="_ _0"> </span></span>表示我们用的<span class="_ _0"> </span><span class="ff1">write<span class="_ _0"> </span></span>这个<span class="ff3">函数</span>是系统调用<span class="ff3">函数<span class="ff1">,</span></span>还有一个我们常<span class="ff1"> </span></div><div class="t m0 x1 h5 y15 ff2 fs0 fc0 sc0 ls0 ws0">用的是<span class="_ _0"> </span><span class="ff1">3<span class="_ _0"> </span></span>表示<span class="ff3">函数</span>是<span class="_ _0"> </span><span class="ff1">C<span class="_ _0"> </span></span>的库<span class="ff3">函数<span class="ff1">. </span></span></div><div class="t m0 x1 h5 y4d ff3 fs0 fc0 sc0 ls0 ws0">记住<span class="ff2">不管什么时候<span class="ff1">,man<span class="_ _0"> </span></span>都是我们的最好助</span>手<span class="ff1">. </span></div><div class="t m0 x1 h4 y3b ff1 fs0 fc0 sc0 ls0 ws0">------------------------------------------------------------------------ </div><div class="t m0 x1 h5 y17 ff2 fs0 fc0 sc0 ls0 ws0">好了<span class="ff1">,</span>这一章就<span class="ff3">讲</span>这么多了<span class="ff1">,</span>有了这<span class="ff3">些</span>知识我们就可以进入<span class="ff3">激动</span>人<span class="ff3">心</span>的<span class="_ _0"> </span><span class="ff1">Linux<span class="_ _0"> </span></span>下的<span class="_ _0"> </span><span class="ff1">C<span class="_ _0"> </span></span>程序<span class="ff3">探<span class="ff1"> </span></span></div><div class="t m0 x1 h5 y18 ff3 fs0 fc0 sc0 ls0 ws0">险活动<span class="ff1">. </span></div><div class="t m0 x1 h3 y1a ff1 fs0 fc0 sc0 ls0 ws0">2)Linux<span class="_ _0"> </span><span class="ff2">程序设计入门</span>--<span class="ff2">进程介绍</span> </div><div class="t m0 x1 h5 y1b ff1 fs0 fc0 sc0 ls0 ws0">Linux<span class="_ _0"> </span><span class="ff2">下进程的<span class="ff3">创建</span></span> </div><div class="t m0 x1 h3 y1c ff2 fs0 fc0 sc0 ls0 ws0">前言<span class="ff1">: </span></div><div class="t m0 x1 h5 y1d ff2 fs0 fc0 sc0 ls0 ws0">这篇文章是用来介绍在<span class="_ _0"> </span><span class="ff1">Linux<span class="_ _0"> </span></span>下和进程<span class="ff3">相</span>关的<span class="ff3">各</span>个概念<span class="ff1">.</span>我们将会学到<span class="ff1">: </span></div><div class="t m0 x1 h3 y1e ff2 fs0 fc0 sc0 ls0 ws0">进程的概念<span class="ff1"> </span></div><div class="t m0 x1 h5 y1f ff2 fs0 fc0 sc0 ls0 ws0">进程的<span class="ff3">身份<span class="ff1"> </span></span></div><div class="t m0 x1 h5 y4e ff2 fs0 fc0 sc0 ls0 ws0">进程的<span class="ff3">创建<span class="ff1"> </span></span></div><div class="t m0 x1 h5 y4f ff3 fs0 fc0 sc0 ls0 ws0">守护<span class="ff2">进程的</span>创建<span class="ff1"> </span></div><div class="t m0 x1 h4 y45 ff1 fs0 fc0 sc0 ls0 ws0">---------------------------------------------------------------------------- </div><div class="t m0 x1 h4 y46 ff1 fs0 fc0 sc0 ls0 ws0">---- </div><div class="t m0 x1 h5 y24 ff1 fs0 fc0 sc0 ls0 ws0">1<span class="ff3">。<span class="ff2">进程的概念</span></span> </div><div class="t m0 x1 h5 y25 ff1 fs0 fc0 sc0 ls0 ws0">Linux<span class="_ _0"> </span><span class="ff2">操作系统是面<span class="ff3">向</span>多用<span class="ff3">户</span>的</span>.<span class="ff2">在同一时间可以有许多用<span class="ff3">户向</span>操作系统发出<span class="ff3">各种</span>命</span> </div><div class="t m0 x1 h5 y54 ff2 fs0 fc0 sc0 ls0 ws0">令<span class="ff1">.</span>那么操作系统是<span class="ff3">怎</span>么实<span class="ff3">现</span>多用<span class="ff3">户</span>的<span class="ff3">环境呢<span class="ff1">? </span></span>在<span class="ff3">现</span>代的操作系统里面<span class="ff1">,</span>都有程序和进程<span class="ff1"> </span></div><div class="t m0 x1 h5 y55 ff2 fs0 fc0 sc0 ls0 ws0">的概念<span class="ff1">.</span>那么什么是程序<span class="ff1">,</span>什么是进程<span class="ff3">呢<span class="ff1">? </span>通俗</span>的<span class="ff3">讲</span>程序是一个<span class="ff3">包含</span>可以执行代码的文件<span class="ff1"> </span></div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>