1. gzyueqian
      18529173453

      Linux 的編程常識(shí)

      更新時(shí)間: 2007-05-28 13:14:12來(lái)源: 粵嵌教育瀏覽量:723


        1 標(biāo)準(zhǔn) (ANSI C, POSIX, SVID, XPG, ...)

        ANSI C:這一標(biāo)準(zhǔn)是 ANSI(美國(guó)國(guó)家標(biāo)準(zhǔn)局)于 1989 年制定的 C 語(yǔ)言標(biāo)準(zhǔn)。 后來(lái)被 ISO(國(guó)際標(biāo)準(zhǔn)化組織)接受為標(biāo)準(zhǔn),因此也稱(chēng)為 ISO C。
        ANSI C 的目標(biāo)是為各種操作系統(tǒng)上的 C 程序提供可移植性保證,而不僅僅限于 UNIX。 該標(biāo)準(zhǔn)不僅定義了 C 編程語(yǔ)言的語(yǔ)發(fā)和語(yǔ)義,而且還定義了一個(gè)標(biāo)準(zhǔn)庫(kù)。這個(gè)庫(kù)可以根據(jù) 頭文件劃分為 15 個(gè)部分,其中包括:字符類(lèi)型 (<ctype.h>)、錯(cuò)誤碼 (<errno.h>)、 浮點(diǎn)常數(shù) (<float.h>)、數(shù)學(xué)常數(shù) (<math.h>)、標(biāo)準(zhǔn)定義 (<stddef.h>)、 標(biāo)準(zhǔn) I/O (<stdio.h>)、工具函數(shù) (<stdlib.h>)、字符串操作 (<string.h>)、 時(shí)間和日期 (<time.h>)、可變參數(shù)表 (<stdarg.h>)、信號(hào) (<signal.h>)、 非局部跳轉(zhuǎn) (<setjmp.h>)、本地信息 (<local.h>)、程序斷言 (<assert.h>) 等等。
      POSIX:該標(biāo)準(zhǔn)初由 IEEE 開(kāi)發(fā)的標(biāo)準(zhǔn)族,部分已經(jīng)被 ISO 接受為國(guó)際標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)的具體內(nèi)容 見(jiàn) 1.1.3。POSIX.1 和 POSIX.2 分別定義了 POSIX 兼容操作系統(tǒng)的 C 語(yǔ)言系統(tǒng)接口 以及 shell 和工具標(biāo)準(zhǔn)。這兩個(gè)標(biāo)準(zhǔn)是通常提到的標(biāo)準(zhǔn)。
      SVID:System V 的接口描述。System V 接口描述(SVID)是描述 AT&&;T Unix System V 操作 系統(tǒng)的文檔,是對(duì) POSIX 標(biāo)準(zhǔn)的擴(kuò)展超集。
      XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd.出版), 是比 POSIX 更為一般的標(biāo)準(zhǔn)。X/Open 擁有 Unix 的版權(quán),而 XPG 則指定成為 Unix 操作系統(tǒng)必須滿足的要求。

        2 函數(shù)庫(kù)和系統(tǒng)調(diào)用

        1. glibc
      眾所周知,C 語(yǔ)言并沒(méi)有為常見(jiàn)的操作,例如輸入/輸出、內(nèi)存管理,字符串操作等提供內(nèi)置的支持。相反,這些功能一般由標(biāo)準(zhǔn)的“函數(shù)庫(kù)”來(lái)提供。GNU 的 C 函數(shù)庫(kù),即 glibc,是 Linux 上重要的函數(shù)庫(kù),它定義了 ISO C 標(biāo)準(zhǔn)指定的所有的庫(kù)函數(shù),以及由 POSIX 或其他 UNIX 操作系統(tǒng)統(tǒng)變種指定的附加特色,還包括有與 GNU 系統(tǒng)相關(guān)的擴(kuò)展。目前,流行的 Linux 系統(tǒng)使用 glibc 2.0 以上的版本。glibc 基于如下標(biāo)準(zhǔn):

        ISO C: C 編程語(yǔ)言的國(guó)際標(biāo)準(zhǔn),即 ANSI C。
        POSIX:GNU C 函數(shù)庫(kù)實(shí)現(xiàn)了 ISO/IEC 9945-1:1996 (POSIX 系統(tǒng)應(yīng)用程序編程接口, 即 POSIX.1)指定的所有函數(shù)。該標(biāo)準(zhǔn)是對(duì) ISO C 的擴(kuò)展,包括文件系統(tǒng)接口原 語(yǔ)、設(shè)備相關(guān)的終端控制函數(shù)以及進(jìn)程控制函數(shù)。同時(shí),GUN C 函數(shù)庫(kù)還支持部分由 ISO/IEC 9945-2:1993(POSIX Shell 和 工具標(biāo)準(zhǔn),即 POSIX.2)指定的函數(shù), 其中包括用于處理正則表達(dá)式和模式匹配的函數(shù)。
        Berkeley Unix:BSD 和 SunOS。GNU C 函數(shù)庫(kù)定義了某些 UNIX 版本中尚未標(biāo)準(zhǔn)化的函數(shù), 尤其是 4.2 BSD, 4.3 BSD, 4.4 BSD Unix 系統(tǒng)(即“Berkeley Unix”)以及“SunOS” (流行的 4.2 BSD 變種,其中包含有某些 Unix System V 的功能)。BSD 函數(shù)包括 符號(hào)鏈接、select 函數(shù)、BSD 信號(hào)處理函數(shù)以及套接字等等。
      SVID:System V 的接口描述。GNU C 函數(shù)庫(kù)定義了大多數(shù)由 SVID 指定而未被 ISO C 和 POSIX 標(biāo)準(zhǔn)指定的函數(shù)。來(lái)自 System V 的支持函數(shù)包括進(jìn)程間通信和共享內(nèi)存、 hsearch 和 drand48 函數(shù)族、fmtmsg 以及一些數(shù)學(xué)函數(shù)。
      XPG:X/Open 可移植性指南。GNU C 函數(shù)庫(kù)遵循 X/Open 可移植性指南(Issue 4.2) 以及所有的 XSI(X/Open 系統(tǒng)接口)兼容系統(tǒng)的擴(kuò)展,同時(shí)也遵循所有的 X/Open Unix 擴(kuò)展。

        2. 其他重要函數(shù)庫(kù)

        除 glibc 之外,流行的 Linux 發(fā)行版中還包含有一些其他的函數(shù)庫(kù),這些函數(shù)庫(kù)具有重要地位,例如:

        GNU Libtool:GNU Libtool 實(shí)際是一個(gè)腳本生成工具,它可以為軟件包開(kāi)發(fā)者提供一般性 的共享庫(kù)支持。
         以前,如果源代碼包的開(kāi)發(fā)者要利用共享庫(kù)的優(yōu)點(diǎn),則必須為每個(gè)軟件包可支持的平臺(tái)編寫(xiě) 定制的支持代碼。并且還需要設(shè)計(jì)配置接口,以便軟件包的安裝程序能夠正確選擇要建立的 庫(kù)類(lèi)型。利用 GNU Libtool,則可以簡(jiǎn)化開(kāi)發(fā)者的這一工作。它在一個(gè)單獨(dú)的腳本中同時(shí)封裝 了與平臺(tái)相關(guān)的依賴性以及用戶界面。GNU Libtool 可使每個(gè)宿主類(lèi)型的完整功能可通過(guò) 一般性的接口獲得,同時(shí)為程序員隱藏了宿主的特殊性。GNU Libtool 一致性接口是可靠的, 用戶不必閱讀那些晦澀的文檔,以便在每個(gè)平臺(tái)上建立共享庫(kù)。他們只需運(yùn)行軟件包的配置 腳本,而由 libtool 完成繁復(fù)的工作。
      CrackLib:CrackLib 為用戶提供了一個(gè) C 語(yǔ)言函數(shù)接口,利用這一函數(shù),可避免用戶選擇 容易破解的密碼。該函數(shù)庫(kù)可在類(lèi)似 passwd 的程序中使用。
        LibGTop:LibGTop 是一個(gè)能夠獲取進(jìn)程信息以及系統(tǒng)運(yùn)行信息的函數(shù)庫(kù),這些信息包括: 系統(tǒng)的一般信息、SYS V IPC 限制、進(jìn)程列表、進(jìn)程信息、進(jìn)程映射、文件系統(tǒng)使用信息等。
      圖形文件操作函數(shù)庫(kù):包括 libungif、libtiff、libpng、Imlib, libjpeg 等,可分別用來(lái)操作 GIF、TIFF、PNG、JPEG 以及其他一些格式圖形文件。

        3. 系統(tǒng)調(diào)用

        系統(tǒng)調(diào)用是操作系統(tǒng)提供給外部程序的接口。在 C 語(yǔ)言中,操作系統(tǒng)的系統(tǒng)調(diào)用通常通過(guò)函數(shù)調(diào)用的形式完成,這是因?yàn)檫@些函數(shù)封裝了系統(tǒng)調(diào)用的細(xì)節(jié),將系統(tǒng)調(diào)用的入口、參數(shù)以及返回值用 C 語(yǔ)言的函數(shù)調(diào)用過(guò)程實(shí)現(xiàn)。在 Linux 系統(tǒng)中,系統(tǒng)調(diào)用函數(shù)定義在 glibc 中。

        談到系統(tǒng)調(diào)用時(shí),需要注意如下幾點(diǎn):

        系統(tǒng)調(diào)用函數(shù)通常在成功時(shí)返回 0 值,不成功時(shí)返回非零值。如果要檢查失敗原因,則 要判斷 errno 這個(gè)全局變量的值,errno 中包含有錯(cuò)誤代碼。
        許多系統(tǒng)調(diào)用的返回?cái)?shù)據(jù)通常通過(guò)引用參數(shù)傳遞。這時(shí),需要在函數(shù)參數(shù)中傳遞一個(gè) 緩沖區(qū)地址,而返回的數(shù)據(jù)就保存在該緩沖區(qū)中。
        不能認(rèn)為系統(tǒng)調(diào)用函數(shù)就要比其他函數(shù)的執(zhí)行效率高。要注意,系統(tǒng)調(diào)用是一個(gè)非常耗時(shí) 的過(guò)程。
      有關(guān)系統(tǒng)調(diào)用我們將在以后詳細(xì)講述。

        3 在線文檔 (man, info, HOW-TO, ...)

        1. man
        man,即 manunal,是 UNIX 系統(tǒng)手冊(cè)的電子版本。根據(jù)習(xí)慣,UNIX 系統(tǒng)手冊(cè)通常分為不同的部分(或小節(jié),即 section),每個(gè)小節(jié)闡述不同的系統(tǒng)內(nèi)容。目前的小節(jié)劃分如下:

      命令:普通用戶命令
      系統(tǒng)調(diào)用:內(nèi)核接口
      函數(shù)庫(kù)調(diào)用:普通函數(shù)庫(kù)中的函數(shù)
      特殊文件:/dev 目錄中的特殊文件
      文件格式和約定:/etc/passwd 等文件的格式
      游戲。
      雜項(xiàng)和約定:標(biāo)準(zhǔn)文件系統(tǒng)布局、手冊(cè)頁(yè)結(jié)構(gòu)等雜項(xiàng)內(nèi)容
      系統(tǒng)管理命令。
      內(nèi)核例程:非標(biāo)準(zhǔn)的手冊(cè)小節(jié)。便于 Linux 內(nèi)核的開(kāi)發(fā)而包含
      其他手冊(cè)小節(jié):

      l: PostgreSQL 數(shù)據(jù)庫(kù)命令
      n: TCL/TK 命令
      手冊(cè)頁(yè)一般保存在 /usr/man 目錄下,其中每個(gè)子目錄(如 man1, man2, ..., manl, mann)包含不同的手冊(cè)小節(jié)。使用 man 命令查看手冊(cè)頁(yè)。

      man 命令行:
      man [-acdfFhkKtwW] [-m system] [-p string] [-C config_file] [-M path] [-P pager] [-S section_list] [section] name

      常用命令行:
      $ man open
      $ man 7 man
      $ man ./myman.3


      2. info
      Linux 中的大多數(shù)軟件開(kāi)發(fā)工具都是來(lái)自自由軟件基金會(huì)的 GNU 項(xiàng)目,這些工具軟件件的在線文檔都以 info 文件的形式存在。info 程序是 GNU 的超文本幫助系統(tǒng)。

      info 文檔一般保存在 /usr/info 目錄下,使用 info 命令查看 info 文檔。

      要運(yùn)行 info,可以在 shell 提示符后輸入 info,也可以在 GNU 的 emacs 中鍵入 Esc-x 后跟 info。

      info 幫助系統(tǒng)的初始屏幕顯示了一個(gè)主題目錄,你可以將光標(biāo)移動(dòng)到帶有 * 的主題菜單上面,然后按回車(chē)鍵
      進(jìn)入該主題,也可以鍵入 m,后跟主題菜單的名稱(chēng)而進(jìn)入該主題。例如,你可以鍵入 m,然后再鍵入 gcc 而進(jìn)
      進(jìn)入 gcc 主題中。
      如果你要在主題之間跳轉(zhuǎn),則必須記住如下的幾個(gè)命令鍵:
      * n:跳轉(zhuǎn)到該節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn);
      * p:跳轉(zhuǎn)到該節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn);
      * m: 指定菜單名而選擇另外一個(gè)節(jié)點(diǎn);
      * f:進(jìn)入交叉引用主題;
      * l:進(jìn)入該窗口中的一個(gè)節(jié)點(diǎn);
      * TAB:跳轉(zhuǎn)到該窗口的下一個(gè)超文本鏈接;
      * RET:進(jìn)入光標(biāo)處的超文本鏈接;
      * u:轉(zhuǎn)到上一級(jí)主題;
      * d:回到 info 的初始節(jié)點(diǎn)目錄;
      * h:調(diào)出 info 教程;
      * q:退出 info。

      #DEMO#

      3. HOW-TO
      可供用戶參考的聯(lián)機(jī)文檔的另一種形式是 HOWTO 文件,這些文件位于系統(tǒng)的 /usr/doc/HOWTO 目錄下。 HOWTO 文件的文件名都有一個(gè) -HOWTO 后綴,并且都是文本文件。

      每一個(gè) HOWTO 文件包含 Linux 某一方面的信息,例如它支持的硬件或如何建立一個(gè)引導(dǎo)盤(pán)。

      要想查看這些文件,進(jìn)入 /usr/doc/HOWTO 目錄,使用 more 命令,具體形式如下:
      $ cd /usr/doc/HOWTO; more topic-name-HOWTO

      另外,HOWTO 文檔還有其他格式的文件,例如 HTML 和 PS 等,保存在 /usr/doc/HOWTO/other-formats 下。

      4. 其他
      Linux 的內(nèi)核文檔一般包含在內(nèi)核源代碼中,目錄如下:/usr/src/linux-2.x.x/Documentation

      /usr/doc 目錄下包含有大量與特定軟件或函數(shù)庫(kù)相關(guān)的說(shuō)明性文檔。

        4 C 語(yǔ)言編程風(fēng)格

        編寫(xiě)這一小節(jié)的目的是提醒大家在編程過(guò)程中注意編程風(fēng)格。如果你只是在編寫(xiě)一些小的練習(xí)程序,程序只有一兩百行長(zhǎng)的話,編程風(fēng)格可能并不重要。然而,如果你和許多人一起進(jìn)行開(kāi)發(fā)工作,或者,你希望在過(guò)一段時(shí)間之后,還能夠正確理解自己的程序的話,就必須養(yǎng)成良好的編程習(xí)慣。在諸多編程習(xí)慣當(dāng)中,編程風(fēng)格是重要的一項(xiàng)內(nèi)容。

        良好的編程風(fēng)格可以在許多方面幫助開(kāi)發(fā)人員。如果你閱讀過(guò) Linux 內(nèi)核源代碼的話,可能會(huì)對(duì)程序的優(yōu)美編排所傾倒。良好的編程風(fēng)格可以增加代碼的可讀性,并幫助你理清頭緒。如果程序非常雜亂,大概看一眼就該讓你暈頭轉(zhuǎn)向了。編程風(fēng)格能體現(xiàn)一個(gè)程序員的綜合素質(zhì)。

        許多讀者可能對(duì) Windows 所推崇的匈牙利命名法很熟悉。這種方法定義了非常復(fù)雜的函數(shù)、變量、類(lèi)型等的命名方法,典型的命名方法是采用大小寫(xiě)混寫(xiě)的方式,對(duì)于變量名稱(chēng),則采用添加前綴的辦法來(lái)表示其類(lèi)型,例如:
      char szBuffer[20];
      int nCount;
      利用 sz 和 n 分別代表字符串和整數(shù)。為了表示一個(gè)變量名稱(chēng),采用如下的變量名稱(chēng)是可能的:
      int iThisIsAVeryLongVariable;

        在 Linux 中,我們經(jīng)常看到的是定義非常簡(jiǎn)單的函數(shù)接口和變量名稱(chēng)。在 Linux 內(nèi)核的源代碼中,可以看到 Linux 內(nèi)核源代碼的編碼風(fēng)格說(shuō)明(/ Documentation/CodingStyle)。UNIX 系統(tǒng)的一個(gè)特點(diǎn)是設(shè)計(jì)精巧,并遵守積木式原則。C 語(yǔ)言初來(lái)自 UNIX 操作系統(tǒng),與 UNIX 的設(shè)計(jì)原則一樣, C 語(yǔ)言被廣泛認(rèn)可和使用的一個(gè)重要原因是它的靈活性以及簡(jiǎn)潔性。因此,在利用 C 語(yǔ)言編寫(xiě)程序時(shí),始終應(yīng)當(dāng)符合其簡(jiǎn)潔的設(shè)計(jì)原則,而不應(yīng)當(dāng)使用非常復(fù)雜的變量命名方法。Linus 為 Linux 內(nèi)核定義的 C 語(yǔ)言編碼風(fēng)格要點(diǎn)如下:

        縮進(jìn)時(shí),使用長(zhǎng)度為 8 個(gè)字符寬的 Tab 鍵。如果程序的縮進(jìn)超過(guò) 3 級(jí),則應(yīng)考慮重新設(shè)計(jì)程序。
      大括號(hào)的位置。除函數(shù)的定義體外,應(yīng)當(dāng)將左大括號(hào)放在行尾,而將右大括號(hào)放在行首。函數(shù)的定義體應(yīng)將左右大括號(hào)放在行首。如下所示:
      int function(int x, int y)
      {
      if (x == y) {
      ...
      } else if (x > y) {
      ...
      } else {
      ...
      }

      return 0;
      }

        應(yīng)采用簡(jiǎn)潔的命名方法。對(duì)變量名,不贊成使用大小寫(xiě)混寫(xiě)的形式,但鼓勵(lì)使用描述性的名稱(chēng);盡可能不使用全局變量;不采用匈牙利命名法表示變量的類(lèi)型;采用短小精悍的名稱(chēng)表示局部變量;保持函數(shù)短小,從而避免使用過(guò)多的局部變量。
      保持函數(shù)短小精悍。
      不應(yīng)過(guò)分強(qiáng)調(diào)注釋的作用,應(yīng)盡量采用好的編碼風(fēng)格而不是添加過(guò)多的注釋。

        5 庫(kù)和頭文件的保存位置

      1. 函數(shù)庫(kù)
      /lib:系統(tǒng)必備共享庫(kù)
      /usr/lib:標(biāo)準(zhǔn)共享庫(kù)和靜態(tài)庫(kù)
      /usr/i486-linux-libc5/lib:libc5 兼容性函數(shù)庫(kù)
      /usr/X11R6/lib:X11R6 的函數(shù)庫(kù)
      /usr/local/lib:本地函數(shù)庫(kù)
      2. 頭文件
      /usr/include:系統(tǒng)頭文件
      /usr/local/include:本地頭文件
      1.4.6 共享庫(kù)及其相關(guān)配置
      /etc/ld.so.conf:包含共享庫(kù)的搜索位置
      ldconfig:共享庫(kù)管理工具,一般在更新了共享庫(kù)之后要運(yùn)行該命令
      ldd:可查看可執(zhí)行文件所使用的共享庫(kù)

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

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

      
      

      1. 欧美精品一区二区三区免费 | 久久―日本道色综合久久 | 亚洲欧洲日韩综合国产综合 | 亚洲第一福利天堂在线观看视频网站 | 日韩在线精品特黄 | 亚洲日韩国产综合中文字幕 |