linux 经验谈

概要
InfoQ中文站有幸与谷歌的高级工程师苏哲在一起探讨了开源以及Linux上软件开发的相关话题,其中包括在Linux上开发的项目有哪些、在Linux上开发有哪些挑战以及如何去克服、开发中所使用的平台、工具等等。

个人简介
苏 哲,初中开始学习 C 语言编程,高三用C++开发出曾经非常流行的小工具软件 Smart Fdisk。1994年进入清华大学物理系学习,1997年开始接触 Linux 操作系统和开源软件。1999 年开发出 Smart Boot Manager 工具软件。2001 年转战研究 Linux 本地化与国际化相关技术,率先实现了 Linux 下图形用户界面对国标 GB18030的支持。随后潜心开发Smart Common Input Method platform。2002 年取得清华大学物理系凝聚态物理专业硕士后加入 Turbolinux 软件公司。随后于 2004 年加入 Novell 公司 SUSE Linux 开发团队,负责国际化和本地化相关组件的开发与维护。于2007年2月加入Google。

今天也非常荣幸邀请到Google Linux客户端软件开发小组的负责人苏哲,我想大家都是非常熟悉的。OK,那苏哲你给我们大家介绍一下你自己和你现在所主要负责的项目。
我叫苏哲,苏州的苏,哲学的哲。我是去年2月份加入Google的。在Google负责开发LINUX端的桌面上的 应用软件。那么我们现在主要集中精力在做一些跟开源相关的一些项目,我们这个小组人不是很多,我们小组的关注点非常地明确,就是要做Linux桌面端的开 源应用软件,以此推动Linux桌面的普及。大家都知道Linux桌面一直都很难大规模推广开来,很大一个原因就是软件太少,所以我们在做这方面的工作。 那么我们现在负责的这个项目叫做Google桌面小工具Linux版,这是一个开源的项目。这个小工具简单说来就是可以在你的桌面上运行很多非常有意思的 各种各样功能的一些小应用软件,比如说可以运行一个显示天气预报的,一个小的天气预报的玻璃球,可以显示你所关心城市的天气预报,比如说可以显示新闻的, 可以实时的给你显示最新的头条新闻,然后还有比如说可以显示网络上的照片,显示你的股票信息等等。那么这样的小工具对用户使用桌面来说,第一个可以使用户 时刻关心他想要知道的一些信息,那第二个有很多这种有意思小工具可以做一些用户时刻需要的事情,比如说,我们有些小工具是可以帮用户记录笔记,那这种笔记 呢,不光是可以记录在用户桌面的,还可以被同步到用户的某一个网上的帐号里面,这样的话可以在不同的电脑之间去同步笔记等等,比如说还可以去显示一个日 历,去设定你的日程安排,等等类似这种功能。
但是我们也知目前Linux在国内应用的还不是那么普遍,特别是在客户端,那你们要做基于Linux的桌面搜索,还有那些桌面小工具,初衷是什么?
其实这就是我们的初衷,主要是因为Linux在全球说实话都很不普及,那么前段时间有一个数据出来说,Linux在 全球的桌面占有量刚刚达到1%,这是非常小的一个占有量,只有1%的占有量。大家知道Linux是一个开源的操作系统,现在全球有很热的这种潮流去推进开 源的事业,因为软件说白了就是知识,知识应该是被全人类所共享的,但是Linux经过了这么长时间的发展,一直都很难发展起来,其实这里面很大一个原因就 是说,到目前为止,Linux桌面确实不是足够好用,对用户来说他拿到Linux桌面,可能很多他想要的东西都没有,那这里面怎么样让Linux桌面发展 起来,就一定要给这个桌面增加更多实用的、好用的功能,这些功能都要有人去做,我觉得作为Google来说,Google是目前可能业界数一数二的开源的 用户,我们在公司内部,所有的员工、所有的工程师都在使用开源,都在使用Linux做开发,这是一个对Google来说,开源实际上是一个非常重要的战 略,那么它不光是帮助Google,就Google不光是利用开源开发了所有Google内部的各种服务器系统,而且Linux在Google内部还是所 有工程师的日常桌面环境,那么对Google来说Linux包括开源都非常重要,我们除了在使用开源,使用Linux获得收益的同时,我们也希望对 Linux开源界有所贡献,就我们觉得,可能Google在Linux其他领域,比如在Linux服务器领域、互联网领域已经贡献了很多开源的代码,大家 有很多很熟悉的比如说Google的GWT、Web Tool Kit,有好多相关的代码贡献出来,但是在Linux桌面,Google在这方面的贡献其实不是特别的多,那我们小组其实就是致力于这方面的一个小组,我 们专门在这方面做一些相关的贡献。
那我们也知道,从前你负责的项目是Google桌面搜索Linux版,对于那个项目你认为最值得骄傲的三个功能是什么?
那实际上Google桌面搜索Linux版是我们小组做的第一个项目,这个项目到目前为止已经进入一个比较稳定的状 态,作为一个做搜索的、一个搜索专业行业的公司来说,搜索显然是Google的强项,所以对这个项目来说,我们最骄傲的第一个优势就是它的性能,它的性能 我们可以相信,在所有的Linux版的桌面搜索产品里面应该是最好的,我们测试过的产品里面应该是最好的;那么第二个优势就是说,他不光是做桌面搜索,他 实际上是一个桌面搜索和互联网搜索结合的产品,你可以在同一个界面里,同时去做网络搜索、做桌面搜索、做各种各样的混合的搜索,你可以同时,比如做你的 Email搜索等等,这是一个非常不错的特性;那么第三个我觉得就是说跟其他桌面搜索、相关搜索产品比起来,他的尺寸、他的这种依赖关系都相对比较简单, 比较小,所以用户在安装的时候会比较方便,而且在使用的时候不会感到对系统的性能有太大的影响,因为他的这种尺寸、内在占用和性能都会比较好。
我 们也知道在Linux领域另外一个桌面搜索工作,像Beagle做得非常不错,而且据我了解Goolge从前也是Beagle的赞助商,那在你从前参与谷 歌的桌面搜索Linux客户端的时候,有没有从Beagle这个项目中获得什么经验,有没有和Beagle的团队做过交流?
其实我们的这个项目跟Beagle没有任何关系,我们也没有从Beagle那里获得任何的经验或者有任何交流,因为 实际上这两个项目从底层设计、从代码、从架构来说是完全不一样的。大家可能知道Beagle的桌面搜索是构筑在.Net技术上的,他的所有程序都是用C# 写的,所以实际上他的这个架构,可以说Beagle其实是有个很好的架构,他的架构设计相当不错,扩展性也很好,如果你们去看现在的Beagle,他能支 持相当多的文件格式,可有很多种不同的插件,他跟系统的集成也相当不错。因为它是.Net和C#写的,所以他开发起来可能相对会比较简单一些。用.Net 和C#在这方面会比较好,在架构上、在开发上会比较好,但是同样也会带来一些负面的影响,包括性能和依赖关系的影响,因为他会需要一整套的.Net平台环 境才能运行起来,那么在开发的时候,我们内部的桌面搜索,在做Linux版之前已经有很悠久的积累,因为我们有Windows版的桌面搜索,有苹果版式的 桌面搜索,所以我们再做Linux版的时候,我们其实主要是去借鉴Windows版和苹果版的设计和代码,所以并不会去参考Beagle,因为它的技术跟 我们是完全不一样的。
那如果说要在Google的桌面搜索Linux版和Beagle之间做一个比较的话,你会给大家提供什么样的信息?
如果做比较的话,我觉得各有特色,对于Beagle来说他是希望做成一个非常全面、非常灵活的桌面搜索架构,他的着 重点是架构的灵活性,然后做一个大而全的东西。那对于Google的桌面搜索来说,他是希望做一个短小精悍的小软件,在任何一个平台装上都可以用的,不需 要有非常复杂的依赖关系,不需要有很大的下载包,而且对Google的桌面搜索理所应当的跟Google的相关网络搜索等等结合的比较好,这是 Google桌面搜索的特点。
OK,那我们InfoQ去年在采访Beagle负责人的时候,他提到一个关联,Beagle是Linux平台上功能最强,也最可用的桌面搜索系统,而且支持超过二十种数据语言和超过六十种的数据格式,现在你对他的这一观点是怎么看的?
我是基本认同的,对于Beagle来说他确实是目前支持的文件数量比较多,而且支持的数据格式也会比较多,那么从功 能上讲它还是相当强悍的,界面也是比较强、比较复杂。那么最大问题在于它的性能,其实这也是大部分用户不愿意启动桌面搜索的一个根本原因,我所了解到的几 乎所有的用户给我一个反馈就是说,在开了Beagle以后,计算机性能下降到无法使用的地步。
那是不是可以说像谷歌的桌面搜索Linux版功能没那么多,但是性能会更好?
对。
OK,那我们接下来谈一谈,现在您所负责的桌面小工具这个项目,目前的进展如何?
目前是这样的,我们目前这个项目已经进入BETA阶段,我们的第一个版本已经于5月30日发布了。小工具项目跟桌面 搜索的最大的一个不同在于,我们这个小工具项目是完全开源的,而且是用Apache License,就是用Apache的版权协议,这种协议是一个非常开放的协议,它跟GPL不一样,GPL是别人如果用你的代码,别人也要开 源,Apache是别人可以随意使用你代码,是底部开源,甚至可以在商业产品中使用,所以Google在这方面还是比较开放的,就是Google希望完全 的贡献出去,而不是说我要什么保留,或有什么所取。那么对我们来说,从5月30日第一版发布以来,在全球的开源界也得到了很好的反馈,也有很多评价和评论 反馈过来,总的这个评价还是相当正面的,那么我们也在积极地修正一些用户反馈回来的问题和错误,因为现在用的人比较多,所以会不断的有用户报告一些Bug 和问题,提一些建议等等。对我们来说我们希望尽快的使这个产品稳定下来,使产品能够达到用户日常使用的一个阶段。这样对用户来说,他就可以在日常的桌面环 境中安装这种桌面产品,不用担心崩溃,不用担心对性能有什么影响,他可以放心的使用,这是我们现在的情况,我们希望很快就能达到这样一个阶段。
如果说用户他要去用Google的桌面小工具,你认为他选择这个小工具的主要的原因是什么?
我觉得最主要是对他有用,实际上我们这个桌面小工具有很大特色是,实际上是一个小工具软件平台,我们开发的是一个运 行环境,这个运行环境是支撑用来运行叫谷歌桌面小工具的这一系列的小工具的。这个小工具实际上是任何人都可以开发的,它是开放的开发平台,目前来说,大概 已经有一千多个桌面小工具可以使用,这些小工具大部分都是由谷歌之外的第三方开发人员开发的,对用户来说安装了这个平台以后,就意味着他有一千多个小工具 可以用,我相信总有那么几个款可以适合用户的这种需求。
那么这个小工具,他的一个未来的规划是什么?目前就是正在开发,可能还没有公布的功能是什么样子的?
我们现在实际上,非常希望把这个小工具作为一个软件开发平台来推广,因为这个小工具大家都知道在做这种桌面软件开发 的时候,如果你用C语言、你用C++语言,甚至你用JAVA或其他的相关语言,开发一个桌面软件,他的难度相当大,如果开发一个桌面软件很简单的话,我想 Linux不会是现在这种样子,对不对?所有人都去开发软件了,因为它开发起来确实很难,但是我们设计了这样小工具的一个所谓的API,设计了这样的开发 环境,那么他的开发难度会大大降低,只要会JavaScript、只要会XML就会写软件,所以我们希望把这样一个开发环境和平台推广出去,然后吸引更多 的开发者去开发这种小工具,而不是去用C写Linux软件——用C写软件非常复杂,他如果同样的功能,用这种JavaScript加XML来写的话,有可 能他很快就写出一个可以用的软件,然后推广出去,大家都可以使用了。那实际上这种状态就是一个非常好的双赢的状态,对Google来说,如果所有用户都使 用这个平台的话,就会有很多用户去使用这个小工具,这个其实对推动Linux桌面的使用有非常积极作用的。
那么你们这个团队除了桌面小工具,还计划在Linux平台上开发哪些新的项目?
其实我们的计划是很多的,因为我们这个团队并不是一个很大的团队,现在我们的精力主要集中在桌面小工具这个项目 上,我们对未来有很多很多规划,但是我们觉得首先要做好桌面小工具这个项目,然后基于这个工具项目再去听取用户的意见,我们会希望用户给我们反馈,如果用 户觉得某个功能非常实用、非常需要,我们就会去衡量一下,根据我们的这个资源情况,根据我们小工具这个项目的情况,在未来的适当时刻,我们会去选择一个新 的项目去开发。
那么最后一个问题,在从事Linux平台开发的时候,你们团队,包括你个人所遇到的最大挑战是什么?是如何刻服的?
我们觉得最大一个挑战,对我们团队而言,我们现在做的是开源软件开发,那么对于开源软件来说,其实你在开发的时候 就有很多限制,你有很多这种非开源的技术,很多非常好的东西你是不能用的,很多东西你必须要去想好怎么样开发这样一个软件,怎么样选择你开发的技术路线, 怎么样去实现你可能在别的某些软件里面已经有的一些功能,但是你不能用这些代码,必须要用开源的方式来重新实现等等。以我们这个Gadget的小工具项目 来说,实际上我们内部做了非常多的工作去实现这样一个平台,如果我们用Windows这样一个开发环境去开发的话,你有很多现在的这种闭源的组件可以使 用,我们的代码量会小很多。但是我们在Linux底下开发,其实我们也用了很多很多开源的组件,但是相对来说我们还是自己写了很大量的代码,去做一些额外 的这种工作,当然这个挑战,其实对我们来说也是一个机会,我们是能够,我们自己主动的控制一些事情,控制很多feature,控制很多实现的细节,这对我 们来说是可以更好的掌控我们这个项目,如果我们都用别人的代码,就很难掌控自己的项目。另外我觉得一个挑战,在Linux桌面上开发的时候碰到的问题,在 初期的时候,用户数量和这个参与者还是相对比较少,毕竟Linux用户的基数还是相对比较少。对我们来说虽然我们项目已经发布了几个月了,但是真正能够参 与到我们项目一起开发的这种第三方的开发者、志愿者还是非常少,虽然我们现在用户数量已经相当多,但是真正能参与进来的还是非常少。我们的最终目标还是希 望这个项目不是全部是Google的人在做的一个项目,我们希望这个项目变成一个所有人共同参与的项目,这才是真正开源的理念。但是到目前为止基本上还都 是我们的人在做这种编码的工作,我们希望在不久的将来,会有更多的人参与进来,共同改进这个产品,这样我们才能更好的完成我们这个目标。
再追加一个问题,目前你这个团队在做桌面小工具项目的时候,所用到的那些平台、工具介绍给大家一下?
其实很有意思,我们这个产品发布以后,有非常多的用户给我们反馈,第一个反馈就是我们依赖的东西很多,我们依赖了 一大堆的这种第三方的软件库,这种开发平台、源代码什么的,然后导致编译起来很困难,那举个例子我们依赖哪些东西呢,比如我们依赖了Firefox,就是 Mozilla的这个Firefox的JavaScript引擎和网页引擎叫Gecko,我们依赖了这个,比如说curl的这个网络库,我们依赖了比如 XML的Library,我们还依赖了比如QT的这个库,我们依赖了这个GTK的库,甚至还依赖了比如Zip的这个软件包,有很多很多时候这种第三方依 赖,那么作为开源软件,这是一个大家都在用的一种模式,因为不要重新发布名字,当然你要尽量使用已有的这些代码,那么实际上我们在做一个很大的工作就是, 因为在开源世界里面,各个项目都是千差万别的,大家在设计自己产品、设计自己开发库的时候,并没有一个统一的标准可以遵循,不像微软开发一个 Windows,里面的接口几乎是一样,我们用的这些组件其实是千差万别,我们做了很大工作是写了好多代码去把这些组件粘在一起,让他们能够共同工作,这 是我们做得非常重要的一个工作。
那会用到哪些工具?
我们现在用到的开发工具,其实并不是很复杂,在我们这个小组内部,最常用的开发工具,其实就是Vim,加上 GCC,然后加上一些编译的脚本,比如MAKE等等,然后可能会通常在调试的时候我们会用到gdb,然后可能在做一些性能检查或内存测试的时候我们会用到 Valgrind,还有Sysprof等等。我们没有用到这种可能通常在Windows底下开发的时候,大家都喜欢用的IDE,对我们来说,我们大部分的 开发者还是习惯于这种Unix开发风格,用命令行、用文本方式的这种开发方式。
非常感谢苏哲的分享。
谢谢。


Sppence Murray 是 Linux 开发高手之一,同时长期以来他一直是 UNIX 的坚定支持者。本文介绍的是 Murray 和他在 Codemonks Consulting 的同事在日常的 Linux 开发以及应用服务工作中用到的基本技术: shell 脚本,相信 Linux 的开发人员都会受益于这项有用而且通用的技术。

  Spence Murray 是 Codemonks Consulting 的创始人之一,自从 20 世纪 80 年代最早在 SunOS 上编写代码到现在,一直致力于 UNIX/Linux 的开发。从那时起,他曾在 IBM 公司的 AIX、SGI 公司的 Irix 工作,长时间地编写跨平台的 UNIX 代码,包括 HP/UX,Irix,Solaris/SunOS,SCO UNIX,各种 BSD,MacOS X,当然,还有 Linux。从图形/视频设备驱动程序到 UI 代码,他什么工作都做过。Murray 编写的跨平台代码包括 X Window System Xserver 代码,以及作为 Netscape Navigator 一部分的核心浏览器代码。

  Murray 最经常使用的 Linux 工具是 vi、bash 和 Emacs。“不论我是在写 C、C++、Java、shell 脚本,还是 HTML,大部分的时间我都在这些工具中来回切换”,他说。

  Linux 秘密武器

  Murray 认为,对一个 Linux 开发人员来说,shell 是一个强大的软件开发工具,无论怎么评价都不过分。“在我做的每一项工作中都要用到 shell 脚本,不论是快速地阅读和修改普通文本还是编写代码”,他说。“它轻便而快捷,它短小的命令使得来回移动代码称为一个迅速而没有痛苦的过程。作为一名编 辑,它很快就会成为第二本能”。

  对 Murray 来说,Emacs 作为一个开发工具出现的晚了一些。“在 90 年代早期,我尝试使用 Emacs 作为一个 IDE,并很快就转换门厅。Emacs 非常强大,在那些日子里,我会一直开着一个 Emacs 窗口,经常打开几十个源文件,每个都有我编辑的上下文、使用 gdb 的调试会话以及在不同的源目录下运行的 bash 脚本。有很多关于 Emacs 的资料,可以说,这是个可怕的工具...再者,您可以在任何您想要花时间去做开发的系统上运行 Emacs。

  自从 20 世纪 80 年代中期第一次使用 SunOS支持的 vi 这个简洁的环境以来,Emacs 编辑器已经成为了 Murray 的标准工具。"它在各种流派的 UNIX 上都可以使用,这是我在致力于跨平台的开发工作时选择它的主要原因之一”,他说。

  Linux 开发人员:了解您的 shell

  Murray 要求您要了解您的 shell。“Bash、tcsh、csh――shell 是您最基本的软件开发工具”,他强调说。“它可以做许多了不起的事情。所有的工作都要依赖于它……和它的强大功能”。作为说明通用的 shell 脚本功能强大的例子,在参考资料部分中有一个可以下载的文件,其中有一组脚本,用于获得 Red Hat 发行的更新 RPM 软件包并将它们合并到原来的软件包和定制的软件包。下载文件并解压缩后,您可以在 /developerworks/rpm_update_scripts 目录下找到脚本。最终结果是一个包括所有软件包最新版本的目录和一个用于网络安装的升级的 hdlist 文件。

  下面的代码片段实现的是对 Red Hat RPM 软件包的自动更新,以创建一个使用最新的 RPM 的可以安装的版本。这对任何一个维护公共 Linux 服务器的人来说是一个基本的步骤。就我们而言,我们通常是维护许多公共 Linux 服务器上的大量网络服务。下面是可以自动完成更新最新的安全和功能的过程的部分脚本。

  下面的脚本样例证明了普通的 shell 编程技术可以广泛应用于各种系统配置和程序设计应用。脚本使用的是 bourne shell,它是在不同的 UNIX 系统中最为常见的 shell。这样就可以保证这些非常轻便的代码可以稍加修改或者不加修改地在不同的 UNIX 系统上使用。修改 Red Hat 软件包的规范以应用于其它 Linux 发行版本是很容易的。

  freshen.sh 使用指定的 RPM ftp 更新站点上的 RPM 软件包来更新原有的 RPM 列表。执行过滤器来替换更新 RPM 软件包。最后,长长的发行列表根据从更新镜像站点上得到的新 RPM 软件包完成更新。

  清单 1. fresh.sh


  
#!/bin/sh
rh_ver=$1
rh_path=$2
update_dir=${rh_path}/RH${rh_ver}-updates
custom_dir=${rh_path}/RH${rh_ver}-custom
install_dir=${rh_path}/RH${rh_ver}-install

# Sanity check for the original directory.

# Create update and install directories if they don’t exist

[ -d ${update_dir} ] || mkdir ${update_dir}
[ -d ${install_dir}/RedHat/RPMS ] || mkdir -p ${install_dir}/RedHat/RPMS

# Get latest updates from fresh rpms FTP site

./get_update.sh ${rh_ver} ${update_dir}

# Create/update hardlinks from update, and custom directories
# to the install directory. We assume that original RPMS are already
# hardlinked to the install directory, so all we need to do is filter
# out any replaced by updated packages.

./do-links.sh ${update_dir} ${install_dir}/RedHat/RPMS
[ -d ${custom_dir} ] && ./do-links.sh ${custom_dir}
${install_dir}/RedHat/RPMS

# Filter out all but the latest version of everything.

./filter-rpms.pl $install_dir/RedHat/RPMS

# Rebuild the hard disk lists
/usr/lib/anaconda-runtime/genhdlist ${install_dir}
 

  freshen.sh 调用 do-links.sh 和 get_update.sh ,分别去设置 RPM 发行版本的源、宿(省略了源 RPM 软件包;硬链接用来设置目的 RPM)和检索更新。

  清单 2. do-links.sh

 

  
#!/bin/sh

src=$1
dest=$2

#for file in $src/*; do
for file in `find $src -name *.rpm -a ! -name *.src.rpm -print`; do
base=`basename $file;`
if test ! -f $dest/$base; then
echo "Linking $file";
ln $file $dest
else
echo "EXISTS: $file";
fi
done

 

  清单 3. get_update.sh

  
#!/bin/sh
rh_ver=$1
dest=$2
echo "Retrieving updates for version ${rh_ver} to $dest"
lftp << EOF
open ftp.freshrpms.net

mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i386 $dest/i386
mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i486 $dest/i486
mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i586 $dest/i568
mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i686 $dest/i686
mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/SRPMS $dest/SRPMS
mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/noarch $dest/noarch

 

  Java 和 Linux

  在Codemonks,相当多的开发工作是在 Linux 上用 Java 完成。这两个工具的组合为创建商业级质量的 Web 应用提供了一个平台,Murray 说。“在做这些项目的过程中,我们发现我们要总体上了解客户已有的应用代码”,他回忆说。locks.c (在下载得到的压缩文件中的 /developerworks/locks 目录下) 是一个代码片段,实现的是用于 Java Virtual Machine Profiler Interface (JVMPI) 的读/写锁以及大量的调试代码。

  Linux 开发人员的代表

  “在情况允许的时候,不要写特定于系统的代码”,Murray 说,而是克服困难去“写好的跨平台的代码”。受雇的 Murray 坚持认为他最大的资本永远是“写具有商业品质的代码,构建和提供网络服务,定制 OS 或内核,而且完全基于可靠的开放源代码的平台”。

  下面是一个代码片段,来自于一个跨平台的定制的 IMAP 服务器,这个服务器由 Linux 和 MacOS X 的开发人员共同开发。代码实现的是一个用来处理字符串的简单的增长缓存。这样避免了缓存溢出的问题(不要忘记那些安全漏洞),而不必要您每次做某些事情的 时候重新分配空间。它是通过维护一个简单的可变长的缓存来实现的,这个缓存可以写满和清空。这个缓存已经被用于一个实验用的 IMAP 服务器,这个服务器是由一个团队紧张工作了一周完成的。

  除了一个简单的字符串缓冲区的实现之外,这段代码还实现了一个可变大小的字符串数组。它完成的是一个简单的接口,当您写完一个字符串以后,您可以标记它然后继续写下一个。此外,这样会节约空间分配,并且将比较乱的代码组织到一起。

  完整的 IMAP 服务器的代码将在今年某个时间发布。

  清单 4. 定制的 IMAP 服务器一部分

 

   
#ifndef HOED_BUF_H
#define HOED_BUF_H

typedef struct {
char *str;
int size;
int length;
int str_start;
int max_size;

int n_strings;
int size_strings;
int *str_posn;
char **str_set;
} hoed_buf_t;

#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
#define PRINTF(f, a) __attribute__((format (printf, f, a)))
#else
#define PRINTF(f,a)
#endif

extern hoed_buf_t *hoed_buf_alloc(int init_size, int max_size);
extern void hoed_buf_free(hoed_buf_t *);
extern void hoed_buf_reset(hoed_buf_t *);
extern void hoed_buf_new_string(hoed_buf_t *);
extern char **hoed_buf_get_set(hoed_buf_t *, int *n_string);

extern char *hoed_buf_put_char(hoed_buf_t *, char toadd);
extern char *hoed_buf_sprintf(hoed_buf_t *, const char *format,...)
PRINTF(2,3);
extern char *hoed_buf_strcat(hoed_buf_t *, const char *append);
extern char *hoed_buf_cat_sprintf(hoed_buf_t *, const char *format, ...)
PRINTF(2,3);

#endif /* HOED_BUF_H */
 

  称为杀手级的 Linux 应用程序

  对Murray 来说,有两个杀手级的 Linux 应用程序:Emacs 和 Netscape Navigator。“Emacs 或许是给人印象最深而且广为应用的基于 Linux 的应用程序”,他说。“另一个是 Netscape Navigator。有一次,我们要支持20多种 UNIX,我在 Linux 上完成了所有的工作”。

  他继续说,“有趣的是,基于 Linux 的应用程序可能运行于许多不同风格的 UNIX 系统上,甚至安装了 Cygwin 的 Windows 系统。”

  Linux 的未来如何?

  当前,Murray 正在进行的 Linux 项目有好几个,从支持电子邮件、消息和共享数据库的分布式办公应用程序到使用标准工具的网络应用程序(标准工具包括:Apache/Tomcat, PHP, PostgreSQL, MySQL, 和 Linux)。 Murray 有他自己的公司专门为网络服务和网络应用提供主机服务。

  对Murray 来说,得益于 Linux 强大功能的应用程序的列表在不断地增长。“有很多”,他说。“Oracle, WebSphere, Apache, PostgresQL, MySQL, Cyrus IMAP... 这个列表很长而且在不断增长。”

  对 Murray 来说,Linux 到此为止了。“我们所有的服务器都运行 Linux;不管目标平台如何,我们主要的开发都在 Linux 上进行;我们把 Linux 推荐给用户来运行服务器应用程序”,他说。“ Linux 快速发展的步伐,开放源代码组织对它的广泛支持,低廉的开发费用,如果把这些结合在一起,您就知道它是一个难以击败的平台”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值