?? basic.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>Linux 的編程常識</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="GENERATOR" CONTENT="StarOffice/5.1 (Linux)">
<META NAME="AUTHOR" CONTENT="Yongming Wei">
<META NAME="CREATED" CONTENT="20000329;17342600">
<META >
<STYLE>
<!--
H1 { color: #ffff00 }
H2 { color: #ffff00 }
H3 { color: #ff00ff }
H4 { color: #ffff00 }
TD P { color: #b880b8 }
LI { color: #ffffff }
P { color: #00ffff }
A:link { color: #00b8ff }
A:visited { color: #ff3366 }
-->
</STYLE>
</HEAD>
<BODY TEXT="#ffff00" LINK="#00b8ff" VLINK="#ff3366" BACKGROUND="../images/velvet.jpg">
<A HREF="others.html"><IMG SRC="prev.gif" ALT="Previous"></A>
<A HREF="scenario.html"><IMG SRC="next.gif" ALT="Next"></A>
<A HREF="index.html"><IMG SRC="toc.gif" ALT="Contents"></A>
<H1 ALIGN=CENTER>1.4 Linux 的編程常識<BR><BR>
</H1>
<UL>
<LI><P>標準 (ANSI C, POSIX, SVID, XPG, ...)</LI>
<LI><P>函數庫和系統調用</LI>
<LI><P>在線文檔 (man, info, HOW-TO, ...)</LI>
<LI><P>C 語言編程風格</LI>
<LI><P>庫和頭文件的保存位置</LI>
<LI><P>共享庫及其相關配置</LI>
</UL>
<H3>1.4.1 標準 (ANSI C, POSIX, SVID, XPG, ...)</H3>
<UL>
<LI>ANSI C:這一標準是 ANSI(美國國家標準局)于 1989 年制定的 C 語言標準。
后來被 ISO(國際標準化組織)接受為標準,因此也稱為 ISO C。<BR>
ANSI C 的目標是為各種操作系統上的 C 程序提供可移植性保證,而不僅僅限于 UNIX。
該標準不僅定義了 C 編程語言的語發和語義,而且還定義了一個標準庫。這個庫可以根據
頭文件劃分為 15 個部分,其中包括:字符類型 (<ctype.h>)、錯誤碼 (<errno.h>)、
浮點常數 (<float.h>)、數學常數 (<math.h>)、標準定義 (<stddef.h>)、
標準 I/O (<stdio.h>)、工具函數 (<stdlib.h>)、字符串操作 (<string.h>)、
時間和日期 (<time.h>)、可變參數表 (<stdarg.h>)、信號 (<signal.h>)、
非局部跳轉 (<setjmp.h>)、本地信息 (<local.h>)、程序斷言 (<assert.h>)
等等。</LI>
<LI>POSIX:該標準最初由 IEEE 開發的標準族,部分已經被 ISO 接受為國際標準。該標準的具體內容
見 1.1.3。POSIX.1 和 POSIX.2 分別定義了 POSIX 兼容操作系統的 C 語言系統接口
以及 shell 和工具標準。這兩個標準是通常提到的標準。</LI>
<LI>SVID:System V 的接口描述。System V 接口描述(SVID)是描述 AT&&;T Unix System V 操作
系統的文檔,是對 POSIX 標準的擴展超集。</LI>
<LI>XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd.出版),
是比 POSIX 更為一般的標準。X/Open 擁有 Unix 的版權,而 XPG 則指定成為 Unix
操作系統必須滿足的要求。</LI>
</UL>
<H3>1.4.2 函數庫和系統調用</H3>
<H4>1. glibc</H4>
<P>
眾所周知,C 語言并沒有為常見的操作,例如輸入/輸出、內存管理,字符串操作等提供內置的支持。
相反,這些功能一般由標準的“函數庫”來提供。GNU 的 C 函數庫,即 glibc,是 Linux 上最重要的
函數庫,它定義了 ISO C 標準指定的所有的庫函數,以及由 POSIX 或其他 UNIX 操作系統
統變種指定的附加特色,還包括有與 GNU 系統相關的擴展。目前,流行的 Linux 系統使用 glibc 2.0
以上的版本。glibc 基于如下標準:</P>
<UL>
<LI>ISO C: C 編程語言的國際標準,即 ANSI C。</LI>
<LI>POSIX:GNU C 函數庫實現了 ISO/IEC 9945-1:1996 (POSIX 系統應用程序編程接口,
即 POSIX.1)指定的所有函數。該標準是對 ISO C 的擴展,包括文件系統接口原
語、設備相關的終端控制函數以及進程控制函數。同時,GUN C 函數庫還支持部分由
ISO/IEC 9945-2:1993(POSIX Shell 和 工具標準,即 POSIX.2)指定的函數,
其中包括用于處理正則表達式和模式匹配的函數。</LI>
<LI>Berkeley Unix:BSD 和 SunOS。GNU C 函數庫定義了某些 UNIX 版本中尚未標準化的函數,
尤其是 4.2 BSD, 4.3 BSD, 4.4 BSD Unix 系統(即“Berkeley Unix”)以及“SunOS”
(流行的 4.2 BSD 變種,其中包含有某些 Unix System V 的功能)。BSD 函數包括
符號鏈接、select 函數、BSD 信號處理函數以及套接字等等。</LI>
<LI>SVID:System V 的接口描述。GNU C 函數庫定義了大多數由 SVID 指定而未被 ISO C
和 POSIX 標準指定的函數。來自 System V 的支持函數包括進程間通信和共享內存、
hsearch 和 drand48 函數族、fmtmsg 以及一些數學函數。</LI>
<LI>XPG:X/Open 可移植性指南。GNU C 函數庫遵循 X/Open 可移植性指南(Issue 4.2)
以及所有的 XSI(X/Open 系統接口)兼容系統的擴展,同時也遵循所有的 X/Open Unix
擴展。</LI>
</UL>
<H4>2. 其他重要函數庫</H4>
<P>
除 glibc 之外,流行的 Linux 發行版中還包含有一些其他的函數庫,這些函數庫具有重要地位,
例如:</P>
<UL>
<LI>GNU Libtool:GNU Libtool 實際是一個腳本生成工具,它可以為軟件包開發者提供一般性
的共享庫支持。<BR>
以前,如果源代碼包的開發者要利用共享庫的優點,則必須為每個軟件包可支持的平臺編寫
定制的支持代碼。并且還需要設計配置接口,以便軟件包的安裝程序能夠正確選擇要建立的
庫類型。利用 GNU Libtool,則可以簡化開發者的這一工作。它在一個單獨的腳本中同時封裝
了與平臺相關的依賴性以及用戶界面。GNU Libtool 可使每個宿主類型的完整功能可通過
一般性的接口獲得,同時為程序員隱藏了宿主的特殊性。GNU Libtool 一致性接口是可靠的,
用戶不必閱讀那些晦澀的文檔,以便在每個平臺上建立共享庫。他們只需運行軟件包的配置
腳本,而由 libtool 完成繁復的工作。</LI>
<LI>CrackLib:CrackLib 為用戶提供了一個 C 語言函數接口,利用這一函數,可避免用戶選擇
容易破解的密碼。該函數庫可在類似 passwd 的程序中使用。</LI>
<LI>LibGTop:LibGTop 是一個能夠獲取進程信息以及系統運行信息的函數庫,這些信息包括:
系統的一般信息、SYS V IPC 限制、進程列表、進程信息、進程映射、文件系統使用信息等。</LI>
<LI>圖形文件操作函數庫:包括 libungif、libtiff、libpng、Imlib 等,可分別用來操作
GIF、TIFF、PNG 以及其他一些格式圖形文件。</LI>
</UL>
<H4>3. 系統調用</H4>
<P>
系統調用是操作系統提供給外部程序的接口。在 C 語言中,操作系統的系統調用通常通過
函數調用的形式完成,這是因為這些函數封裝了系統調用的細節,將系統調用的入口、參數以及
返回值用 C 語言的函數調用過程實現。在 Linux 系統中,系統調用函數定義在 glibc 中。 </P>
<P>
談到系統調用時,需要注意如下幾點:</P>
<UL>
<LI>系統調用函數通常在成功時返回 0 值,不成功時返回非零值。如果要檢查失敗原因,則
要判斷 errno 這個全局變量的值,errno 中包含有錯誤代碼。</LI>
<LI>許多系統調用的返回數據通常通過引用參數傳遞。這時,需要在函數參數中傳遞一個
緩沖區地址,而返回的數據就保存在該緩沖區中。</LI>
<LI>不能認為系統調用函數就要比其他函數的執行效率高。要注意,系統調用是一個非常耗時
的過程。</LI>
</UL>
<P>
有關系統調用我們將在以后詳細講述。
</P>
<H3>1.4.3 在線文檔 (man, info, HOW-TO, ...)</H3>
<H4>1. man</H4>
<P>
man,即 manunal,是 UNIX 系統手冊的電子版本。根據習慣,UNIX 系統手冊通常分為
不同的部分(或小節,即 section),每個小節闡述不同的系統內容。目前的小節劃分如下:
</P>
<OL>
<LI>命令:普通用戶命令</LI>
<LI>系統調用:內核接口</LI>
<LI>函數庫調用:普通函數庫中的函數</LI>
<LI>特殊文件:/dev 目錄中的特殊文件</LI>
<LI>文件格式和約定:/etc/passwd 等文件的格式</LI>
<LI>游戲。</LI>
<LI>雜項和約定:標準文件系統布局、手冊頁結構等雜項內容</LI>
<LI>系統管理命令。</LI>
<LI>內核例程:非標準的手冊小節。便于 Linux 內核的開發而包含</LI>
</OL>
<P>
其他手冊小節:</P>
<UL>
<LI>l: PostgreSQL 數據庫命令</LI>
<LI>n: TCL/TK 命令</LI>
</UL>
<P>
手冊頁一般保存在 /usr/man 目錄下,其中每個子目錄(如 man1, man2, ..., manl, mann)
包含不同的手冊小節。使用 man 命令查看手冊頁。</P>
<P>
man 命令行:<BR>
man [-acdfFhkKtwW] [-m system] [-p string] [-C config_file] [-M path] [-P
pager] [-S section_list] [section] name
<P>
常用命令行:<BR>
$ man open<BR>
$ man 7 man<BR>
$ man ./myman.3<BR>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -