资深Linux程序员的开发经验谈

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

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

  Murray 最经常使用的 Linux 工具是 vibash 和 Emacs不论我是在写 CC++Javashell 脚本还是 HTML大部分的时间我都在这些工具中来回切换他说

  Linux 秘密武器

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

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

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

  Linux 开发人员了解您的 shell

  Murray 要求您要了解您的 shellBashtcshcsh――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 发行版本是很容易的

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

  清单 freshsh

  #!/bin/sh   rh_ver=$   rh_path=$   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 dont 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_updatesh ${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

  /dolinkssh ${update_dir} ${install_dir}/RedHat/RPMS   [ d ${custom_dir} ] && /dolinkssh ${custom_dir}   ${install_dir}/RedHat/RPMS

  # Filter out all but the latest version of everything

  /filterrpmspl $install_dir/RedHat/RPMS

  # Rebuild the hard disk lists   /usr/lib/anacondaruntime/genhdlist ${install_dir}

  freshensh 调用 dolinkssh 和 get_updatesh 分别去设置 RPM 发行版本的源宿(省略了源 RPM 软件包硬链接用来设置目的 RPM)和检索更新

  清单 dolinkssh

  #!/bin/sh

  src=$   dest=$

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

  #!/bin/sh   rh_ver=$   dest=$   echo Retrieving updates for version ${rh_ver} to $dest   lftp << EOF   open ftpfreshrpmsnet   mirror n pub/redhat/linux/updates/${rh_ver}/en/os/i $dest/i   mirror n pub/redhat/linux/updates/${rh_ver}/en/os/i $dest/i   mirror n pub/redhat/linux/updates/${rh_ver}/en/os/i $dest/i   mirror n pub/redhat/linux/updates/${rh_ver}/en/os/i $dest/i   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 说在做这些项目的过程中我们发现我们要总体上了解客户已有的应用代码他回忆说locksc (在下载得到的压缩文件中的 /developerworks/locks 目录下) 是一个代码片段实现的是用于 Java Virtual Machine Profiler Interface (JVMPI) 的读/写锁以及大量的调试代码

  Linux 开发人员的代表

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

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

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

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

  清单 定制的 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;有的旅行是为了拓宽眼界,浏览风景名胜。

资深Linux程序员的开发经验谈

相关文章:

你感兴趣的文章:

标签云: