1. gzyueqian
      18529173453

      Linux程序員的開(kāi)發(fā)經(jīng)驗(yàn)談

      更新時(shí)間: 2007-05-28 11:49:09來(lái)源: 粵嵌教育瀏覽量:785


        摘要:Sppence Murray 是 Linux 開(kāi)發(fā)高手之一,同時(shí)長(zhǎng)期以來(lái)他一直是 UNIX 的堅(jiān)定支持者。本文介紹的是 Murray 和他在 Codemonks Consulting 的同事在日常的 Linux 開(kāi)發(fā)以及應(yīng)用服務(wù)工作中用到的基本技術(shù): shell 腳本,相信 Linux 的開(kāi)發(fā)人員都會(huì)受益于這項(xiàng)有用而且通用的技術(shù)。

        Spence Murray 是 Codemonks Consulting 的創(chuàng)始人之一,自從 20 世紀(jì) 80 年代早在 SunOS 上編寫代碼到現(xiàn)在,一直致力于 UNIX/Linux 的開(kāi)發(fā)。從那時(shí)起,他曾在 IBM 公司的 AIX、SGI 公司的 Irix 工作,長(zhǎng)時(shí)間地編寫跨平臺(tái)的 UNIX 代碼,包括 HP/UX,Irix,Solaris/SunOS,SCO UNIX,各種 BSD,MacOS X,當(dāng)然,還有 Linux。從圖形/視頻設(shè)備驅(qū)動(dòng)程序到 UI 代碼,他什么工作都做過(guò)。Murray 編寫的跨平臺(tái)代碼包括 X Window System Xserver 代碼,以及作為 Netscape Navigator 一部分的核心瀏覽器代碼。

        Murray 經(jīng)常使用的 Linux 工具是 vi、bash 和 Emacs。“不論我是在寫 C、C++、Java、shell 腳本,還是 HTML,大部分的時(shí)間我都在這些工具中來(lái)回切換”,他說(shuō)。

        Linux 秘密武器

        Murray 認(rèn)為,對(duì)一個(gè) Linux 開(kāi)發(fā)人員來(lái)說(shuō),shell 是一個(gè)強(qiáng)大的軟件開(kāi)發(fā)工具,無(wú)論怎么評(píng)價(jià)都不過(guò)分。“在我做的每一項(xiàng)工作中都要用到 shell 腳本,不論是快速地閱讀和修改普通文本還是編寫代碼”,他說(shuō)。“它輕便而快捷,它短小的命令使得來(lái)回移動(dòng)代碼稱為一個(gè)迅速而沒(méi)有痛苦的過(guò)程。作為一名編輯,它很快就會(huì)成為第二本能”。

        對(duì) Murray 來(lái)說(shuō),Emacs 作為一個(gè)開(kāi)發(fā)工具出現(xiàn)的晚了一些。“在 90 年代早期,我嘗試使用 Emacs 作為一個(gè) IDE,并很快就轉(zhuǎn)換門廳。Emacs 非常強(qiáng)大,在那些日子里,我會(huì)一直開(kāi)著一個(gè) Emacs 窗口,經(jīng)常打開(kāi)幾十個(gè)源文件,每個(gè)都有我編輯的上下文、使用 gdb 的調(diào)試會(huì)話以及在不同的源目錄下運(yùn)行的 bash 腳本。有很多關(guān)于 Emacs 的資料,可以說(shuō),這是個(gè)可怕的工具...再者,您可以在任何您想要花時(shí)間去做開(kāi)發(fā)的系統(tǒng)上運(yùn)行 Emacs。

        自從 20 世紀(jì) 80 年代中期次使用 SunOS支持的 vi 這個(gè)簡(jiǎn)潔的環(huán)境以來(lái),Emacs 編輯器已經(jīng)成為了 Murray 的標(biāo)準(zhǔn)工具。"它在各種流派的 UNIX 上都可以使用,這是我在致力于跨平臺(tái)的開(kāi)發(fā)工作時(shí)選擇它的主要原因之一”,他說(shuō)。

        Linux 開(kāi)發(fā)人員:了解您的 shell

        Murray 要求您要了解您的 shell。“Bash、tcsh、csh――shell 是您基本的軟件開(kāi)發(fā)工具”,他強(qiáng)調(diào)說(shuō)。“它可以做許多了不起的事情。所有的工作都要依賴于它……和它的強(qiáng)大功能”。作為說(shuō)明通用的 shell 腳本功能強(qiáng)大的例子,在參考資料部分中有一個(gè)可以下載的文件,其中有一組腳本,用于獲得 Red Hat 發(fā)行的更新 RPM 軟件包并將它們合并到原來(lái)的軟件包和定制的軟件包。下載文件并解壓縮后,您可以在 /developerworks/rpm_update_scripts 目錄下找到腳本。終結(jié)果是一個(gè)包括所有軟件包版本的目錄和一個(gè)用于網(wǎng)絡(luò)安裝的升級(jí)的 hdlist 文件。

        下面的代碼片段實(shí)現(xiàn)的是對(duì) Red Hat RPM 軟件包的自動(dòng)更新,以創(chuàng)建一個(gè)使用的 RPM 的可以安裝的版本。這對(duì)任何一個(gè)維護(hù)公共 Linux 服務(wù)器的人來(lái)說(shuō)是一個(gè)基本的步驟。就我們而言,我們通常是維護(hù)許多公共 Linux 服務(wù)器上的大量網(wǎng)絡(luò)服務(wù)。下面是可以自動(dòng)完成更新的安全和功能的過(guò)程的部分腳本。

        下面的腳本樣例證明了普通的 shell 編程技術(shù)可以廣泛應(yīng)用于各種系統(tǒng)配置和程序設(shè)計(jì)應(yīng)用。腳本使用的是 bourne shell,它是在不同的 UNIX 系統(tǒng)中為常見(jiàn)的 shell。這樣就可以保證這些非常輕便的代碼可以稍加修改或者不加修改地在不同的 UNIX 系統(tǒng)上使用。修改 Red Hat 軟件包的規(guī)范以應(yīng)用于其它 Linux 發(fā)行版本是很容易的。

        freshen.sh 使用指定的 RPM ftp 更新站點(diǎn)上的 RPM 軟件包來(lái)更新原有的 RPM 列表。執(zhí)行過(guò)濾器來(lái)替換更新 RPM 軟件包。,長(zhǎng)長(zhǎng)的發(fā)行列表根據(jù)從更新鏡像站點(diǎn)上得到的新 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 調(diào)用 do-links.sh 和 get_update.sh ,分別去設(shè)置 RPM 發(fā)行版本的源、宿(省略了源 RPM 軟件包;硬鏈接用來(lái)設(shè)置目的 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,相當(dāng)多的開(kāi)發(fā)工作是在 Linux 上用 Java 完成。這兩個(gè)工具的組合為創(chuàng)建商業(yè)級(jí)質(zhì)量的 Web 應(yīng)用提供了一個(gè)平臺(tái),Murray 說(shuō)。“在做這些項(xiàng)目的過(guò)程中,我們發(fā)現(xiàn)我們要總體上了解客戶已有的應(yīng)用代碼”,他回憶說(shuō)。locks.c (在下載得到的壓縮文件中的 /developerworks/locks 目錄下) 是一個(gè)代碼片段,實(shí)現(xiàn)的是用于 Java Virtual Machine Profiler Interface (JVMPI) 的讀/寫鎖以及大量的調(diào)試代碼。

        Linux 開(kāi)發(fā)人員的代表

        “在情況允許的時(shí)候,不要寫特定于系統(tǒng)的代碼”,Murray 說(shuō),而是克服困難去“寫好的跨平臺(tái)的代碼”。受雇的 Murray 堅(jiān)持認(rèn)為他的資本永遠(yuǎn)是“寫具有商業(yè)品質(zhì)的代碼,構(gòu)建和提供網(wǎng)絡(luò)服務(wù),定制 OS 或內(nèi)核,而且完全基于可靠的開(kāi)放源代碼的平臺(tái)”。

        下面是一個(gè)代碼片段,來(lái)自于一個(gè)跨平臺(tái)的定制的 IMAP 服務(wù)器,這個(gè)服務(wù)器由 Linux 和 MacOS X 的開(kāi)發(fā)人員共同開(kāi)發(fā)。代碼實(shí)現(xiàn)的是一個(gè)用來(lái)處理字符串的簡(jiǎn)單的增長(zhǎng)緩存。這樣避免了緩存溢出的問(wèn)題(不要忘記那些安全漏洞),而不必要您每次做某些事情的時(shí)候重新分配空間。它是通過(guò)維護(hù)一個(gè)簡(jiǎn)單的可變長(zhǎng)的緩存來(lái)實(shí)現(xiàn)的,這個(gè)緩存可以寫滿和清空。這個(gè)緩存已經(jīng)被用于一個(gè)實(shí)驗(yàn)用的 IMAP 服務(wù)器,這個(gè)服務(wù)器是由一個(gè)團(tuán)隊(duì)緊張工作了一周完成的。

        除了一個(gè)簡(jiǎn)單的字符串緩沖區(qū)的實(shí)現(xiàn)之外,這段代碼還實(shí)現(xiàn)了一個(gè)可變大小的字符串?dāng)?shù)組。它完成的是一個(gè)簡(jiǎn)單的接口,當(dāng)您寫完一個(gè)字符串以后,您可以標(biāo)記它然后繼續(xù)寫下一個(gè)。此外,這樣會(huì)節(jié)約空間分配,并且將比較亂的代碼組織到一起。

        完整的 IMAP 服務(wù)器的代碼將在今年某個(gè)時(shí)間發(fā)布。

        清單 4. 定制的 IMAP 服務(wù)器一部分


      #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 */


        稱為殺手級(jí)的 Linux 應(yīng)用程序

        對(duì)Murray 來(lái)說(shuō),有兩個(gè)殺手級(jí)的 Linux 應(yīng)用程序:Emacs 和 Netscape Navigator。“Emacs 或許是給人印象深而且廣為應(yīng)用的基于 Linux 的應(yīng)用程序”,他說(shuō)。“另一個(gè)是 Netscape Navigator。有一次,我們要支持20多種 UNIX,我在 Linux 上完成了所有的工作”。

        他繼續(xù)說(shuō),“有趣的是,基于 Linux 的應(yīng)用程序可能運(yùn)行于許多不同風(fēng)格的 UNIX 系統(tǒng)上,甚至安裝了 Cygwin 的 Windows 系統(tǒng)。”

        Linux 的未來(lái)如何?

        當(dāng)前,Murray 正在進(jìn)行的 Linux 項(xiàng)目有好幾個(gè),從支持電子郵件、消息和共享數(shù)據(jù)庫(kù)的分布式辦公應(yīng)用程序到使用標(biāo)準(zhǔn)工具的網(wǎng)絡(luò)應(yīng)用程序(標(biāo)準(zhǔn)工具包括:Apache/Tomcat, PHP, PostgreSQL, MySQL, 和 Linux)。 Murray 有他自己的公司專門為網(wǎng)絡(luò)服務(wù)和網(wǎng)絡(luò)應(yīng)用提供主機(jī)服務(wù)。

        對(duì)Murray 來(lái)說(shuō),得益于 Linux 強(qiáng)大功能的應(yīng)用程序的列表在不斷地增長(zhǎng)。“有很多”,他說(shuō)。“Oracle, WebSphere, Apache, PostgresQL, MySQL, Cyrus IMAP... 這個(gè)列表很長(zhǎng)而且在不斷增長(zhǎng)。”

        對(duì) Murray 來(lái)說(shuō),Linux 到此為止了。“我們所有的服務(wù)器都運(yùn)行 Linux;不管目標(biāo)平臺(tái)如何,我們主要的開(kāi)發(fā)都在 Linux 上進(jìn)行;我們把 Linux 推薦給用戶來(lái)運(yùn)行服務(wù)器應(yīng)用程序”,他說(shuō)。“ Linux 快速發(fā)展的步伐,開(kāi)放源代碼組織對(duì)它的廣泛支持,低廉的開(kāi)發(fā)費(fèi)用,如果把這些結(jié)合在一起,您就知道它是一個(gè)難以擊敗的平臺(tái)”。

      免費(fèi)預(yù)約試聽(tīng)課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲v日韩v欧美在线 | 性饥渴一区二区三区1 | 五月天丁香开心婷婷 | 亚洲国产精品久久艾草纯爱 | 五月天在线视频国产在线二 | 一本久久A精品一合区久久久 |