UNIX编程艺术的序
Unix is not so much an operating system as an oral history.与其说Unix是个操作系统,不如说是一部口述历史。——Neal Stephenson知识和专能差异巨大,凭借知识可以推断出该做什么,而专能让你甚至在无意之间,条件反射似的把事情做好。这本书确实有关“知识”,但更着眼于“专能”。你将学到那些Unix专家们都不自知的Unix开发知识。少一点技术,多一些共享文化:显见和隐微的,直观和潜流的——这是本书和大多数Unix书籍不同的地方——不止于方法,更重乎理念。理念于实用大有裨益,有太多设计不良的软件:体积臃肿,难于维护、移植和扩展——这些都是蹩脚设计的症候。我们希望本书的读者能品出什么是Unix所教示的良好设计。本书分为四部分:场景、设计、工具和社群。第一部分(场景)涉及哲学和历史,为后续内容埋下伏笔。第二部分(设计)将Unix哲学的原理细分为有关设计与实现的、更专门的建议。第三部分(工具)着眼于Unix所提供的工具,可助你解决问题。第四部分(社群)则讲述人与人之间的事务与约定,而这正是Unix文化拥有高效能的原因。这本书是关于共享文化的,我从未想像过独自完成它。你会发现正剧中包含数位Unix资深专家的客串演出,正是这些人塑造了Unix的习俗。本书曾有过公开大范围的审阅过程,这期间我邀请这些明星人士对书稿进行评审与研论。这些意见没有湮没在本书定稿中,而你可以在书中聆听到他们的真实声音:无论是为本书呐喊助阵、还是摇头反对。本书中用到人称“我们”时,我并不是虚张声势,仅以此说明这是整个社群都清楚明了的事实。因为本书着力传递文化,因此加入了很多野史和坊间传说,这在技术书中并不多见。希望你喜欢,这些东西其实是Unix程序员的教养。须弥不重,芥子不轻。我们希望以这种方式更好地讲述故事。了解Unix的由来和变迁,会培养你对Unix风格的直觉。同样地,基于此,我们不打算使用回述历史的腔调。你会发现本书参考了众多时下信息。我们不希望给你一种错觉:书里说的都是亘古不变的终极真理。参考时下的信息这一做法,也提醒读者,三十年河东,三十年河西,眼前所见,也许过不了多久就会过时,而需要重新检省。另外,本书不是C教程,不是Unix命令和API的手册,不是sed/yacc/Perl/Python的语言参考,也不是网络编程入门,更不是巨细靡遗的令人费解的X指南。本书也不打算带你巡游Unix内幕和体系。有很多其它的好书涵盖这些领域,本书会在适当的时候告诉你该看哪些。在这些技术细节外,Unix文化有一个未见诸笔端的行工传统,以熟练工的考量,它已经有几百万人年的发展 。本书即立足于这样一个信念:领会此传统,并将它的设计手法应用到手边,你将成为更好的程序员和设计师。构成文化的是人,一直以来,获知文化的方式大约是口口相传、潜移默化。本书不打算取代人际的文化传播,但可以促进这一过程,使你能俯耳倾听他人的心声。谁应该看这本书如果你是个Unix编程老手,经常教导菜鸟,或者与人进行操作系统论战时无法阐明使用Unix方案所带来的好处时,可以看看这本书。如果你是个C、C++或者Java程序员,有其它操作系统的开发经验,现在轮到你开展一个Unix项目时,可以看看这本书。如果你是个初级或者中级水平的Unix用户,但是没什么开发经验,想学习在Unix下如何高效地设计软件时,可以看看这本书。如果你不在Unix下编程却发觉Unix的传统给你带来某种启迪,那你就对了,Unix哲学适用于其它的操作系统。因此我们会花比其它Unix书籍更多的篇幅关注非Unix环境(特别是微软的操作系统);当所用到工具或者案例可用于其它操作系统时,我们会告诉你。如果你是一个系统架构师,正为通用市场或垂直应用准备平台方案或实现策略时可以看看这本书。本书将帮助你了解Unix作为开发平台的强大功能,以及开放源码这个Unix的传统所带来的开发方式。如果你想学到C编程的细节或者想知道怎么用Unix内核API,本书可能不适合你。Advanced Programming in theUnix Environment [Stevens92]是探究Unix API的经典名著;The Practice of Programming [Kernighan-Pike99]是每个C程序员的必读书目(任何语言的程序员都该看看这本书)。如何使用这本书这本书既重实践,更富理念;既包含警世格言,又不忘检点Unix开发中的特殊案例。在每个警句前后,都有生动实例阐明其由来,这些例子绝不来自小儿科式的示例程序,而均出自真实世界满眼所见的运行代码。我们着力避免以大量代码或者规范文件来胡乱凑数,当然这么做会让本书的写作轻松许多(某些地方或许读起来也更轻松)。绝大多数编程书籍只授你以鱼,而本书避免这种做法,力求培养读者“探求事情何以如此”的感知力。正由于此,本书会时常请你阅读代码与规范文档,它们中极少量的内容会附在书中,其余部分我们会在举例时告诉你如何从网上获取。从这些范例中汲取养分,将有助你将所学原则消化变为疱丁之技。如果你能就着一部跑在Unix系统上的网页浏览器来读书,是再理想不过的了。任何Unix系统都适合,但是我们将要研究的案例大多都会预装在、或者可以从Linux系统上获得,书中会提示请你浏览或亲身感受它们。这些提示通常是按部就班的,跑开玩一会儿并不会打散整个讲述过程的连续性。注意:我们虽力求,但无法给你打保票,声称我们所引用的URLs稳定可用。如果你发现某个引用连接已陈旧过时,来点常识,用你喜爱的搜索引擎来个短语搜索。如有可能,我们会在所引用的URLs附近给出如何搜索的提示。大多数缩写形式会在首次出现时伴随其全称。为方便起见,我们在附录中提供了名词对照表。交叉索引通常以作者名字为主导词。带编号的脚注是那些可能会扰乱你阅读正文,或者是易变的URLs;也可能是旁征博引的战争故事或者笑话 。为了使这本书不至于让非技术人员太过难读,我们邀请了一些非程序员试读,并指出一些晦涩但起贯穿作用的词汇。我们把那些编程老手不太会需要的名词解释也放在脚注中。相关引文一些Unix早期拓荒者的著名论文和书籍,比如Kernighan和Pike的《The Unix Programming Environment》[Kernighan-Pike84]就是其中佼佼者,被世人尊为圭臬。而今看来此书廉颇老矣,它没提到Internet、万维网以及诸如Perl、Tcl和Python这些解释型语言的新秀。写作本书的中途我们借鉴了Mike Gancarz的《The Unix Philosophy》[Gancarz]。这本书在它的覆盖范围内极其优秀,但是我们觉得需要更多内容才能反映出事情的全貌。尽管如此我们仍对此书作者心存感激,他愈发使我们知道最简单的Unix设计手法就是最持久耐用的。《The Pragmatic Programmer》[Hunt-Thomas]是一本关于良好设计的书,文风机智诙谐,它与本书相比,倾向于软件设计工艺的另一个层面(更注重编码,而少着墨于高层面的问题划分)。作者的哲学是其Unix领域耕耘的成果,也是本书内容极好的补充。《The Practice of Programming》[Kernighan-Pike99]包含了一些与《The Pragmatic Programmer》共通的内容,但更钻入Unix传统的深处。最后(明知道会激怒你),我们推荐《Zen Flesh, Zen Bones》[Reps-Senzaki],一部重要的佛教禅宗本源的合集。对禅的引用书目遍布全书。我们将这些书目包含进来,是因为禅为表达某种想法提供了丰富的语汇,而在软件设计中却很难烂熟于心。信奉宗教的读者,请您不要把禅当成宗教,它是一种心灵鸡汤似的东西,纯净而没有神灵的干扰——此即是禅。本书的习俗约定术语“UNIX”技术上和法律上讲,是The Open Group的商标,并且应该仅限于那些通过The Open Group严格的“符合标准”认证的操作系统。本书中我们使用其较宽松的定义,即大多数程序员所指的,Bell实验室Unix代码的后裔或旁支。在这个意义下,Linux(大多数例子都举自它)也算是一种Unix。本书也使用了Unix手册页(manual page)的传统,即以括号括起来的手册节号来标记Unix设施。通常用于强调一个Unix命令首次出现。比如“munger(1)”可解读为“munger程序加入存在于你的系统中,其文档位于Unix手册页的第1节”。第2节是C的系统调用,第3节是C的库函数调用,第5节是文件格式与协议,第8节是系统管理工具。其它节号本书未曾用到,其定义在各个Unix系统各有不同。在你的Unix外壳提示符下输入man 1 man(老式的System VUnix系统可能要输入man -s 1 man)以获得更多信息。有时我们会提及某个Unix程序(比如Emacs),后面没有手册节号而且首字母大写。这意味这个名字代表一族Unix程序,其基本功能相同,而我们将讨论其通用特性。比如Emacs,就包含了xemacs。本书很多地方我们同时给出了老式(old school)和新式(new school)解法。new-school和rap音乐一样,开始于1990年前后。在这个含义下,我们往往把它与脚本语言、图形用户界面、开放源码的Unix和万维网联系起来。Old-school指代1990年以前(特别是1985年以前)的世界:昂贵的共用计算机、专属的Unix,shell脚本和无所不在的C。值得指出这些差异,机器越来越便宜,内存多了起来,这些有如暗流,渐渐影响着Unix编程的风格。所用案例很多编程书籍为证明某一观点而特地造出一个范例,你手中这本书不这么干。我们的案例研究均来自真实世界,在生产环境中工作已久。下面是一些主要案例:cdrtools/xcdroast这两个独立的项目通常被一并使用。cdrtools是一组刻盘工具(用关键字“cdrtools”可以在网上找到)。xcdroast是cdrtools的图型界面前端,其项目网站。fetchmailfetchmail用于从远程邮件服务器上收信,支持POP3和IMAP邮箱协议。其主页为,也可以用关键字“fetchmail”从网上找到。GIMPGIMP(GNU Image Manipulation Program,GNU图像处理程序)是一个全特性的绘画和图像处理程序,可对多种图像格式进行复杂处理。其源码可从GIMP主页获得(也可以通过关键字“GIMP”从网上搜到)。muttmutt邮件客户端是目前各类基于文本的邮件客户端程序中的翘楚,提供对MIME(Multipurpose Internet Mail Extensions)、个人隐私辅助程序,如PGP(Pretty Good Privacy)和GPG(GNU Privacy Guard)等特性的绝佳支持。其源码和二进制可执行文件可以从Mutt项目主页获得。xmltoxmlto可将DocBook和其它XML文档以多种格式渲染输出,包括HTML、纯文本和PostScript。其源码和文档可在xmlto主页获得。为了将读者理解本书例子所要阅读的代码量降低到最小程度,我们尽量挑选那些可重复使用、并能体现多种不同设计原理和设计实践的案例。出于同样原因,很多示例来自于我本人的项目。我没想说这些例子最为恰当,只是我觉得它们对阐述我的观点非常有用。作者致谢各位客串贡献者(Ken Arnold, Steven M. Bellovin, Stuart Feldman, Jim Gettys, Steve Johnson, Brian Kernighan, David Korn, Mike Lesk, Doug McIlroy, Marshall Kirk McKusick, Keith Packard, Henry Spencer, 和Ken Thompson)为本书增添极大价值。特别是Doug McIlroy,给予本书恪尽职责、鞭辟入里的评注的同时,也展现了他早在30年前管理最原始的Unix研究组时鞠躬尽瘁的高风亮节。我要对Rob Landley和我的妻子Catherine Raymond致以特别感谢,他们都不厌其烦地逐行对本书手稿进行审阅。Rob的深富洞察力的细致评述激励我在最终稿中加入了一整章内容,他为本书的组织结构与取材范围奉献极多。如果把他所给予的改进意见落在笔端,那他无愧于本书的合著者。Cathy代表读者中非技术人员的一群,如果那些非程序员读者觉得本书并不难读,那全是她的功劳。写作的五年间,本书从不少人的讨论意见中获益良多。Mark M. Miller使我对线程有了更深的认识。John Cowan教给我不少接口设计方式,并起草了wily和VM/CMS的学习案例。Jef Raskin告诉我Rule of Least Surprise的由来。UIUC System Architecture Group对前几章给出的反馈弥足珍贵,What Unix Gets Wrong和Flexibility in Depth两节是他们直接激励的结果。Russell J. Nelson提供了Bernstein chaining的素材。第3章中MVS学习案例大部分的材料来自Jay Maynard。Les Hatton对语言一章给出很多有益建议,并促使我写成第4章中Optimal Module Size的部分内容。David A. Wheeler贡献了很多发人深省的批评,以及一些学习案例(特别是在设计部分中)的素材。Russ Cox帮助我进行了Plan 9的调查。Dennis Ritchie纠正了我的一些错误的C历史观念。成百上千的Unix程序员,人数太多以至于无法在此列出他们的名字,在2003年1月到6月间的公开审阅过程间给了我建议和评论。开放的同级复审这一过程让我觉得紧张刺激而回报极多。当然,任何最终书稿中残留的错误都是我自己的责任。“把事情说透”的风格,以及其它一些考虑因素,是受到了“设计模式运动”的影响;说实话,我对到处堆砌Unix设计模式这种做法深不以为然。我对此运动的中心教条不敢苟同,并且没觉得把设计模式严格付诸实用有什么必要,也不想背上这种思想的包袱。尽管如此,我的行事方法仍然受到Christopher Alexander成果 (特别是《Timeless Way of Building》和《A Pattern Language》两文)的影响。Gang of Four和他们的信徒为我展示了如何用Alexander的思想,站在较高层面上,抛去含混不清的对设计通则的空话,来谈论软件设计,这一点我心存感激,永志不忘。对设计模式有兴趣的读者可以看看这本书《Design Patterns: Elements of Reusable Object-Oriented Software [GangOfFour]》。本书标题毫无疑问是借鉴了Donald Knuth的《The Art of Computer Programming》一书的书名。Knuth和Unix传统文化没什么联系,但他影响了我们每一个人。有先见之明和丰富想象力的编辑并不多,好在Mark Taub就是一个,他从并不看好的项目中发现了闪光点,并极富技巧地促成了这本书的写作。文字编辑中,文笔好而又能帮助别人提高文笔的就更少了,所幸Mary Lou Nohr是其中之一。Jerry Votta的封面设计领会了我的意图,而且做得比我的想像还要漂亮。Addison-Wesley的编辑们让审稿和出版这一过程不再枯燥无味,我天生怕被人管,但是他们仍然极力配合我,使得文字、版面、图片和市场工作都达到极高水准。
UNIX编程艺术的介绍
本书写作了五年之久,作者将UNIX三十年中未见纸端的艰难胜利的软件工程智慧融入文字,使UNIX家族成为最好最具创新软件的哲学、设计模式、工具、文化和传统,Raymond将之第一次带给我们,并向我们展示它们如何影响着当今的Linux和开源运动。通过大量来自顶尖项目的实例,你将学会如何运用这些智慧经验来建造更优雅、更可移植、更加好用和更加长久的软件。
UNIX编程艺术的译 序
大多数译序是给作者说好话,顺便带动一下译本销量的,本篇是一个例外。《The Art of UNIX Programming》,简称TAOUP,作者Eric S. Raymond,简称ESR。这大概是计算机类书籍中很少见的一本课外读物。TCP/IP编程之类典型Unix编程书中讲到的东西在这本书里面找不到,所以书里讲到的当然就是别的书里找不到的东西。读者也许需要有相当的Unix背景、或者长期钻研某个专题,才能体会到作者的弦外之音。ESR作为老牌黑客信手拈来的典故,如果不是在Unix里面长期浸淫,大概很难有所共鸣,所以把这当作Unix的一部坊间史话倒也合适。本书总结了历史上Unix众多成功的经验和失败的教训、经时间考验和临时搭救的编码策略、大众喜爱和小众受用的实用工具;一些被跨国界信仰地广泛接受,一些则在不同环境中各有见地。被TAOUP总结为失败的,也许恰恰是某些工程的保命神药;总结为成功的,也许正好是压垮另一些工程的最后一根稻草。情景各异而已。书是写给程序员看的,因此很多观点都太过技术味儿,比如所见即所得的编辑器不如手写标记的纯文本更直接——90%的人会想:这怎么可能?!这本书是给读者增长见识的,很多案例分析不管结论如何,读者都可以从中见到红蓝两方的思维方式和行事方法,以及各方高手看待问题的角度。无论成功还是失败,都只是一念之间,而读者只需要体味出这些对自己过去的、手头的、未来的项目可以有何种借鉴,便已得其中三昧。网络上关于TAOUP的书评甚多,正负反响各有不少,负面评价大体集中在认为作者视角较窄、对商业公司有偏见以及过分抬爱自己的fetchmail几方面。我个人的感觉,Unix、尤其是开源Unix上有太多好用的工具极欠雕琢,目标受众太过技术。ESR并未回避这些,读者不妨多留意为数不多的痛切之笔。本书翻译经历一年多的时间,之前我曾经约略翻过纸版,偶尔见到一些合我胃口的言论,于是心有灵犀认为这书不错;然而等到译到中途,便发现ESR实在是个美国愤青,这便是课外读物和工本教程给读者的不同感受了。翻译的过程对译者是精读的过程,但希望读者能用它打发堵车、候机、等人时的无聊时间,这书适合从任何一篇翻起。翻译过程颇为艰辛:何蔡两位初译,由我统稿。书中寻章摘句之处,我们尽力将其还原。书名保持原文并给出译名,人名不译,专有名词给出原文,特意不加入任何译注。相关背景常识、翻译感受以及付梓后的任何问题,可以在中译版网页上与我们交流。这一年间,侯捷老师的推荐,周筠老师、方舟和兴璐两位编辑、何蔡二位给我的莫大帮助和宽容使得本书最终面世;身边诸位好友同事也不同程度地在各个技术方面给予指导和支持,尤其感谢bz、主任、delphij、kola几位。我的爱人王冰陪我加班,容忍我对程序的沉迷,给我心灵的温暖,是我翻译这本书的力量源泉。KISS。姜 宏2005年12月于北京
Linux下C语言编程该如何进阶呀? 另外请高手们推荐几本书书书书
“Linux C编程“和”Linux嵌入式“是不完全重合的两个东西,想学嵌入式,就直接去看嵌入式的书吧,需要用到C编程时会教你的(凡是嵌入式相关书籍上不提的C语言知识,一般是用不到的)。
请先弄清楚目的。学习嵌入式,最好先了解硬件,而且最好准备一个开发环境(硬的,可以自己组装,也可以购买现成的开发板),这东西需要实践(也需要钱,不过有很多人买了开发板后又学不下去,所以淘宝上有很多便宜的二手开发板)。学了好几天的硬盘驱动,结果发现嵌入式设备用不到,岂不浪费?多学点不坏,但我们时间有限。
以上是引言,如果觉得逆耳,请无视。
Linux下面的C开发,严重推荐Linux Programming Unleashed,清华大学出版社出过它的中文版,本书介绍了autotools、版本控制、补丁、GCC、打包发布等内容,并详细介绍了Linux的一些系统调用、进程间通信、网络编程、用户界面等内容(针对Linux,对于UNIX系统可能不适用),适合做PC下的软件开发教程。
The C programming Language(Ritchie & Kernighan)用来学习C语言是不错的(不会要你去安装Turbo C),特别是在Linux/UNIX下学习C。
在Linux下,涉及汇编,最好还能看看Professional Assembly Language(Richard Blum),讲的是AT&T汇编(如果非要用Intel汇编,可以考虑nasm程序)。
嵌入式Linux,大部分时间是在做移植,有一点C语言基础暂时就足够了,开始学习硬件吧。
补充:有人在51单片机上嵌入Linux吗?“Linux嵌入式“和”单片机“是不重合的两回事。
Linux 下的 C 编程有哪些值得推荐的好书?
UNIX环境高级编程。本书在保持了前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上介绍了多个应用示例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附录中给出了函数原型和部分习题的答案。Linux环境编程:从应用到内核。本书将从一个全新的角度带领读者重新进入Linux环境编程,从应用出发,深入内核源码,研究Linux各接口的工作机制和原理,让读者不仅知其然,还知其所以然。作为Linux开发工程师,如果不仅掌握Linux的应用层开发,同时还熟悉Linux的内核源码,那么其在Linux环境下设计开发任何产品都将游刃有余,稳定且高效。TCP/IP详解三卷。《TCP/IP详解卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者W.Richard Stevens用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作。 《TCP/IP详解卷1:协议》适合作为计算机专业学生学习网络的教材和教师参考书。也适用于研究网络的技术人员。