1. 程式人生 > >linux下c程式設計常識

linux下c程式設計常識

主要內容:

① 標準 (ANSI C, POSIX, SVID, XPG, ...)

② 函式庫和系統呼叫

③ 線上文件 (man, info, HOW-TO, ...)

④ C 語言程式設計風格

⑤ 庫和標頭檔案的儲存位置

⑥ 共享庫及其相關配置

一: 標準 (ANSI C, POSIX, SVID, XPG, ...)


ANSI C:這一標準是 ANSI(美國國家標準局)於 1989 年制定的 C 語言標準。 後來被 ISO(國際標準化組織)接受為標準,因此也稱為 ISO C。
ANSI C 的目標是為各種作業系統上的 C 程式提供可移植性保證,而不僅僅限於 UNIX。 該標準不僅定義了 C 程式語言的語發和語義,而且還定義了一個標準庫。

這個庫可以根據 標頭檔案劃分為 15 個部分,其中包括:

字元型別 ()、錯誤碼 ()、 浮點常數 ()、數學常數 ()、標準定義 ()、 標準 I/O ()、工具函式 ()、字串操作 ()、 時間和日期 ()、可變引數表 ()、訊號 ()、 非區域性跳轉 ()、本地資訊 ()、程式斷言 () 等等。


POSIX:該標準最初由 IEEE 開發的標準族,部分已經被 ISO 接受為國際標準。。POSIX.1 和 POSIX.2 分別定義了 POSIX 相容作業系統的 C 語言系統介面 以及 shell 和工具標準。這兩個標準是通常提到的標準。


SVID:System V 的介面描述。System V 介面描述(SVID)是描述 AT&&;T Unix System V 操作 系統的文件,是對 POSIX 標準的擴充套件超集。


XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd.出版), 是比 POSIX 更為一般的標準。X/Open 擁有 Unix 的版權,而 XPG 則指定成為 Unix 作業系統必須滿足的要求。

二 :函式庫和系統呼叫

1. glibc

眾所周知,C 語言並沒有為常見的操作,例如輸入/輸出、記憶體管理,字串操作等提供內建的支援。相反,這些功能一般由標準的“函式庫”來提供。GNU 的 C 函式庫,即 glibc,是 Linux 上最重要的函式庫,它定義了 ISO C 標準指定的所有的庫函式,以及由 POSIX 或其他 UNIX 作業系統統變種指定的附加特色,還包括有與 GNU 系統相關的擴充套件。目前,流行的 Linux 系統使用 glibc 2.0 以上的版本。glibc 基於如下標準:

  • ISO C: C 程式語言的國際標準,即 ANSI C。
  • POSIX:GNU C 函式庫實現了 ISO/IEC 9945-1:1996 (POSIX 系統應用程式程式設計介面, 即 POSIX.1)指定的所有函式。該標準是對 ISO C 的擴充套件,包括檔案系統介面原 語、裝置相關的終端控制函式以及程序控制函式。同時,GUN C 函式庫還支援部分由 ISO/IEC 9945-2:1993(POSIX Shell 和 工具標準,即 POSIX.2)指定的函式, 其中包括用於處理正則表示式和模式匹配的函式。
  • 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 訊號處理函式以及套接字等等。
  • SVID:System V 的介面描述。GNU C 函式庫定義了大多數由 SVID 指定而未被 ISO C 和 POSIX 標準指定的函式。來自 System V 的支援函式包括程序間通訊和共享記憶體、 hsearch 和 drand48 函式族、fmtmsg 以及一些數學函式。
  • XPG:X/Open 可移植性指南。GNU C 函式庫遵循 X/Open 可移植性指南(Issue 4.2) 以及所有的 XSI(X/Open 系統介面)相容系統的擴充套件,同時也遵循所有的 X/Open Unix 擴充套件。
    眾所周知,C 語言並沒有為常見的操作,例如輸入/輸出、記憶體管理,字串操作等提供內建的支援。相反,這些功能一般由標準的“函式庫”來提供。GNU 的 C 函式庫,即 glibc,是 Linux 上最重要的函式庫,它定義了 ISO C 標準指定的所有的庫函式,以及由 POSIX 或其他 UNIX 作業系統統變種指定的附加特色,還包括有與 GNU 系統相關的擴充套件。目前,流行的 Linux 系統使用 glibc 2.0 以上的版本。glibc 基於如下標準:


2. 其他重要函式庫
除 glibc 之外,流行的 Linux 發行版中還包含有一些其他的函式庫,這些函式庫具有重要地位,例如:

GNU Libtool:GNU Libtool 實際是一個指令碼生成工具,它可以為軟體包開發者提供一般性 的共享庫支援。
以前,如果原始碼包的開發者要利用共享庫的優點,則必須為每個軟體包可支援的平臺編寫 定製的支援程式碼。並且還需要設計配置介面,以便軟體包的安裝程式能夠正確選擇要建立的 庫型別。利用 GNU Libtool,則可以簡化開發者的這一工作。它在一個單獨的指令碼中同時封裝 了與平臺相關的依賴性以及使用者介面。GNU Libtool 可使每個宿主型別的完整功能可通過 一般性的介面獲得,同時為程式設計師隱藏了宿主的特殊性。GNU Libtool 一致性介面是可靠的, 使用者不必閱讀那些晦澀的文件,以便在每個平臺上建立共享庫。他們只需執行軟體包的配置 指令碼,而由 libtool 完成繁複的工作。
CrackLib:CrackLib 為使用者提供了一個 C 語言函式介面,利用這一函式,可避免使用者選擇 容易破解的密碼。該函式庫可在類似 passwd 的程式中使用。
LibGTop:LibGTop 是一個能夠獲取程序資訊以及系統執行資訊的函式庫,這些資訊包括: 系統的一般資訊、SYS V IPC 限制、程序列表、程序資訊、程序對映、檔案系統使用資訊等。
圖形檔案操作函式庫:包括 libungif、libtiff、libpng、Imlib 等,可分別用來操作 GIF、TIFF、PNG 以及其他一些格式圖形檔案。


3. 系統呼叫
系統呼叫是作業系統提供給外部程式的介面。在 C 語言中,作業系統的系統呼叫通常通過函式呼叫的形式完成,這是因為這些函式封裝了系統呼叫的細節,將系統呼叫的入口、引數以及返回值用 C 語言的函式呼叫過程實現。在 Linux 系統中,系統呼叫函式定義在 glibc 中。

談到系統呼叫時,需要注意如下幾點:

系統呼叫函式通常在成功時返回 0 值,不成功時返回非零值。如果要檢查失敗原因,則 要判斷 errno 這個全域性變數的值,errno 中包含有錯誤程式碼。
許多系統呼叫的返回資料通常通過引用引數傳遞。這時,需要在函式引數中傳遞一個 緩衝區地址,而返回的資料就儲存在該緩衝區中。
不能認為系統呼叫函式就要比其他函式的執行效率高。要注意,系統呼叫是一個非常耗時 的過程。
有關係統呼叫我們將在以後詳細講述。

三: 線上文件 (man, info, HOW-TO, ...)


1. man
man,即 manunal,是 UNIX 系統手冊的電子版本。根據習慣,UNIX 系統手冊通常分為不同的部分(或小節,即 section),每個小節闡述不同的系統內容。目前的小節劃分如下:

命令:普通使用者命令
系統呼叫:核心介面
函式庫呼叫:普通函式庫中的函式
特殊檔案:/dev 目錄中的特殊檔案
檔案格式和約定:/etc/passwd 等檔案的格式
遊戲。
雜項和約定:標準檔案系統佈局、手冊頁結構等雜項內容
系統管理命令。
核心例程:非標準的手冊小節。便於 Linux 核心的開發而包含
其他手冊小節:

l: PostgreSQL 資料庫命令
n: TCL/TK 命令
手冊頁一般儲存在 /usr/man 目錄下,其中每個子目錄(如 man1, man2, ..., manl, mann)包含不同的手冊小節。使用 man 命令檢視手冊頁。

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 中的大多數軟體開發工具都是來自自由軟體基金會的 GNU 專案,這些工具軟體件的線上文件都以 info 檔案的形式存在。info 程式是 GNU 的超文字幫助系統。

info 文件一般儲存在 /usr/info 目錄下,使用 info 命令檢視 info 文件。

要執行 info,可以在 shell 提示符後輸入 info,也可以在 GNU 的 emacs 中鍵入 Esc-x 後跟 info。

info 幫助系統的初始螢幕顯示了一個主題目錄,你可以將游標移動到帶有 * 的主題選單上面,然後按回車鍵
進入該主題,也可以鍵入 m,後跟主題選單的名稱而進入該主題。例如,你可以鍵入 m,然後再鍵入 gcc 而進
進入 gcc 主題中。
如果你要在主題之間跳轉,則必須記住如下的幾個命令鍵:
* n:跳轉到該節點的下一個節點;
* p:跳轉到該節點的上一個節點;
* m: 指定選單名而選擇另外一個節點;
* f:進入交叉引用主題;
* l:進入該視窗中的最後一個節點;
* TAB:跳轉到該視窗的下一個超文字連結;
* RET:進入游標處的超文字連結;
* u:轉到上一級主題;
* d:回到 info 的初始節點目錄;
* h:調出 info 教程;
* q:退出 info。

#DEMO#

3. HOW-TO
可供使用者參考的聯機文件的另一種形式是 HOWTO 檔案,這些檔案位於系統的 /usr/doc/HOWTO 目錄下。 HOWTO 檔案的檔名都有一個 -HOWTO 字尾,並且都是文字檔案。

每一個 HOWTO 檔案包含 Linux 某一方面的資訊,例如它支援的硬體或如何建立一個引導盤。

要想檢視這些檔案,進入 /usr/doc/HOWTO 目錄,使用 more 命令,具體形式如下:
$ cd /usr/doc/HOWTO; more topic-name-HOWTO

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

4. 其他
Linux 的核心文件一般包含在核心原始碼中,目錄如下:/usr/src/linux-2.x.x/Documentation

/usr/doc 目錄下包含有大量與特定軟體或函式庫相關的說明性文件。

四: C 語言程式設計風格
編寫這一小節的目的是提醒大家在程式設計過程中注意程式設計風格。如果你只是在編寫一些小的練習程式,程式只有一兩百行長的話,程式設計風格可能並不重要。然而,如果你和許多人一起進行開發工作,或者,你希望在過一段時間之後,還能夠正確理解自己的程式的話,就必須養成良好的程式設計習慣。在諸多程式設計習慣當中,程式設計風格是最重要的一項內容。

良好的程式設計風格可以在許多方面幫助開發人員。如果你閱讀過 Linux 核心原始碼的話,可能會對程式的優美編排所傾倒。良好的程式設計風格可以增加程式碼的可讀性,並幫助你理清頭緒。如果程式非常雜亂,大概看一眼就該讓你暈頭轉向了。程式設計風格最能體現一個程式設計師的綜合素質。

許多讀者可能對 Windows 所推崇的匈牙利命名法很熟悉。這種方法定義了非常複雜的函式、變數、型別等的命名方法,典型的命名方法是採用大小寫混寫的方式,對於變數名稱,則採用新增字首的辦法來表示其型別,例如:
char szBuffer[20];
int nCount;
利用 sz 和 n 分別代表字串和整數。為了表示一個變數名稱,採用如下的變數名稱是可能的:
int iThisIsAVeryLongVariable;

在 Linux 中,我們經常看到的是定義非常簡單的函式介面和變數名稱。在 Linux 核心的原始碼中,可以看到 Linux 核心原始碼的編碼風格說明(/ Documentation/CodingStyle)。UNIX 系統的一個特點是設計精巧,並遵守積木式原則。C 語言最初來自 UNIX 作業系統,與 UNIX 的設計原則一樣, C 語言被廣泛認可和使用的一個重要原因是它的靈活性以及簡潔性。因此,在利用 C 語言編寫程式時,始終應當符合其簡潔的設計原則,而不應當使用非常複雜的變數命名方法。Linus 為 Linux 核心定義的 C 語言編碼風格要點如下:

縮排時,使用長度為 8 個字元寬的 Tab 鍵。如果程式的縮排超過 3 級,則應考慮重新設計程式。
大括號的位置。除函式的定義體外,應當將左大括號放在行尾,而將右大括號放在行首。函式的定義體應將左右大括號放在行首。如下所示:
int function(int x, int y)
{
if (x == y) {
...
} else if (x > y) {
...
} else {
...
}

return 0;
}

應採用簡潔的命名方法。對變數名,不贊成使用大小寫混寫的形式,但鼓勵使用描述性的名稱;儘可能不使用全域性變數;不採用匈牙利命名法表示變數的型別;採用短小精悍的名稱表示區域性變數;保持函式短小,從而避免使用過多的區域性變數。
保持函式短小精悍。
不應過分強調註釋的作用,應儘量採用好的編碼風格而不是新增過多的註釋。


五: 庫和標頭檔案的儲存位置


1. 函式庫
/lib:系統必備共享庫
/usr/lib:標準共享庫和靜態庫
/usr/i486-linux-libc5/lib:libc5 相容性函式庫
/usr/X11R6/lib:X11R6 的函式庫
/usr/local/lib:本地函式庫
2. 標頭檔案
/usr/include:系統標頭檔案
/usr/local/include:本地標頭檔案


六:共享庫及其相關配置


/etc/ld.so.conf:包含共享庫的搜尋位置
ldconfig:共享庫管理工具,一般在更新了共享庫之後要執行該命令
ldd:可檢視可執行檔案所使用的共享庫

相關推薦

linuxc程式設計常識

主要內容: ① 標準 (ANSI C, POSIX, SVID, XPG, ...) ② 函式庫和系統呼叫 ③ 線上文件 (man, info, HOW-TO, ...) ④ C 語言程式設計風格 ⑤ 庫和標頭檔案的儲存位置 ⑥ 共享庫及其相關配置 一: 標準 (ANSI C, POSIX, SVID, X

LINUXC++程式設計如何獲得某程序的ID

#include <stdio.h> #include <stdlib.h> #include <unistd.h> using namespace std; pid_t getProcessPidByName(const char *proc_name) {

linuxC 程式設計學習之多程序程式設計(一)

一、程序概念 程序是作業系統中資源分配的最小單位,而執行緒是排程的最小單位。 一個程序,主要包含三個元素: a)        一個可以執行的程式; b)        和該程序相關聯的全部資料(包括變數,記憶體空間,緩衝區等等); c)        程式的執行上下文(

linuxC程式設計詳解

linux作業系統下 c語言程式設計 整理編寫:007xiong原文:Hoyt等(一)目錄介紹1)Linux程式設計入門--基礎知識2)Linux程式設計入門--程序介紹3)Linux程式設計入門--檔案操作4)Linux程式設計入門--時間概念5)Linux程式設計入門--訊號處理6)Linux程式設計入

linuxc程式設計之訊號量semget,semop,semctl函式

訊號量 今天去參加北京市的植樹志願者活動啦!早上起來的挺早的,6:10就被傑子給叫起來啦,帶著對春天的嚮往,我們坐著不花錢的大巴去做為市領導服務去啦!發了一個小紅帽還有一個紅色的制服。 唉。。。說好

嘗試linuxc程式設計之管道

今天試了下管道,感覺挺有意思的~ 現在才發現,原來程序也有這麼多的功能可以實現。管道分類: 根據程序的相互關係,可以分為:匿名管道與命名管道。1   匿名管道:管道是父程序和子程序間,或是子程序與子程序間單向的通訊機制,即一個程序傳送資料到管道,另外一個程序從管道中讀出資料。

LinuxC程式設計-----IO/檔案操作/記憶體對映 實現簡單記錄儲存(3)

利用linux下的檔案記憶體對映可以實現程序共享資料,我們可以把一個檔案對映到虛擬記憶體中使多個程序進行共享, 到這裡我們大概能想到他能應用到的領域 是很廣泛的  主要涉及到 mmap  munmap   msync 三個函式的應用 下面貼程式碼  下面一段程式碼是為檔案

linuxc程式設計例項

linux下c程式設計使用gcc編譯器,下載gcc:sudo yum install -b gcc current 編寫程式 一、最簡單的helloword vi hello.c #include <stdio.h> int main() {     print

LinuxC++程式設計(二)----vim簡單使用

Vim使用 簡介 Vim(Vi[Improved])編輯器是功能強大的跨平臺文字檔案編輯工具,繼承自Unix系統的Vi編輯器,支援Linux/Mac OS X/Windows系統, 利用它可以建立、修改文字檔案。進入Vim編輯程式,可以在終端輸入下面的

linuxC程式設計(六)之 void用法大總結

這次對void差不多有點多少的理解了,從最初的理解就是空,麼有的意思。首先void是C語言中的關鍵字,對函式返回值的限定,對函式引數的限定。 1.void*常常被稱為空指標,其實理解為指向任意型別的指標比較合適,as we all kown,如果指標p1和指標p2的型別相同

linuxc程式設計之gdb除錯

之前在個人微信公眾號寫了一篇關於linux下c程式設計之gcc編譯的文章,感興趣可關注我的個人微信公眾號,搜尋移動開發與網路安全技術棧加關注,或掃描本文末尾的微信二維碼加關注。 今天接著說下linu

條件語句和linuxc程式設計初體驗

今天的空閒比較多。於是一口氣把java視訊裡的條件語句看完了 說實話,語言真的是相通的。 只是使用的語句有一些方面不一樣。 學完C,現在再次學習if-else語句的時候, 和當初的感覺又有不同。 對if-else的巢狀,理解的更清晰了。 不過更有待於日後使用的加深。 不過今

LinuxC程式設計實現---獲取本機IP地址

在LINUX下,如果需要獲取本機的IP地址,需要用到以下一個結構體,該結構體在/usr/include/net/if.h檔案中 struct ifreq { # define IFHWADDRLEN 6 # define IFNAMSIZ IF_

linuxC語言程式設計解決warning : incompatible implicit declaration of built-in function問題

         在C語言程式設計過程中,偶遇如下warning,雖然並不影響最終的編譯結果,但是看著warning也很無語,畢竟強迫症。        我們可以發現被警告沒有宣告的都是常用

Linux C程式設計之一:Linuxc語言的開發環境

—恢復內容開始— 今天開始根據Linux C程式設計相關視訊的學習所做的筆記,希望能一直堅持下去。。。 1、開發環境的構成 編輯器:VI; 編譯器:選擇GNU C/C++編譯器gcc; 偵錯程式:應用廣泛的gdb; 函式庫:glibc ; 系統標頭檔案:glibc_header; 2、在安裝L

linuxC/C++ socket程式設計

簡單的linux下socket程式設計,分別基於TCP和UDP協議實現的簡單程式 linux下socket程式設計可以概括為以下幾個函式的運用: socket() bind() listen() connect() ac

linuxgcc程式設計06-c語言參考手冊

一。 c語言標準庫介紹 二。c語言參考案例  巨集定義 巨集是在gcc編譯預處理階段就會執行的程式碼   //#pragma命令可以讓程式設計者讓編譯器執行某些事 #include <stdio.h> //包含io流的庫 標準的輸入和輸出 ""首先在

linuxC語言程式設計操作MySQL資料庫

原文地址:http://www.2cto.com/database/201506/407827.html 在實際應用中,我們不可能在命令列登入進資料庫進行資料的查詢、插入等操作,使用者一般是使用一個介面良好的應用程式軟體來對資料進行管理。為了方便應用程式的開發,MySQ

Linuxc語言的圖形程式設計(轉) curses.h 函式庫

這是轉貼哈,最近想吧TC的圖形程式設計搞到LINUX下面來,所以就對其有所研究了哦。http://tech.techweb.com.cn/viewthread.php?tid=181892註明了轉載,以後自己牛了再自己寫,呵呵。先看看哈。  以下是UNIX下c語言的圖形程式設

linuxC/C++網路程式設計基本:socket實現tcp和udp的例子

簡單的linux下socket程式設計,分別基於TCP和UDP協議實現的簡單程式 linux下socket程式設計可以概括為以下幾個函式的運用: socket() bind() listen