﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-云览天下-随笔分类-Linux学习</title><link>http://www.cppblog.com/Data/category/19242.html</link><description>这里是每个人的数据中心，数据即服务，DaaS 。</description><language>zh-cn</language><lastBuildDate>Tue, 01 May 2012 11:11:32 GMT</lastBuildDate><pubDate>Tue, 01 May 2012 11:11:32 GMT</pubDate><ttl>60</ttl><item><title>提问的智慧</title><link>http://www.cppblog.com/Data/archive/2012/05/01/173342.html</link><dc:creator>数据中心</dc:creator><author>数据中心</author><pubDate>Tue, 01 May 2012 05:39:00 GMT</pubDate><guid>http://www.cppblog.com/Data/archive/2012/05/01/173342.html</guid><wfw:comment>http://www.cppblog.com/Data/comments/173342.html</wfw:comment><comments>http://www.cppblog.com/Data/archive/2012/05/01/173342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Data/comments/commentRss/173342.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Data/services/trackbacks/173342.html</trackback:ping><description><![CDATA[<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="intro"></a>引言</h2></div></div></div></div>
<div class="sect1" lang="en" xml:lang="en">
<p>在 <a href="http://www.catb.org/%7Eesr/faqs/hacker-howto.html" target="_top">黑客</a> 的世界，你所提技术问题的回答很大程度上取决于你提问的方式与解决此问题的难度，本文将教你如何提问才更有可能得到满意的答复。</p>
<p>开源程序的使用已经很广，你通常可以从其它更有经验的用户而不是黑客那里得到回答。这是好事，他们一般对新手常有的毛病更容忍一点。然尔，使用我们 介 绍的方法象对待黑客那样对待这些有经验的用户，通常能最有效地得到问题的解答。</p>
<p>第一件需要明白的事是黑客喜欢难题和激发思考的好问题。假如不是这样，我们也不会写本文了。如果你能提出一个有趣的问题让我们咀嚼玩味，我们会感激 你。 好的 问题是种激励与礼物，帮助我们发展认知，揭示没有注意或想过的问题。在黑客中，&#8220;好问题！&#8221;是非常真挚的赞许。</p>
<p>除此而外，黑客有遇到简单问题就表现出敌视或傲慢的名声，有时候我们看起来还对新手和愚蠢的家伙有条件反 射式的无礼，但并不真正是这样。</p>
<p>我们只是毫无歉意地敌视那些提问前 不愿思考、不做自己该做之事的人。这种人就象时间无底洞&#9472;&#9472;他们只知道获取，不愿意付出，他们浪费了时间，这些时间本可用于其它更值得回答的人和 更有趣 的问题。我们将这种人叫做&#8220;失败者 (loser)&#8221; (由于历史原因，我们有时将&#8220;loser&#8221;拼为&#8220;lusers")</p>
<p>我们注意到许多人只想用我们写的软件，他们对学习技术细节没有兴趣。对大多数人而言，计算机只是种工具，是种达到目的的手段。他们要生活并且有更要 紧的事要做，我们承认这点，也从不指望每个人都对这些让我们着迷的技术问题感兴趣。不过，我们回答问题的风格是为了适应那些真正对此有兴趣并愿意主动参与 问题解决的 人，这一点不会变，也不该变。如果这都变了，我们就会在自己能做得最好的事情上不再那么犀利。<br /></p>
<p>我们(多数)是自愿者，从自己繁忙的生活中抽时间来回答问题，有时会力不从心。因此，我们会无情地滤除问题，特别是那些看起来象是失败者的，以 便更有效地把回答问题的时间留给那些&#8220;胜利者&#8221;</p>
<p>如果你认为这种态度 令人憎恶、以施惠者自居或傲慢自大，请检查你的假设，我们并未要求你屈服&#9472;&#9472;事实上，假如你做了该做的努力使之成为可能，我们中的 大多数人非常乐意平等地与你交流并欢迎你接纳我们的文化。试图去帮助那些不愿自救的人对我们简直没有效率，不懂没有关系，但愚蠢地行事不行。</p>
<p>所以，你不必在技术上很在行才能吸引我们的注意，但你<span style="font-weight: bold; font-style: italic">必须</span>表现出能引导你在行的姿态&#9472;&#9472;机 敏、思考、善于观察、乐于主动参与问题的解决。如果你 做不到这些使你与众不同的事情，我们建议你付钱跟别人签商业服务合同，而不是要求黑客无偿帮助。</p>
<p>如果你决定向我们求助，你不会想成为一名失败者，你也不想被看成一个失败者。得到快速有效回复的最好方法是使提问者看起来象个聪明、自 信的人，并且暗示只是碰巧在某一特别问题上需要帮助。</p>
<p>(欢迎对本文指正，可以将建议发至 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#101;&#115;&#114;&#64;&#116;&#104;&#121;&#114;&#115;&#117;&#115;&#46;&#99;&#111;&#109;" target="_top">esr@thyrsus.com</a> 。 请注意，本文不想成为一般性的 <a href="http://www.dtcc.edu/cs/rfc1855.html" target="_top">网络礼仪</a> 指南，我一般会拒绝那些与引出技术论坛中有用的回复不特别相关的建议)</p></div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="before"></a>提问前</h2></div></div></div>
<p>在通过电子邮件、新闻组或网页论坛提技术问题之前，做以下事情：</p>
<div class="procedure">
<ol type="1"><li>
<p>尝试搜索互联网以找到答案</p></li><li>
<p>尝试阅读手册以找到答案</p></li><li>
<p>尝试阅读FAQ(常见问题)文档以找到答案</p></li><li>
<p>尝试自己检查或试验以 找到答案</p></li><li>
<p>尝试请教懂行的朋友以找到答案</p></li><li>
<p>如果你是程序员，尝试阅读源代码以找到答案</p></li></ol></div>
<p>提问时，请先表述你已经做了上述事情，这将有助于建立你不是寄生虫与浪费别人时间的印象。最好再表述你从中<span style="font-weight: bold; font-style: italic">学到的东西</span>，我们喜欢 回答那些表现出能从答案中学习的人。</p>
<p>使用某些策略，比如用Google搜索你遇到的错误提示(既搜索网页也查查讨论组)，可能就直接找到了解决问题的文档或邮件列表线索。即使没有结 果，在电子邮件或新闻组张贴问题时提一句&#8220;我在Google中查过下列句子但没有找到什么有用的东西&#8221;也是件好事。</p>
<p>准备你的问题，彻底地思考。轻率的提问只能得到轻率的回答，或者压根没有。在提问时，越是表现出做过思考并在努力解 决问题，你越有可能得到 实际帮助。</p>
<p>注意别提错问题。如果提问基于错误的假设，某黑客多半会一边想&#8221;愚蠢的问题&#8230;&#8230;&#8220;，一边用按照问题字面的无用答案回复你，并且希望这种只 是得到 字 面回答而不是真正所需的经历给你一个教训。</p>
<p>永远不要假设你<span style="font-weight: bold; font-style: italic">有资格</span>得 到解答。你没有这种资格，毕竟你没有为此服务付费。如果你能够提出有内容、有趣和激励思考的问题&#9472;&#9472;那种毫无疑问能够向社 区贡献经验而不仅仅是消极地要求从别人那获取知识的问题，你将&#8220;挣到&#8221;答案。</p>
<p>另一方面，表明你能够也乐意参与问题的解决是个很好的开端。&#8220;有没有 人能指个方向？&#8221;、&#8220;我这还漏点什么？&#8221;、&#8220;我应该查哪些网站？&#8221;通常要比 &#8220;请给出我可以用的完整步骤&#8221;更容易得到回复，因为你表明了只要有人能指个方向你就很乐意完成剩下的过程。</p></div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="asking"></a>提问时</h2></div></div></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="forum"></a>仔细挑选论坛</h3></div></div></div>
<p>要对在哪提问留心，如果你做了下 述事情，多半会被一笔勾销或被看成&#8220;失败者&#8221;：</p>
<div class="itemizedlist">
<ul type="disc"><li>
<p>张贴与论坛主题完全无关的问题</p></li><li>
<p>在面向高级技术问题的论坛上提非常 初浅的问题，或者反之。</p></li><li>
<p>在太多不同的新闻组同时交叉张贴</p></li><li>
<p>给既非熟人也没有义务解决你问题的个人张贴你私人的电子邮件</p></li></ul></div>
<p>为保护通信的渠道不被无 关的东西淹没，黑客会除掉那些没有找对地方的问题，你不会想有这种经历的。</p>
<p>所以第一步是找对论坛，Google与其它搜索引擎还是你的朋友，可以用它们搜索与你遇到困难的软硬件问题最相关的项目的网站。那 里通常都有项目的FAQ列表、邮件列表及其文档的链接。如果你的努力(包括阅读FAQ)都没有结果，这些邮件列表就是最后能取得帮助 的地方。项目的网站也许还有报告臭虫的流程或链接，如果是这样，去看看。</p>
<p>向陌生的人或论坛发送邮件极有可能是在冒险。譬如，不要假设一个富含信息的网页的编写者想充当你的免费顾问，不要对你 的问题是否会受到欢迎做乐 观的 估计&#9472;&#9472;如果你 不确定，向别处发或者根本别发。</p>
<p>在选择网页论坛、新闻组或邮件列表时，不要太相信名字，先看看FAQ或者许可书以明确你的问题 是否与其主题相关。张贴前先翻翻已有的帖 子可 以 帮助你感受一下那里行事的方式。事实上，张贴之前在新闻组或邮件列表中搜索与你问题相关的关键词是个很好的主意，也许就找到答案了。即使没有，也能帮助你 整理 出 更好的问题。</p>
<p>别象机关枪似的一次性&#8220;扫射&#8221;所有的帮助通 道，那就象大嚷大叫并使人不快。一个一个地来。<br /></p>
<p>弄清楚你的主题！最典型的错误之一是在某种致立于跨Unix和Windows平台的语言、库或工具的论坛中提关于操作系统程序接口的问题。如果你不 明白为什么这是大错，最好在搞清楚概念前什么也别问。</p>
<p>一般来说，在仔细挑选的公共论坛中提问比在私有论坛中提同样的问题更容易得到有用的回复。有许多理由支持这一点，一是看潜在的回复者有多少，二是看 论 坛的参与者有多少，黑客更愿回答能启发多数人的问题。<br /></p>
<p>可以理解，老练的黑客和一些流行软件的作者正在收到超出他们承受能力的不当消息。就象那根多出来就可以压垮骆驼背的稻草一样，你的 加入也可能会使情况走向极端&#9472;&#9472;已经好几次了，一些流行软件的作者退出了对其软件的支持，因为伴随而来的涌向其私人邮箱的大量无用消息变得无法 忍受。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3><a name="usefora"></a>面向新手的网页论坛和IRC通常响应最快</h3></div></div></div>
<p>本地的用户组织或者你所用的Linux发行版也许正在宣传新手取得帮助的网页论坛或IRC(互联网中继聊天) (在非英语国家，新手论坛很可能还是邮件列表)，这些 地 方 是开始提问的好去处，尤其是当你觉得遇到的也许只是相对简单或者一般的问题时。经过宣传的IRC通道是个公开邀请提问的地方，通常可以得到实时的回复。</p>
<p>事实上，如果出问题的程序来自某发行版(这很常见)，在程序的项目论坛或列表提问前最好先在发行版的论坛或列表中问问，(否则)项目的黑客可能仅仅 回复&#8220;用<span style="font-weight: bold; font-style: italic">我们</span><span style="font-weight: bold; font-style: italic">的</span>代码&#8221;</p>
<p>在任何网页论坛张贴之前，先看看是否有搜索功能。如果有，就试试用问题的几个关键词搜索一下，也许就有帮助。如果在此之前你已做过全面的网页搜索 (你应该这样做)，还是再搜索一下论坛，搜索引擎最近也许还没有索引此论坛的全部内容。</p>
<p>通过网页论坛或IRC频道提供项目的用户支持有增长的趋势，电子邮件交流则更多地为项目开发保留。先在网页论坛或IRC中寻求与项目相关的帮 助。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="uselists"></a>第二步，使用项目邮件列表</h3></div></div></div>
<p>当某项目存在开发者邮件列表时，即使你确信谁能最好地回答问题，也要向列表而不是其中的个体提问。检查项目的文档和主页，找到项目的邮件列表并使 用它。采用这种策略有几个好理由：</p>
<div class="itemizedlist">
<ul type="disc"><li>
<p>任何向单个开发者提的足够好的问题也将对整个项目组有益。相反，如果你认为自己的问题对整个项目组来说太愚蠢，这也不能成为打扰 单个开发者的理由。</p></li><li>
<p>向列表提问可以平衡开发者的负担，单个开发者(特别是项目领导)也许太忙以至于无法回答你的问题。</p></li><li>
<p>大多数邮件列表有历史文档并被搜索引擎索引，其它人可以通过网页搜索找到你的问题和答案而不用再次在邮件列表中发问。</p></li><li>
<p>如果某些问题经常被问到，开发者可以利用此信息改进文档或软件本身以使其更清楚。如果只是私下提问，就没有人能看到最常见问题的完整 场景。</p></li></ul></div>
<p>如果一个项目既有&#8220;用户&#8221;也有&#8220;开发者&#8221;(或&#8220;黑客&#8221;)邮件列表或网页论坛，而你又不摆弄那些代码，向&#8220;用户&#8221;列表或论坛提问。不要假设自己在开发 者列表中会受欢 迎，那些人多半会遭受你的噪音干扰。</p>
<p>然尔，如果你<span style="font-style: italic">确信</span>你的问题不一般，而且在&#8220;用户&#8221; 列表或论坛中几天都没有回复，可以试试&#8220;开发者&#8221;列表或论坛。建议你在张贴前最好先暗暗地观察几天 以了解那的行事方式(事实上这是参与任何私有或半私有列表的好主意)</p>
<p>如果你找不到一个项目的邮件列表，而只能查到项目维护者的地址，只管向其发信。即便在这种情况下，也别假设(项目)邮件列表不存在。在你的电子邮 件中陈述你已 经试过但没有找到合适的邮件列表，也提及你不反对将自己的邮件转发给他人(许多人认为，即使没什么秘密，私人电子邮件也不应该被公开。通过允许将你的电子 邮件 转 发他人给 了相应人员处置你邮件的选择)。<br /></p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="bespecific"></a>使用明确而有意义的主题</h3></div></div></div>
<p>在邮件列表、新闻组或网页论坛中，主题是你在五十个或更少的字符以内吸引有资格的专家注意的黄金机会，不要用诸如&#8220;请帮我&#8221;(更别提大写的&#8220;请帮 我！！！！&#8221;，这种主题的消息会被条件反射式地删掉)之类的唠叨浪费机会。不要用你痛苦的深度来打动我们，相反，要在这点空间中使用超级简明扼要的问题 描述。</p>
<p>使用主题的好惯例是&#8220;对象&#9472;&#9472;偏差&#8221;(式的描述)，许多技术支持组织就是这样做的。在&#8220;对象&#8221;部分指明是哪一个或哪一组东西有问题，在&#8220;偏差&#8221;部分 则描述与期望 行 为不一致的地方。</p>
<div class="variablelist">
<dl>
<dt><span class="term"><span class="strong"></span></span><br /><span class="term"><span class="strong"><span class="term"><span class="strong">愚蠢：</span></span></span></span> 
<dt><span class="term"><span class="strong"></span></span><br />
<dd>
<p>救命啊！我的笔记本视频工作不正常！</p>
<dt><span class="term"><span class="strong"></span></span><br /><span class="term"><span class="strong"><span class="term"><span class="strong">明智：</span></span></span></span> 
<dt><span class="term"><span class="strong"></span></span><br />
<dd>
<p>XFree86 4.1扭曲鼠标光标，某显卡MV1005型号的芯片组</p>
<dt><span class="term"><span class="strong"></span></span><br /><span class="term"><span class="strong"><span class="term"><span class="strong">更明智：</span></span></span></span> 
<dt><span class="term"><span class="strong"></span></span><br />
<dd>
<p>使用某显卡MV1005型号芯片组的XFree86 4.1的鼠标光标被扭曲</p></dd></dl></div>
<p>编写&#8220;对象&#9472;&#9472;偏差&#8221;式描述的过程有助于你更具体地组织你的问题。是什么被影响了？仅仅是鼠标光标或者还有其它图形？只在XFree86中出现？或 只是在其4.1版中？是针对某显卡？或者只是其MV1005型号的芯片组？一个黑客只需描一眼就能够立即明白什么是你遇到的问题，什么是你自己的问题。</p>
<p>更一般地，想象一下在只显示主题的文档索引中查找。让你的主题更好地反映问题，可以使下一个搜索类似问题的人能够在文档中直接找到答案的线索而不用 再次张贴提问。</p>
<p>如果你想在回复中提问，确保改变主题以表明你是在问一个问题，一个主题象&#8220;re: 测试&#8221;或&#8220;re: 新臭虫&#8221;的消息不太可能引起足够的注意。同 时，将回复中与新主题不甚相关的引用内容尽量删除</p>
<p>对于列表消息，不要直接点击回复(按钮)来开始一个新的线索，这将限制你的观众。有些邮件阅读程序，比如mutt，允许用户按线索排序并通过折叠线 索来隐藏消息， 这样做的人永远看不到你发的消息。</p>
<p>仅仅改变主题还不够。mutt和其它邮件阅读程序还要检查主题以外的其它邮件头信息，以便为其指定线索，所以宁可发一 个全 新的邮件。</p>
<p>在网页论坛，因为消息与特定的线索紧密结合并且通常在线索之外不可见，好的提问方式略有不同，通过回复提问并不要紧(一些论坛甚至不允许在 回复中出现分离的主题，而且这样做了基本上没有人会去看)。不过通过回复提问本身就是令人怀疑的做法，因为它们只会被正在查看该 线索的人读到。所以，除非你只想在该线索当前活跃的人群中提问，还是另起炉灶比较好。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="easyreply"></a>使之更易回复</h3></div></div></div>
<p>以&#8220;请向&#8230;&#8230;回复&#8221;来结束问题多半会使你得不到回答。如果你觉得花几秒钟在邮件客户端设置一下回复地址都麻烦，我们也觉得花几秒钟 考虑你的问题更麻烦。如果你的邮件客户端程序不支持这样做，换个好点的。如果是操作系统不支持所有这种邮件客户端程序，也换个好点的。</p>
<p>在网页论坛，要求通过电子邮件回复是完全无礼的，除非你确信回复的信息也许是机密的(而且有人会为了某种未知的原因只让你而不是整个论坛知道答 案)。如果 你只是想 在有人回复线索时得到电子邮件提醒，可以要求论坛发送。几乎所有论坛都提供诸如&#8220;留意本线索&#8221;、&#8220;有回复发送邮件&#8221;的功能。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="writewell"></a>使用清晰、语法与拼写正确的语句</h3></div></div></div>
<p>经验告诉我们，粗心与草率的作者通常也粗心与草率地思考和编程(我敢打赌)。为这些粗心与草率的思考者回答问题没有什么好处，我们宁可将 时间花在其它地方。</p>
<p>清楚、完整地表达你的问题非常重要。如果你觉得这样做麻烦，我们也觉得注意(你的问题)麻烦。花点额外的精力斟酌一下字句，用不着太僵硬与正式&#9472;&#9472;事实 上，黑客文化很看重能准确地使用非正式、俚语和幽默的语句。但它必须很<span style="font-weight: bold; font-style: italic">准确</span>，而且有迹象表明你是在思考和关 注问题。</p>
<p>正确地拼写、使用标点和大小写，不要将&#8220;its&#8221;混淆为&#8220;it's&#8221;，&#8220;loose&#8221;搞成&#8220;lose&#8221;或者将&#8220;discrete&#8221;弄成 &#8220;discreet&#8221;。<span style="font-weight: bold">不要全部用大写</span>，这会被看成无礼的大声嚷嚷 (全部小写也好不到哪去，因为不易阅读。Alan Cox[注：著名黑客，Linux内核的重要参与者]也许可以这样做，但你不行 )。</p>
<p>一般而言，如果你写得象个半文盲似的傻子，多半得不到理睬。如果象个小孩似地乱写乱画那绝对是在找死，可以肯定没人会理你(或者最多 是给你一大堆指责与挖苦)。</p>
<p>如果在非母语论坛中提问，你的拼写与语法错误会得到有限的宽容，但懒惰完全不会被容忍(是的，我们通常看得出其中的差别)。同时，除非你知道回复者 使用 的语言，请使用 英语书写。繁忙的黑客一般会直接删除用他们看不懂语言写的消息。在互联网上英语是工作语言，用英语书写可以将你的问题不被 阅读就被直接删除的可能降到最低。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="formats"></a>使用易懂的格式发送问题</h3></div></div></div>
<p>如果你人为地将问题搞得难以阅读，它多半会被忽略，人们更愿读易懂的问题，所以：</p>
<div class="itemizedlist">
<ul type="disc"><li>
<p>使用文本而不是HTML(超文本标注语言) ( <a href="http://expita.com/nomime.html" target="_top">关闭HTML</a> 并不难) </p></li><li>
<p>使用MIME(多用途互联网邮件扩展)附件通常没有问题，前提是真正有内容(譬如附带的源文件或补丁)，而不仅仅是邮件客户端程序 生 成的模板(譬如只是消息内容的拷贝)。</p></li><li>
<p>不要发送整段只是单行句子但多次折回的邮件(这使得回复部分内容非常困难)。设想你的读者是在80个字符宽的文本终端阅读邮件， 设置你的行折回点小于80列。</p></li><li>
<p>但是，也<span style="font-weight: bold; font-style: italic">不要</span>用 任何固定列折回数据(譬如直接传送的日 志文件或会话记录)。数据应该原样包含，使回复者确信他们看到的与你看到的东西一样。</p></li><li>
<p>在英语论坛中，不要使用'Quoted-Printable' MIME编码发送消息。这种编码对于张贴非ASCII语言可能是必须的，但很多邮件代理程序并不支持。当它们分断时，那些文本中四处散布 的 &#8220;=20&#8221;符号既难看也分散注意力。 </p></li><li>
<p><span style="font-weight: bold; font-style: italic">永远不要</span>指 望黑客们阅读使用封闭的专用格式编写的文档，诸如微软公司的Word或Excel文件等，大多数黑客对此的反应就象有人将还在冒热气的猪 粪倒在你门口时你的反应一样。即使他们能够处理，他们也很厌恶这么做。</p></li><li>
<p>如果你从使用视窗的电脑发送电子邮件，关闭微软愚蠢的&#8220;聪明引用&#8221;功能，以免在你的邮件中到处散布垃圾字符。 </p></li><li>
<p>在网页论坛，勿滥用&#8220;表情符号&#8221;和&#8220;html&#8221;功能(当它们提供时)。一两个表情符号通常没有问题，但花哨的彩色文本倾向于使人认为 你是个无能之辈。过滥地使用表情符号、色彩和字体会使你看来象个傻笑的小姑娘。这通常不是个好主意，除非你只是对性而不是有用的回复更有兴趣。</p></li></ul></div>
<p>如果你使用图形用户界面的邮件客户端程序(如网景公司的Messenger、微软公司的Outlook或者其它类似的)，注意它们的缺省配置不一 定满足这些要求。大多数这类程序有基于菜单的&#8220;查看源码&#8221;命令，用它来检查发送文件夹中的消息，以确保发送的是没有多余杂质的纯文本文件。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="beprecise"></a>描述问题应准确且有内容</h3></div></div></div>
<div class="itemizedlist">
<ul type="disc"><li>
<p>仔细、清楚地描述问题的症状 </p></li><li>
<p>描述问题发生的环境(主机，操作系统，应用程序，任何相关的)，提供销售商的发行版和版本号(如：&#8220;Fedora Core 2&#8221;、&#8220;Slackware 9.1&#8221;等) </p></li><li>
<p>描述提问前做过的研究及其理解。 </p></li><li>
<p>描述提问前为确定问题而采取的诊断步骤。 </p></li><li>
<p>描述最近对计算机或软件配置的任何相关改变。 </p></li></ul></div>
<p>尽最大努力预测黑客会提到的问题，并提前备好答案。</p>
<p>Simon Tatham写过一篇叫 <a href="http://www.chiark.greenend.org.uk/%7Esgtatham/bugs.html" target="_top">如何有效报告臭虫</a> 的文章，我强烈推荐各位阅读。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="volume"></a>多不等于准确</h3></div></div></div>
<p>你应该(写得)准确且有内容，简单地将一大堆代码或数据&#8220;倾倒&#8221;在求助消息中达不到目的。如果你有一个很大且复杂的测试样例让程序崩溃，尝 试将其裁剪得越小越好。</p>
<p>至少有三个理由支持这点。第一，让别人看到你在努力简化问题使你更有可能得到回复。第二，简化问题使你更有可能得到<span style="font-weight: bold; font-style: italic">有用的</span>回复。第三，在提纯臭虫 报告的过程中，你可能自己就找到了解决问题的方法或权宜之计。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="id3001405"></a>别动辄声称找到臭虫</h3></div></div></div>
<p>当你在一个软件中遇到问题，除非你<span style="font-weight: bold; font-style: italic">非 常、非常</span>的有根据，不要动辄声称找到了臭虫。提示：除非你能提供解决问题的源代码补丁，或者对前一版本的回归测 试 表现出不正确的行为，否则你都多半不够完全确信。对于网页和文档也如此，如果你(声称)发现了文档的&#8220;臭虫&#8221;，你应该能提供相应位置的替代文本。</p>
<p>记住，还有许多其它用户未经历你遇到的问题，否则你在阅读文档或网页搜索时就应该发现了(你在报怨前已经做了这些，<a title="Before You Ask" href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#before">是吧</a>？)。这也意味着很有可能是你弄错了而不是软件本身有问 题。</p>
<p>编写软件的人通常非常辛苦地使它尽可能完美。如果你声称找到了臭虫，也就暗示他们做错了什么，而这几乎总会使人不快&#9472;&#9472;即使你是对的， 在主题中嚷嚷&#8220;臭虫&#8221;也是特别不老练的。</p>
<p>提问时，即使你私下非常确信已经发现一个真正的臭虫，最好写得象是<span style="font-weight: bold; font-style: italic">你</span>做 错了什么。如果真的有臭虫，你会在回复中看到这点。这么做的话，如果真有虫子，维护者就会向你道歉，这总比你弄 砸了然后欠别人一个道歉要强。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="id3001578"></a>低声下气不能代替自己应做之事</h3></div></div></div>
<p>有些人明白他们不应该粗鲁或傲慢地行事并要求得到答复，但他们退到相反的低声下气的极端，&#8220;我知道我只是个什么也不是、什么也不懂的失败者， 但&#8230;&#8230;&#8221;。这既使人困扰也没有帮助，当伴随着对实际问题含糊的描述时还特别令人反感。</p>
<p>别用低级灵长类动物的策略浪费大家的时间，相反，尽量清楚地表述背景事实和你的问题，这比低声下气更好地摆正了你的位置。</p>
<p>有时，网页论坛设有单独的初学者提问区域，如果你真的认为遇到了初浅的问题，到那去就是了，但一样别低声下气。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="symptoms"></a>描述问题症状而不是猜测</h3></div></div></div>
<p>告诉黑客你认为是什么导致了问题是没有用的(如果你的诊断理论是了不起的东西，你还会向他人咨询求助吗？)。所以，确保只是告诉他们问题的原始 症状，而不是你的解释和理论，让他们来解释和诊断。如果你认为陈述你的猜测很重要，清楚地说明这只是你的猜测并描述为什么它们不起作用。</p>
<div class="variablelist">
<dl>
<dt><span class="term"><span class="strong"></span></span><br /><span class="term"><span class="strong"><span class="term"><span class="strong">愚蠢：</span></span></span></span> 
<dt><span class="term"><span class="strong"></span></span><br />
<dd>
<p>我在编译内核时接连遇到SIG11错误，怀疑主板上的某根电路丝断了，找到它们的最好办法是什么？</p>
<dt><span class="term"><span class="strong">明智：</span> </span>
<dd>
<p>我组装的电脑(K6/233 CPU、FIC-PA2007主板(威盛Apollo VP2芯片组)、Corsair PC133 SDRAM 256Mb内 存)最近在开机20分钟左右、做内核编译时频繁地报SIG11错，但在头20分钟内从不出问题。重启动不会复位时钟，但整夜关机会。更换所有内存未解决问 题，相关的典型编译会话日志附后。</p></dd></dl></div></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="chronology"></a>按时间先后罗列症状</h3></div></div></div>
<p>刚出问题之前发生的事情通常包含有解决问题最有效的线索。所以，记录中应准确地描述你及电脑在崩溃之前都做了些什么。在命令行处理的 情况下，有会话日志(如运行脚本工具生成的)并引用相关的若干(如20)行记录会非常有帮助。</p>
<p>如果崩溃的程序有诊断选项(如-v详述选项)，仔细考虑选择这些能在记录中增加排错信息的选项。</p>
<p>如果你的记录很长(如超过四段)，也许在开头简述问题随后按时间先后罗列详细过程更有用。这样做，黑客在读你的记录时就知道该查哪些内容了。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="goal"></a>描述目的而不是步骤</h3></div></div></div>
<p>如果你想弄清楚如何做某事(而不是报告一个臭虫)，在开头就描述你的目标，此后才描述为此采取的措施所遇到的问题。</p>
<p>经常有这种情况，寻求技术帮助的人在脑袋里有个更高层面的目标，他们在自以为能达到目标的特定道路上被卡住了，然后跑来问该怎么走，但 没有意识到这条路本身有问题，结果要费很大的劲才能通过。</p>
<div class="variablelist">
<dl>
<dt><span class="term"><span class="strong">愚蠢：</span> </span>
<dd>
<p>我怎样才能让某图形程序的颜色拾取器取得十六进制的RGB值？</p>
<dt><span class="term"><span class="strong">明智：</span> </span>
<dd>
<p>我正试图用自己选定数值的颜色替换一幅图片的颜色表，我现在唯一知道的方法是编辑每个表槽，但却无法让某图形程序的颜色拾取器取得十六进 制的RGB值。</p></dd></dl></div>
<p>第二种提法是明智的，它使得建议采用更合适的工具完成任务的回复成为可能。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="noprivate"></a>别要求私下回复</h3></div></div></div>
<p>黑客们认为问题的解决过程应该公开、透明，此过程中如果更有才能的人注意到不完整或者不当之处，最初的回复才能够、也应该被更正。同时，作为 回复者也因为能力和学识被其它同行看到而得到某种回报。</p>
<p>当你要求私下回复时，此过程和回报都被中止。别这样做，让<span style="font-weight: bold; font-style: italic">回复者</span>来决定是否私下回答&#9472;&#9472;如果他 真这么做了，通常是因为他认为问题编写太差或者太肤浅 以 至于对其它人无意义。</p>
<p>对这条规则存在一条有限的例外，如果你确信提问可能会导致大量雷同的回复时，那么&#8220;给我发电子邮件，我将为小组归纳这些回复&#8221;将是神奇的句子。试图 将邮 件列表或新闻组从洪水般雷同的回复中解救出来是非常有礼貌的&#9472;&#9472;但你应信守诺言。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="explicit"></a>问题应明晰<br /></h3></div></div></div>
<p>漫无边际的问题通常也被视为没有明确限制的时间无底洞。最有可能给你有用答案的人通常也是最忙的人(假如只是因为他们承担了大多数工作的话)，这些 人 对于没 有限制的时间无底洞极其反感，所以他们也倾向于讨厌那些漫无边际的问题。</p>
<p>如果你明确了想让回复者做的事(如指点方向、发送代码、检查补丁或其它)，你更有可能得到有用的回复。这可以使他们集中精力并间接地设定了他们为帮 助你需要花费的时间和精力上限，这很好。</p>
<p>要想理解专家生活的世界，可以这样设想：那里有丰富的专长资源但稀缺的响应时间。你暗中要求他们奉献的时间越少，你越有可能从这些真正懂行也真正很 忙的专家 那里得到回答。</p>
<p>所以限定你的问题以使专家回答时需要付出的时间最少&#9472;&#9472;这通常还与简化问题不一样。举个例，&#8220;请问可否指点一下哪有好一点的X解释？&#8221;通常要 比&#8220;请解释一下X&#8221;明智。如果你有什么代码不运行了，通常请别人看看哪有问题比叫他们帮你改正更明智。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="homework"></a>别张贴家庭作业<br /></h3></div></div></div>
<p>黑客们善于发现&#8220;家庭作业&#8221;式的问题。我们大多数人已经做了自己的家庭作业，那是<span style="font-weight: bold; font-style: italic">该你</span>做的，以便从其经历中学习。问一 下提示没有关系，但不是要求完整的解决方案。</p>
<p>如果你怀疑自己碰到了一个家庭作业式的问题，但仍然无法解决，尝试在用户组论坛或(作为最后一招)在项目的&#8220;用户&#8221;邮件列表或论坛中提问。尽管 黑客们会看出来，一些高级用户也许仍会给你提示。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="prune"></a>删除无意义的问题</h3></div></div></div>
<p>抵制在求助消息末尾加上诸如&#8220;有人能帮我吗？&#8221;或&#8220;有没有答案？&#8221;之类在语义上无任何意义东西的诱惑。第一，如果问题描述还不完整，这些附 加的东西最多也只能是多余的。第二，因为它们是多余的，黑客们会认为这些东西烦人&#9472;&#9472;就很有可能用逻辑上无误但打发人的回复，诸如&#8220;是的，你可 以得到帮助&#8221;和&#8220;不，没有给你的帮助&#8221;</p>
<p>一般来说，避免提&#8220;是或否&#8221;类型的问题，除非你想得到 <a href="http://homepages.tesco.net/%7EJ.deBoynePollard/FGA/questions-with-yes-or-no-answers.html" target="_top">&#8220;是或否&#8221;类型的回答</a>。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="urgent"></a>不要刻意标明问题紧急</h3></div></div></div>
<p>这是你自己的问题，不要我们的。宣称&#8220;紧急&#8221;极有可能事与愿违：大多数黑客会直接删除这种消息，他们认为这是无礼和自私地企图得到即时与特殊的关 照。</p>
<p>有一点点局部的例外，如果你是在一些知名度很高、会使黑客们激动的地方使用程序，也许值得这样去做。在这种情况下，如果你有期限压力，也很有礼貌 地提到这点，人们也许会有足够的兴趣快一点回答。</p>
<p>当然，这是非常冒险的，因为黑客们对什么是令人激动的标准多半与你的不同。譬如从国际空间站这样张贴没有问题，但代表感觉良好的慈善或政治原 因这样做几乎肯定不行。事实上，张贴诸如&#8220;紧急：帮我救救这个毛绒绒的小海豹！&#8221;肯定会被黑客回避或光火，即使他们认为毛绒绒的小海豹很重要。</p>
<p>如果你觉得这不可思议，再把剩下的内容多读几遍，直到弄清楚了再发贴。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="courtesy"></a>礼貌总是无害的</h3></div></div></div>
<p>礼貌一点，使用&#8220;请&#8221;和&#8220;谢谢你的关注&#8221;或者&#8220;谢谢你的意见&#8221;，让别人明白你感谢他们无偿花时间帮助你。</p>
<p>坦率地说，这一点没有语法正确、文字清晰、准确、有内容和避免使用专用格式重要(同时也不能替代它们)。黑客们一般宁可读有点唐突但技术鲜明的臭 虫报告，而不是那种礼貌但含糊的报告。(如果这点让你不解，记住我们是按问题能教我们些什么来评价一个问题的)</p>
<p>然尔，如果你已经谈清楚了技术问题，客气一点肯定会增加你得到有用回复的机会。</p>
<p>(我们必须指出，本文唯一受到一些老黑客认真反对的地方是以前曾经推荐过的&#8220;提前谢了&#8221;，一些黑客认为这隐含着事后不用再感谢任何人的暗示。我们的 建议是 先说 &#8220;提前谢了&#8221;，事后再对回复者表示感谢。或者换种方式表达，譬如用&#8220;谢谢你的关注&#8221;或&#8220;谢谢你的意见&#8221;)。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="followup"></a>问题解决后追加一条简要说明</h3></div></div></div>
<p>问题解决后向所有帮助过的人追加一条消息，让他们知道问题是如何解决的并再次感谢。如果问题在邮件列表或新闻组中受到广泛关注，在那里追加此消息比 较恰当。</p>
<p>最理想的方式是向最初提问的线索回复此消息并在主题包含&#8220;已解决&#8221;、&#8220;已搞定&#8221;或其它同样意思的明显标记。在人来人往的邮件列表里，一个看见线索 &#8220;问题X&#8221;和&#8220;问题X-已解决&#8221;的潜在回复者就明白不用再浪费时间了(除非他个人觉得&#8220;问题X&#8221;有趣)，因此可以用此时间去解决其它 问题。</p>
<p>你追加的消息用不着太长太复杂，一条简单的&#8220;你好&#9472;&#9472;是网线坏了！谢谢大家&#9472;&#9472;比尔&#8221;就比什么都没有要强。事实上，除 非解决问题的技术真正高深，一条简短而亲切的总结比长篇大论要好。说明是什么行动解决了问题，用不着重演整个排错的故事。</p>
<p>对于有深度的问题，张贴排错历史的摘要是适当的。描述问题的最终状态，说明是什么解决了问题，在此<span style="font-weight: bold; font-style: italic">之后</span>才指明可以避免的弯路。应避免的 弯路部分应放在正确的解决方案和其它总结材料之后，而不要将此消息搞成侦探推理小说。列出那些帮助过你的名字，那样你会交到朋友的。</p>
<p>除了有礼貌、有内容以外，这种类型的追帖将帮助其他人在邮件列表、新闻组或论坛文档中搜索到真正解决你问题的方案，从而也让他们受益。</p>
<p>除上述而外，此类追帖还让每位参与协助的人因问题的解决而产生一种满足感。如 果你自己 不是技术专家或黑客，相信我们，这种感觉对于你寻求帮助的老手和专家非常重要。问题叙述到最后不知所终总是令人沮丧的，黑客们痒 痒地渴望看到它们被解决。&#8220;挠痒痒&#8221;为你挣到的好报将对你下次再次张贴提问非常非常的有帮助。 </p>
<p>考虑一下怎样才能避免其他人将来也遇到类似的问题，问问自己编一份文档或FAQ补丁有没有帮助，如果有的话就将补丁发给维护者。</p>
<p>在黑客中，这种行为实际上比传统的礼貌更重要，也是你善待他人而赢得声誉的方式，这是非常有价值的财富。</p></div></div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2><a name="answers"></a>如何解读回答</h2></div></div></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="rtfm"></a>RTFM和STFW：如何知道你已完全搞砸</h3></div></div></div>
<p>有一个古老而神圣的传统：如果你收到了&#8220;RTFM&#8221;的回复，发信人认为你应该去&#8220;读读该死的手册&#8221;。他多半是对的，去读一下吧。</p>
<p>RTFM有个年轻的亲戚，如果你收到&#8220;STFW&#8221;的回复，发信人认为你应该&#8220;搜搜该死的网络&#8221;。他多半也是对的，去搜一下吧。(更温和一点的说法是 &#8220;Google 是你的朋友！&#8221;)</p>
<p>在网页论坛，你也可能被要求去搜索论坛的文档。事实上，有人甚至可能热心地为你提供以前解决此问题的线索。但不要依赖这种好心，提问前应先搜索 一下文 档。</p>
<p>通常，叫你搜索的人已经打开了能解决你问题的手册或网页，正在一边看一边敲键盘。这些回复意味着他认为：第一，你要的信息很容易找到。第二，自已找 要比别人喂到嘴里能学得更多。</p>
<p>你不应该觉得这样就被冒犯了，按黑客的标准，他没有不理你就是在向你表示某种尊敬，你反而应该感谢他热切地想帮助你。</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="lesser"></a>如果还不明白</h3></div></div></div>
<p>如果你看不懂回复，不要马上回发一个要求说明的消息，先试试那些最初提问时用过的同样工具(手册、FAQ，网页、懂行的朋友等)试着搞懂回 复。如果还是需要说明，展现你已经明白的。</p>
<p>譬如，假如我告诉你：&#8220;听起来象是某输入项有问题，你需要清除它&#8221;，接着是个<span style="font-weight: bold; font-style: italic">不好</span>的回帖：&#8220;什么是某输入项？&#8221;。 而这是一个<span style="font-weight: bold; font-style: italic">好</span>的跟帖：&#8220;是 的， 我读了手册，某输入项只在-z和-p开关中被提到，但都没有提及清除某选项，你指的是哪一个还是我弄错了什么？&#8221;</p></div>
<div class="sect2" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="keepcool"></a>对待无礼</h3></div></div></div>
<p>很多黑客圈子中看似无礼的行为并不是存心冒犯。相反，它是直接了当、一刀见血式的交流风格，这种风格对于更关注解决问题而不是使别人感觉舒服而混乱 的人 是很自然的。</p>
<p>你如果觉得被冒犯，努力平静地反应。如果有人真的做了过格的事，邮件列表或新闻组或论坛中的前辈多半会招呼他。如果这<span style="font-weight: bold; font-style: italic">没有</span>发生而你却发火了，那么你发火对 象的言语 可能在黑客社区中看起来是正常的，而<span style="font-weight: bold; font-style: italic">你</span>将 被视为有错的一方，这将伤害到你获取信息或帮助的机会。</p>
<p>另一方面，你会偶而真的碰到无礼和无聊的言行。与上述相反，对真正的冒犯者狠狠地打击、用犀利的语言将其驳得体无完肤都是可以 接受的。然尔，在行事之前一定要非常非常的有根据。纠正无礼的言论与开始一场毫无意义的口水战仅一线之隔，黑客们自己莽撞地越线情况并不鲜见。如果你是新 手或外来者，避开这种莽撞的机会不高。如果你 想得到的是信息而不是消磨时光，这时最好不要把手放在键盘上以免冒险。</p>
<p>(有些人断言很多黑客都有轻度的自闭症或阿斯伯格综合症，一定缺少平滑人类社会&#8220;正常&#8221;交往所需的脑电路。这既可能是真也可能是假。如果你自己不是 黑客，兴许 你认为我 们脑袋有问题还能帮助你应付我们的古怪行为。只管这么干好了，我们不在乎。我们<span style="font-weight: bold; font-style: italic">喜欢</span>我们现在这个样子，并且一般都对 临床诊断有相当的怀疑。)</p>
<p>在下一节，我们会谈到另一个问题，当你行为不当时会受到的&#8220;冒犯&#8221;</p></div></div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2><a name="not_losing"></a>别象个失败者那样反应</h2></div></div></div>
<p>在黑客社区的论坛中有那么几次你会搞砸&#9472;&#9472;以本文详述或类似的方式。你会被示众是如何搞砸的，也许言语中还会带点颜色。</p>
<p>这种事发生以后，你能做的最糟的事莫过于哀嚎你的遭遇、宣称被口头攻击、要求道歉、高声尖叫、憋闷气、威胁诉诸法律、向其雇主报怨、忘了关马桶盖等 等。相 反，你该这样去做：<br /></p>
<p>熬过去，这很正常。事实上，它是有益健康与恰当的。</p>
<p>社区的标准不会自己维持，它们是通过参与者积极而<span style="font-weight: bold; font-style: italic">公开</span>地执行来维持的。不要哭嚎所有的 批评都应该通过私下的邮件传送，这不是事情运作的方式。当有人批评你的 一些主张或者其看法不同时，坚持声称个人被侮辱也毫无用处，这些都是失败者的态度。</p>
<p>也有其它的黑客论坛，受太高礼节要求的误导，要求参与者禁止张贴任何对别人帖子挑毛病的消息，并被告知&#8220;如果你不想帮助用户就闭嘴&#8221;。有思路的参与 者纷纷 离 开 的结果只会使它们变成了毫无意义的唠叨与无用的技术论坛。</p>
<p>是夸张的&#8220;友谊&#8221;(以上述方式)还是有用？挑一个。</p>
<p>记住：当黑客说你搞砸了，并且(无论多么刺耳地)告诉你别再这样做时，他正在为关心你和他的社区而行动。对他而言，不理你并将你从他的生活中滤除要 容易得 多。如果你无法做到感谢，至少要有点尊严，别大声哀嚎，也别因为自己是个有戏剧性超级敏感的灵魂和自以为有资格的新来者，就指望别人象对待脆弱的洋娃娃 那样对你。</p>
<p>有时候，即使你没有搞砸(或者只是别人想象你搞砸了)， 有些人会无缘无故地攻击你本人。在这种情况下，报怨倒是<span style="font-weight: bold; font-style: italic">真的</span>会把问题搞砸。</p>
<p>这些找茬者要么是什么也不懂但自以为是专家的不中用家伙，要么就是测试你是否真会搞砸的心理学家。其它读者要么不理睬，要么用自己的方式对付他们。 这些找茬者在给自己找麻烦，这点你不用操心。</p>
<p>也别让自己卷入口水战，大多数口水战最好不要理睬&#9472;&#9472;当然是在你核实它们只是口水战、没有指出你搞砸的地方，而且没有巧妙地将问题真正的答案藏于其 中 (这也 是 可能的)之后。</p></div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="classic"></a>提问禁忌</h2></div></div></div>
<p>下面是些典型的愚蠢问题和黑客不回答它们时的想法。</p>
<div class="qandaset">
<dl>
<dt>问： <a href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#id3002488">我到哪可以找到程序或X资源？ </a>
<dt>问： <a href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#id3002514">我怎样用X做Y？</a> 
<dt>问： <a href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#id3002537">如何配置我的shell提示？</a> 
<dt>问： <a href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#id3002563">我可以用Bass-o-matic文件转换工具将AcmeCorp文档转为TeX格式 吗？</a> 
<dt>问： <a href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#id3002586">我的{程序、配置、SQL语句}不运行了</a> 
<dt>问： <a href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#id3002626">我的视窗电脑出问题了，你能帮忙吗？</a> 
<dt>问： <a href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#id3002657">我的程序不运行了，我认为系统工具X有问题</a> 
<dt>问： <a href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#id3002681">我安装Linux或X遇到困难，你能帮忙吗？</a> 
<dt>问： <a href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#id3002722">我如何才能破解超级用户口令/盗取频道操作员的特权/查看某人的电子邮件？</a> </dt></dl>
<table summary="Q and A Set" border="0">
<colgroup>
<col align="left" width="1%">
<tbody>
<tr class="question">
<td valign="top" align="left"><strong>问：</strong></td>
<td valign="top" align="left">
<p><a name="id3002488"></a>我到哪可以找到程序或X资源？</p></td></tr>
<tr class="answer">
<td valign="top" align="left"><strong>答：</strong></td>
<td valign="top" align="left">
<p>在我找到它的同样地方，笨旦&#9472;&#9472;在网页搜索引擎上。上帝啊，难道还有人不知道如何使用 <a href="http://www.google.com/">Google</a> 吗？</p></td></tr>
<tr class="question">
<td valign="top" align="left"><strong>问：</strong></td>
<td valign="top" align="left">
<p><a name="id3002514"></a>我怎样用X做Y？</p></td></tr>
<tr class="answer">
<td valign="top" align="left"><strong>答：</strong></td>
<td valign="top" align="left">
<p>如果你想做的是Y，提问时别给出可能并不恰当的方法。这种问题说明提问者不但对X完全无知，也对要解决的Y问题糊涂，还被特定形势禁 锢了思维。等他们把问题弄 好再说。</p></td></tr>
<tr class="question">
<td valign="top" align="left"><strong>问：</strong></td>
<td valign="top" align="left">
<p><a name="id3002537"></a>如何配置我的shell提示？</p></td></tr>
<tr class="answer">
<td valign="top" align="left"><strong>答：</strong></td>
<td valign="top" align="left">
<p>如果你有足够的智慧提这个问题，你也该有足够的智慧去 <a href="file:///home/frank/work/tran/smart-questions-3.0-cn.html#rtfm">RTFM</a>， 然后自己去找。</p></td></tr>
<tr class="question">
<td valign="top" align="left"><span style="font-weight: bold">问：</span><br /></td>
<td valign="top" align="left">
<p><a name="id3002563"></a>我可以用Bass-o-matic文件转换工具将AcmeCorp文档转为TeX格 式吗？</p></td></tr>
<tr class="answer">
<td valign="top" align="left"><span style="font-weight: bold">答：</span><br /></td>
<td valign="top" align="left">
<p>试试就知道了。如果你试过，你既知道答案，又不用浪费我的时间了。</p></td></tr>
<tr class="question">
<td valign="top" align="left"><span style="font-weight: bold">问：</span><br /></td>
<td valign="top" align="left">
<p><a name="id3002586"></a>我的{程序、配置、SQL语句}不运行了</p></td></tr>
<tr class="answer">
<td valign="top" align="left"><span style="font-weight: bold">答：</span><br /></td>
<td valign="top" align="left">
<p>这不是一个问题，我也没有兴趣去猜你有什么问题&#9472;&#9472;我有更要紧的事要做。看到这种东西，我的反应一般如下：</p>
<div class="itemizedlist">
<ul type="disc"><li>
<p>你还有什么补充吗？</p></li><li>
<p>噢，太糟了，希望你能搞定。</p></li><li>
<p>这跟我究竟有什么关系？</p></li></ul></div></td></tr>
<tr class="question">
<td valign="top" align="left"><span style="font-weight: bold">问：</span><br /></td>
<td valign="top" align="left">
<p><a name="id3002626"></a>我的视窗电脑出问题了，你能帮忙吗？</p></td></tr>
<tr class="answer">
<td valign="top" align="left"><span style="font-weight: bold">答：</span><br /></td>
<td valign="top" align="left">
<p>是的，把视窗垃圾删了，装个象Linux或BSD的开源操作系统吧。</p>
<p>注意：如果程序有官方的视窗版或与视窗有交互(如Samba)，你<span style="font-weight: bold; font-style: italic">可以</span>问与视窗电脑相关的问题，只是别 对问题是由视窗操作系统而不是程序本身造成的回复感 到惊讶，因 为视窗一般来说太差，这种说法一般都成立。</p></td></tr>
<tr class="question">
<td valign="top" align="left"><span style="font-weight: bold">问：</span><br /></td>
<td valign="top" align="left">
<p><a name="id3002657"></a>我的程序不运行了，我认为系统工具X有问题</p></td></tr>
<tr class="answer">
<td valign="top" align="left"><span style="font-weight: bold">答：</span><br /></td>
<td valign="top" align="left">
<p>你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与库文件有明显缺陷的人，更有可能的是你完全没有根据。不同凡响的说法需 要不同凡响的证据， 当你这样 声称时，你必须有清楚而详尽的缺陷说明文档作后盾。</p></td></tr>
<tr class="question">
<td valign="top" align="left"><span style="font-weight: bold">问：<a name="id3002681"></a></span><br /></td>
<td valign="top" align="left">
<p>我安装Linux或X遇到问题，你能帮忙吗？</p></td></tr>
<tr class="answer">
<td valign="top" align="left"><span style="font-weight: bold">答：</span><br /></td>
<td valign="top" align="left">
<p>不行，我需要亲手操作你的电脑才能帮你排错，去向当地的Linux用户组寻求方便的帮助(你可以在 <a href="http://www.linux.org/groups/index.html">这里</a> 找到用户组列表)</p>
<p>注意：在为某一Linux发行版服务的邮件列表或论坛或本地用户组织中提关于安装该发行版的问题也许是恰当的。此时，应描述问题的准确 细节。在此之前，先用 &#8220;linux&#8221;和<span style="font-weight: bold; font-style: italic">所有</span>被怀 疑的硬件(为关键词)仔细搜索。</p></td></tr>
<tr class="question">
<td valign="top" align="left"><span style="font-weight: bold">问：</span><br /></td>
<td valign="top" align="left">
<p><a name="id3002722"></a>我如何才能破解超级用户口令/盗取频道操作员的特权/查看某人的电子邮件？</p></td></tr>
<tr class="answer">
<td valign="top" align="left"><span style="font-weight: bold">答：</span><br /></td>
<td valign="top" align="left">
<p>想做这种事情说明你是个卑劣的家伙，想让黑客教你做这种事情说明你是个白痴。</p></td></tr></tbody></table></div></div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="examples"></a>好问题与坏问题</h2></div></div></div>
<p>最后，我将通过举例来演示提问的智慧。同样的问题两种问法，一种愚蠢，另一种明智。</p>
<div class="variablelist">
<dl>
<dt><span class="term"><span class="strong"></span></span><br /><span class="term"><span class="term">愚蠢：我在哪能找到关于Foonly Flurbamatic设备的东西？</span></span> 
<dt><span class="term"></span><br />
<dd>
<p>这个问题在乞求得到 <a href="http://community.csdn.net/IndexPage/SmartQuestion.aspx#rtfm">STFW</a> 式的回复。</p>
<dt><span class="term"><span class="strong"></span></span><br /><span class="term"><span class="term">明智：我用Google搜索过&#8220;Foonly Flurbamatic 2600&#8221;，但没有找到什么有用的，有谁知道在哪能找到这种设备的编程信息？</span></span> 
<dt><span class="term"></span><br />
<dd>
<p>这个人已经搜索过网络了，而且听起来他可能真的遇到了问题。</p></dd></dl></div>
<div class="variablelist">
<dl>
<dt><span class="term"><span class="strong"></span></span><br /><span class="term"><span class="term">愚蠢：我不能编译某项目的源代码，它为什 么这么破？</span></span> 
<dt><span class="term"></span><br />
<dd>
<p>他假设是别人搞砸了，太自大了。</p>
<dt><span class="term"><span class="strong"></span></span><br /><span class="term"><span class="term">明智：某项目的源代码不能在某Linux 6.2版下编译。我读了常见问题文档，但其中没有与某Linux相关的问题。这是编译时的记录，我做错了什么吗？</span></span> 
<dt><span class="term"></span><br />
<dd>
<p>他指明了运行环境，读了FAQ，列出了错误，也没有假设问题是别人的过错，这家伙值得注意。</p></dd></dl></div>
<div class="variablelist">
<dl>
<dt><span class="term"><span class="strong"></span></span><br /><span class="term"><span class="term">愚蠢：我的主板有问题，谁能帮我？</span></span> 
<dt><span class="term"></span><br />
<dd>
<p>某黑客对此的反应可能是：&#8220;是的，还需要帮你拍背和换尿布吗？&#8221;，然后是敲下删除键。</p>
<dt><span class="term"><span class="strong"></span></span><br /><span class="term"><span class="term">明智：我在S2464主板上试过X、Y和 Z，当它们都失败后，又试了A、B和C。注意我试C时的奇怪症状，显然某某东西正在做某某事情，这不是期望的。通常 在Athlon MP主板上导致某某事情的原因是什么？有谁知道我还能再试点什么以确定问题？</span></span> 
<dt><span class="term"></span><br />
<dd>
<p>相反地，这个人看来值得回答。他展现了解决问题的能力而不是坐等天上掉馅饼。</p></dd></dl></div>
<p>在最后那个问题中，注意&#8220;给我一个回复&#8221;与&#8220;请帮我看看我还能再做点什么测试以得到启发&#8221;之间细微但重要的差别。</p>
<p>事实上，最后那个问题基本上源于2001年8月Linux内核邮件列表(lkml)上的真实事件，是我(Eric)当时提了那个问题，我发现 Tyan S2462 主板有神秘的死机现象，邮件列表成员给我提供了解决此问题的关键信息。<br /></p>
<p>通过这种提问方式，我给了别人可以咀嚼玩味的东西。我设法使之对参与者既轻松又有吸引力，也表明了对同行能力的尊敬并邀请他们与我一起协商。通 过告诉 他们我已经走过的弯路，我还表明了对他们宝贵时间的尊重。</p>
<p>事后，当我感谢大家并评论这次良好的经历时，一个Linux内核邮件列表的成员谈到，他认为并不是因为我的名字在列表上，而是因为我正确的提问方式 才 得到了答 案。</p>
<p>黑客们在某种方面是非常不留情面的精英分子。我想他是对的，如果我表现得象个不劳而获的寄生虫，不管我是谁都会被忽略或斥责。他建议将整个事件作为 对其它 人 提问的指导直接导致了本文的编写。</p></div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="id3002966"></a>如果没有回复</h2></div></div></div>
<p>如果得不到回答，请不要认为我们不想帮你，有时候只是因为小组成员的确不知道答案。没有回复不等于被忽略，当然必须承认从外面很难看出两者的差别。</p>
<p>一般来说，直接将问题再张贴一次不好，这会被视为毫无意义的骚扰。</p>
<p>还有其它资源可以寻求帮助，通常是在一些面向新手的资源中。</p>
<p>有许多在线与本地用户组织，虽然它们自己不编写任何软件，但是对软件很热心。这些用户组通常因互助和帮助新手而形成。</p>
<p>还有众多大小商业公司提供签约支持服务(红帽与Linuxcare是两家最出名的，还有许多其它的)。别因为要付点钱才有支持就感到沮丧！毕竟，如 果你车子的 汽缸垫烧了，你多半还得花钱找个修理店把它弄好。即使软件没花你一分钱，你总不能指望服务支持都是免费的。</p>
<p>象Linux这样流行的软件，每个开发者至少有一万个以上的用户，一个人不可能应付这么多用户的服务要求。记住，即使你必须付费才能得到支持，也比 你还得额外花钱买软件要少得多(而且对封闭源代码软件的服务支持与开源软件相比通常还要贵一点，也要差一点)</p></div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="id3003018"></a>如何更好地回答 问题</h2></div></div></div>
<p><span class="emphasis"><em></em></span><span style="font-weight: bold; font-style: italic">态度和善一点。</span>问题带来的压力常使人 显得无礼或愚蠢，其实并不是这样。</p>
<p><span class="emphasis"><em></em></span><span style="font-weight: bold; font-style: italic">对初犯者私下回复。</span>对那些坦诚犯错 之人没有必要当众羞辱，一个真正的新手也许连怎么搜索或在哪找FAQ都不知道。</p>
<p><span class="emphasis"><em></em></span><span style="font-weight: bold; font-style: italic">如果你不确定，一定要说出来！</span>一个听 起来权威的错误回复比没有还要糟，别因为听起来象个专家好玩就给别人乱指路。要谦虚和诚实，给提问者与同行都树个好榜样。</p>
<p><span class="emphasis"><em></em></span><span style="font-style: italic"><span style="font-weight: bold">如果帮不了忙，别妨 碍。</span></span>不要在具体步骤上开玩笑，那样也许会毁了用户的安装&#9472;&#9472;有些可怜的呆瓜会把它当成真的指令。</p>
<p><span class="emphasis"><em></em></span><span style="font-weight: bold; font-style: italic">探索性的反问以引出更多的细节</span>。如 果你做得好，提问者可以学到点东西&#9472;&#9472;你也可以。试试将很差的问题转变成好问题，别忘了我们都曾是新手。</p>
<p>尽管对那些懒虫报怨一声RTFM是正当的，指出文档的位置(即使只是建议做个Google关键词搜索)会更好。</p>
<p><span class="emphasis"><em></em></span><span style="font-style: italic"><span style="font-weight: bold">如果你决意回答，给 出好的答案。</span></span>当别人正使用错误的工具或不当 的方法时别建议笨拙的权宜之计，应推荐更好的工具，重新组织问题。</p>
<p><span class="emphasis"><em></em></span><span style="font-style: italic"><span style="font-weight: bold">帮助你的社区从问题中 学习。</span></span>当回复一个好问题时，问问自己 &#8220;如何修改相关文件或FAQ文档以免再次解答同样的问题？&#8221;，接着再向文档维护者发一份补丁。</p>
<p>如果你的确是在研究一番后才做出的回答，<span style="font-weight: bold; font-style: italic">展 现你的技巧而不是直接端出结果。</span>毕竟&#8220;授 人以鱼，不如授人以渔&#8221;。</p></div>
<div class="sect1" lang="en" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h2 class="title" style="clear: both"><a name="id3003109"></a>相关资源</h2></div></div></div>
<p>如果还需要个人电脑、Unix和互联网如何工作的基础知识，参阅<a href="http://en.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/">Unix 和互联网如何工作的基本原理</a> </p>
<p>当你发布软件或补丁时，尝试按 <a href="http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html">软件发布实践</a> 指南进行。</p></div><img src ="http://www.cppblog.com/Data/aggbug/173342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Data/" target="_blank">数据中心</a> 2012-05-01 13:39 <a href="http://www.cppblog.com/Data/archive/2012/05/01/173342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在linux操作系统下用C语言编程</title><link>http://www.cppblog.com/Data/archive/2012/05/01/173297.html</link><dc:creator>数据中心</dc:creator><author>数据中心</author><pubDate>Mon, 30 Apr 2012 18:08:00 GMT</pubDate><guid>http://www.cppblog.com/Data/archive/2012/05/01/173297.html</guid><wfw:comment>http://www.cppblog.com/Data/comments/173297.html</wfw:comment><comments>http://www.cppblog.com/Data/archive/2012/05/01/173297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Data/comments/commentRss/173297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Data/services/trackbacks/173297.html</trackback:ping><description><![CDATA[<p><font size="5"><strong><u>在linux操作系统下用C语言编程<br /></u></strong></font></p>
<p><br />这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: <br />源程序编译 <br />Makefile的编写 <br />程序库的链接 <br />程序的调试 <br />头文件和系统求助 <br /><br />-------------------------------------------------------------------------------- <br />1.源程序的编译 <br />在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. <br />假设我们有下面一个非常简单的源程序(hello.c): <br />int main(int argc,char **argv) <br />{ <br />printf("Hello Linuxn"); <br />} <br /><br />要编译这个程序,我们只要在命令行下执行: <br />gcc -o hello hello.c <br />gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中 <br />gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello <br />而hello.c是我们的源程序文件. gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道了,表示我们要求输出的可执行文件名. <br />-c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息. 知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明. <br />2.Makefile的编写 <br />假设我们有下面这样的一个程序,源代码如下: <br /><br />/* main.c */ <br />#include "mytool1.h" <br />#include "mytool2.h" <br /><br />int main(int argc,char **argv) <br />{ <br />mytool1_print("hello"); <br />mytool2_print("hello"); <br />} <br /><br />/* mytool1.h */ <br />#ifndef _MYTOOL_1_H <br />#define _MYTOOL_1_H <br /><br />void mytool1_print(char *print_str); <br /><br />#endif <br /><br />/* mytool1.c */ <br />#include "mytool1.h" <br />void mytool1_print(char *print_str) <br />{ <br />printf("This is mytool1 print %sn",print_str); <br />} <br /><br />/* mytool2.h */ <br />#ifndef _MYTOOL_2_H <br />#define _MYTOOL_2_H <br /><br />void mytool2_print(char *print_str); <br /><br />#endif <br /><br />/* mytool2.c */ <br />#include "mytool2.h" <br />void mytool2_print(char *print_str) <br />{ <br />printf("This is mytool2 print %sn",print_str); <br />} <br /><br /><br />当然由于这个程序是很短的我们可以这样来编译 <br />gcc -c main.c <br />gcc -c mytool1.c <br />gcc -c mytool2.c <br />gcc -o main main.o mytool1.o mytool2.o <br />这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c) <br />那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以 <br />起到作用的.但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译? 为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉.在我们执行 <br />make之前,我们要先编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个Makefile的文件是: # 这是上面那个程序的Makefile文件 <br />main:main.o mytool1.o mytool2.o <br />gcc -o main main.o mytool1.o mytool2.o <br />main.o:main.c mytool1.h mytool2.h <br />gcc -c main.c <br />mytool1.o:mytool1.c mytool1.h <br />gcc -c mytool1.c <br />mytool2.o:mytool2.c mytool2.h <br />gcc -c mytool2.c <br /><br />有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的. <br />下面我们学习Makefile是如何编写的. <br />在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明.一般的格式是: <br />target: components <br />TAB rule <br /><br />第一行表示的是依赖关系.第二行是规则. <br />比如说我们上面的那个Makefile文件的第二行 <br />main:main.o mytool1.o mytool2.o <br />表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o mytool2.o <br />当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o <br />main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键 Makefile有三个非常有用的变量.分别是$@,$^,$ <br /><br />int main(int argc,char **argv) <br />{ <br />double value; <br />printf("Value:%fn",value); <br />} <br /><br />这个程序相当简单,但是当我们用 gcc -o temp temp.c 编译时会出现下面所示的错误. <br />/tmp/cc33Kydu.o: In function `main': <br />/tmp/cc33Kydu.o(.text+0xe): undefined reference to `log' <br />collect2: ld returned 1 exit status <br /><br />出现这个错误是因为编译器找不到log的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在Linux下,为了 <br />使用数学函数,我们必须和数学库连接,为此我们要加入 -lm 选项. gcc -o temp temp.c <br />-lm这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么没有连接库呢?是这样的,对于一些常用的函数的实现,gcc编译器会自 <br />动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的 <br />-L选项指定路径.比如说我们有一个库在 /home/hoyt/mylib下,这样我们编译的时候还要加上 <br />-L/home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib <br />/usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径. 还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办 <br />法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthread.a). <br />当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用 nm -o /lib/*.so|grep <br />sin&gt;~/sin 命令,然后看~/sin文件,到那里面去找了. <br />在sin文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在 <br />libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm). <br />如果你知道怎么找,请赶快告诉我,我回非常感激的.谢谢! 4.程序的调试 <br />我们编写的程序不太可能一次性就会成功的,在我们的程序当中,会出现许许多多我们想不到的错误,这个时候我们就要对我们的程序进行调试了. <br />最常用的调试软件是gdb.如果你想在图形界面下调试程序,那么你现在可以选择xxgdb.记得要在编译的时候加入 <br />-g选项.关于gdb的使用可以看gdb的帮助文件.由于我没有用过这个软件,所以我也不能够说出如何使用. <br />不过我不喜欢用gdb.跟踪一个程序是很烦的事情,我一般用在程序当中输出中间变量的值来调试程序的.当然你可以选择自己的办法,没有必要去学别人的.现 <br />在有了许多IDE环境,里面已经自己带了调试器了.你可以选择几个试一试找出自己喜欢的一个用. <br />5.头文件和系统求助 <br />有时候我们只知道一个函数的大概形式,不记得确切的表达式,或者是不记得着函数在那个头文件进行了说明.这个时候我们可以求助系统. <br />比如说我们想知道fread这个函数的确切形式,我们只要执行 man fread <br />系统就会输出着函数的详细解释的.和这个函数所在的头文件说明了. 如果我们要write这个函数的说明,当我们执行man <br />write时,输出的结果却不是我们所需要的. <br />因为我们要的是write这个函数的说明,可是出来的却是write这个命令的说明.为了得到write的函数说明我们要用 man 2 write. <br />2表示我们用的write这个函数是系统调用函数,还有一个我们常用的是3表示函数是C的库函数. 记住不管什么时候,man都是我们的最好助手. </p><img src ="http://www.cppblog.com/Data/aggbug/173297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Data/" target="_blank">数据中心</a> 2012-05-01 02:08 <a href="http://www.cppblog.com/Data/archive/2012/05/01/173297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下C语言编程基础(Makefile) </title><link>http://www.cppblog.com/Data/archive/2012/05/01/173296.html</link><dc:creator>数据中心</dc:creator><author>数据中心</author><pubDate>Mon, 30 Apr 2012 18:07:00 GMT</pubDate><guid>http://www.cppblog.com/Data/archive/2012/05/01/173296.html</guid><wfw:comment>http://www.cppblog.com/Data/comments/173296.html</wfw:comment><comments>http://www.cppblog.com/Data/archive/2012/05/01/173296.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Data/comments/commentRss/173296.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Data/services/trackbacks/173296.html</trackback:ping><description><![CDATA[<p align="center"><strong><font color="#660000" size="5"><u>Linux下C语言编程基础(Makefile) <br /><br /></u></font></strong></p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;假设我们有下面这样的一个程序，源代码如下： </p><ccid />
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
<tbody>
<tr>
<td class="code" style="font-size: 9pt" bgcolor="#e6e6e6"><pre><ccid />/* main.c */ 

#include "mytool1.h" 

#include "mytool2.h" 

int main(int argc，char **argv) 

{ 

mytool1_print("hello")； 

mytool2_print("hello")； 

} 

/* mytool1.h */ 

#ifndef _MYTOOL_1_H 

#define _MYTOOL_1_H 

void mytool1_print(char *print_str)； 

#endif 

/* mytool1.c */ 

#include "mytool1.h" 

void mytool1_print(char *print_str) 

{ 

printf("This is mytool1 print %s "，print_str)； 

} 

/* mytool2.h */ 

#ifndef _MYTOOL_2_H 

#define _MYTOOL_2_H 

void mytool2_print(char *print_str)； 

#endif 

/* mytool2.c */ 

#include "mytool2.h" 

void mytool2_print(char *print_str) 

{ 

printf("This is mytool2 print %s "，print_str)； 

}</ccid /></pre></td></tr></tbody></table></p></ccid />
<p style="text-indent: 2em">当然由于这个程序很短，我们可以这样来编译: </p>
<p style="text-indent: 2em"><ccid />
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
<tbody>
<tr>
<td class="code" style="font-size: 9pt" bgcolor="#e6e6e6"><pre><ccid />gcc -c main.c 

gcc -c mytool1.c 

gcc -c mytool2.c 

gcc -o main main.o mytool1.o mytool2.o</ccid /></pre></td></tr></tbody></table></p>
<p style="text-indent: 2em">这样的话我们也可以产生main程序，而且也不是很麻烦。但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说，这个很容易解决啊，我写一个SHELL脚本，让它帮我去完成不就可以了。是的对于这个程序来说，是可以起到作用的。但是当我们把事情想的更复杂一点，如果我们的程序有几百个源程序的时候，难道也要编译器重新一个一个的去编译? </p>
<p style="text-indent: 2em">为此，聪明的程序员们想出了一个很好的工具来做这件事情，这就是make。我们只要执行以下make，就可以把上面的问题解决掉。在我们执行make之前，我们要先编写一个非常重要的文件。--Makefile。对于上面的那个程序来说，可能的一个Makefile的文件是： </p>
<p style="text-indent: 2em"># 这是上面那个程序的Makefile文件: </p>
<p style="text-indent: 2em"><ccid />
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
<tbody>
<tr>
<td class="code" style="font-size: 9pt" bgcolor="#e6e6e6"><pre><ccid />main：main.o mytool1.o mytool2.o 

gcc -o main main.o mytool1.o mytool2.o 

main.o：main.c mytool1.h mytool2.h 

gcc -c main.c 

mytool1.o：mytool1.c mytool1.h 

gcc -c mytool1.c 

mytool2.o：mytool2.c mytool2.h 

gcc -c mytool2.c</ccid /></pre></td></tr></tbody></table></ccid /></p>
<p style="text-indent: 2em">有了这个Makefile文件，不论我们什么时候修改了源程序当中的什么文件，我们只要执行make命令，我们的编译器都只会去编译和我们修改的文件有关的文件，其它的文件它连理都不想去理的。 </p>
<p style="text-indent: 2em">下面我们学习Makefile是如何编写的。 </p>
<p style="text-indent: 2em">在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明。一般的格式是： </p>
<p style="text-indent: 2em">target：components </p>
<p style="text-indent: 2em">TAB rule </p>
<p style="text-indent: 2em">第一行表示的是依赖关系。第二行是规则。 </p>
<p style="text-indent: 2em">比如说我们上面的那个Makefile文件的第二行。 </p>
<p style="text-indent: 2em">main：main.o mytool1.o mytool2.o </p>
<p style="text-indent: 2em">表示我们的目标(target)main的依赖对象(components)是main.o mytool1.omytool2.o 当倚赖的对象在目标修改后修改的话，就要去执行规则一行所指定的命令。就象我们的上面那个Makefile第三行所说的一样要执行 gcc-o main main.o mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键 </p>
<p style="text-indent: 2em">Makefile有三个非常有用的变量。分别是$@，$^，$&lt;代表的意义分别是： </p>
<p style="text-indent: 2em">$@--目标文件，$^--所有的依赖文件，$&lt;--第一个依赖文件。 </p>
<p style="text-indent: 2em">如果我们使用上面三个变量，那么我们可以简化我们的Makefile文件为： </p>
<p style="text-indent: 2em"># 这是简化后的Makefile </p>
<p style="text-indent: 2em">main：main.o mytool1.o mytool2.o </p>
<p style="text-indent: 2em">gcc -o $@ $^ </p>
<p style="text-indent: 2em">main.o：main.c mytool1.h mytool2.h </p>
<p style="text-indent: 2em">gcc -c $&lt; </p>
<p style="text-indent: 2em">mytool1.o：mytool1.c mytool1.h </p>
<p style="text-indent: 2em">gcc -c $&lt; </p>
<p style="text-indent: 2em">mytool2.o：mytool2.c mytool2.h </p>
<p style="text-indent: 2em">gcc -c $&lt; </p>
<p style="text-indent: 2em">经过简化后,我们的Makefile是简单了一点，不过人们有时候还想简单一点。这里我们学习一个Makefile的缺省规则 </p>
<p style="text-indent: 2em">.c.o： </p>
<p style="text-indent: 2em">gcc -c $&lt; </p>
<p style="text-indent: 2em">这个规则表示所有的 .o文件都是依赖与相应的.c文件的。例如mytool.o依赖于mytool.c这样Makefile还可以变为： </p>
<p style="text-indent: 2em"># 这是再一次简化后的Makefile </p>
<p style="text-indent: 2em">main：main.o mytool1.o mytool2.o </p>
<p style="text-indent: 2em">gcc -o $@ $^ </p>
<p style="text-indent: 2em">.c.o： </p>
<p style="text-indent: 2em">gcc -c $&lt; </p>
<p style="text-indent: 2em">好了，我们的Makefile 也差不多了，如果想知道更多的关于Makefile的规则，可以查看相应的文档。 </p><img src ="http://www.cppblog.com/Data/aggbug/173296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Data/" target="_blank">数据中心</a> 2012-05-01 02:07 <a href="http://www.cppblog.com/Data/archive/2012/05/01/173296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 下 C 语言编程</title><link>http://www.cppblog.com/Data/archive/2012/05/01/173295.html</link><dc:creator>数据中心</dc:creator><author>数据中心</author><pubDate>Mon, 30 Apr 2012 18:04:00 GMT</pubDate><guid>http://www.cppblog.com/Data/archive/2012/05/01/173295.html</guid><wfw:comment>http://www.cppblog.com/Data/comments/173295.html</wfw:comment><comments>http://www.cppblog.com/Data/archive/2012/05/01/173295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Data/comments/commentRss/173295.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Data/services/trackbacks/173295.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Linux的发行版中包含了很多软件开发工具。 它们中的很多是用于 C 和 C++应用程序开发的。 本文介绍了在 Linux 下能用于 C 应用程序开发和调试的工具。 本文的主旨是介绍如何在 Linux 下使用 C 编译器和其他 C 编程工具, 而非 C 语言编程的教程。&nbsp;&nbsp;<a href='http://www.cppblog.com/Data/archive/2012/05/01/173295.html'>阅读全文</a><img src ="http://www.cppblog.com/Data/aggbug/173295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Data/" target="_blank">数据中心</a> 2012-05-01 02:04 <a href="http://www.cppblog.com/Data/archive/2012/05/01/173295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下的多线程编程</title><link>http://www.cppblog.com/Data/archive/2012/05/01/173294.html</link><dc:creator>数据中心</dc:creator><author>数据中心</author><pubDate>Mon, 30 Apr 2012 17:59:00 GMT</pubDate><guid>http://www.cppblog.com/Data/archive/2012/05/01/173294.html</guid><wfw:comment>http://www.cppblog.com/Data/comments/173294.html</wfw:comment><comments>http://www.cppblog.com/Data/archive/2012/05/01/173294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Data/comments/commentRss/173294.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Data/services/trackbacks/173294.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1 引言<br>　　线程（thread）技术早在60年代就被提出，但真正应用多线程到操作系统中去，是在80年代中期，solaris是这方面的佼佼者。传统的Unix也支持线程的概念，但是在一个进程（process）中只允许有一个线程，这样多线程就意味着多进程。现在，多线程技术已经被许多操作系统所支持，包括Windows/NT，当然，也包括Linux。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/Data/archive/2012/05/01/173294.html'>阅读全文</a><img src ="http://www.cppblog.com/Data/aggbug/173294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Data/" target="_blank">数据中心</a> 2012-05-01 01:59 <a href="http://www.cppblog.com/Data/archive/2012/05/01/173294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自制一小型的linux系统mylinux</title><link>http://www.cppblog.com/Data/archive/2012/05/01/173293.html</link><dc:creator>数据中心</dc:creator><author>数据中心</author><pubDate>Mon, 30 Apr 2012 17:55:00 GMT</pubDate><guid>http://www.cppblog.com/Data/archive/2012/05/01/173293.html</guid><wfw:comment>http://www.cppblog.com/Data/comments/173293.html</wfw:comment><comments>http://www.cppblog.com/Data/archive/2012/05/01/173293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Data/comments/commentRss/173293.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Data/services/trackbacks/173293.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 通过grub引导程序引导编译后的内核文件bzImage,把制作的文件系统变成ramdisk镜像文件,通过内存加载镜像文件完成文件系统的注入；其中的命令通过编译busybox生成bin,sbin文件；注意：<br><br>内核文件+文件系统镜像文件+grub引导程序<=1440K<br><br>&nbsp;&nbsp;<a href='http://www.cppblog.com/Data/archive/2012/05/01/173293.html'>阅读全文</a><img src ="http://www.cppblog.com/Data/aggbug/173293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Data/" target="_blank">数据中心</a> 2012-05-01 01:55 <a href="http://www.cppblog.com/Data/archive/2012/05/01/173293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>