天天看點

一些LinuxC的小知識點(一)

輸入結果:

一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)

當我們運作Linux下的C語言程式的時候,就可以非常友善地用getopt()這個函數将main參數中的argv提取出來,按需進行處理。函數的使用見以下代碼段。

一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)

1、_exit()執行後立即傳回給核心,而exit()要先執行一些清除操作,然後将控制權交給核心。

2、exit中的參數exit_code為0代表程序正常終止,若為其他值表示程式執行過程中有錯誤發生。

大家可以通過以下代碼看看兩者的異同。

一些LinuxC的小知識點(一)
stdout(Standard Output Stream)标準輸出 stdin(Standard Input Stream)标準輸入 stderr(Standard Error Output)标準錯誤輸出

預設情況下,标準輸入(stdin)指的從鍵盤上讀資料,而标準輸出(stdout)和标準錯誤輸出(stderr)是指螢幕

一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)

結果:

一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)

另外,Linux是一個多使用者的系統,我們可以通過利用’/dev/tty‘正确地将資訊輸出到使用者正在使用的終端上。

功    能:把檔案流指針轉換成檔案描述符 

相關函數:open, fopen 

表頭檔案:#include <stdio.h> 

定義函數:int fileno(FILE *stream) 

函數說明:fileno()用來取得參數stream指定的檔案流所使用的檔案描述詞 

傳回值  :傳回和stream檔案流對應的檔案描述符。如果失敗,傳回-1。 

範例:

一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)

    檔案描述詞是Linux程式設計中的一個術語。當一個檔案打開後,系統會配置設定一部分資源來儲存該檔案的資訊,以後對檔案的操作就可以直接引用該部分資源了。檔案描述詞可以認為是該部分資源的一個索引,在打開檔案時傳回。在使用fcntl函數對檔案的一些屬性進行設定時就需要一個檔案描述詞參數。 

    以前知道,當程式執行時,就已經有三個檔案流打開了,它們分别是标準輸入stdin,标準輸出stdout和标準錯誤輸出stderr。和流式檔案相對應的是,也有三個檔案描述符被預先打開,它們分别是0,1,2,代表标準輸入、标準輸出和标準錯誤輸出。 

    需要指出的是,上面的流式檔案輸入、輸出和檔案描述符的輸入輸出方式不能混用,否則會造成混亂。

請看一下下面的代碼,我們期待輸入’12345678’(8個數),用fgets函數輸出’12345678’(8個數).

一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)

我們可以看出,輸出的結果并不是我們所期望的,但是我們也命名在fget裡面寫了,我們期望的擷取8個數(PASSWORD_LEN==8)。原來fget一次調用隻能傳輸n-1個字元,因為它必須把空位元組’\0’加上以結束字元串。也就是,如果我們要讓輸出跟我們的期望相符,那麼我們要修改fget函數的參數,如下代碼段所示。

一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)

結果分析:

如果輸出++a=1,a++=1,那麼說明函數是從左執行到右的;如果++a=2,a++=0,那麼說明函數是從右執行到左的。

結果截圖:

一些LinuxC的小知識點(一)

首先,讓我們先看看兩個跟時間有關的類型time_t,tm。

time_t:它是一個大到能容納以秒計算的日期和時間的整數類型。在32位系統上就是32位的的。

tm結構體被定義為至少包含下表所示的成員。

一些LinuxC的小知識點(一)

以下代碼段展示的是如何擷取目前的時間

一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)

      在c中,為了解決一些頻繁調用的小涵數大量消耗棧空間或是叫棧記憶體的問題,特别的引入了inline修飾符,表示為内聯涵數。 

      可能說到這裡,很多人還不明白什麼是棧空間,其實棧空間就是指放置程式的局部資料也就是函數内資料的記憶體空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,涵數的死循環遞歸調用的最終結果就是導緻棧記憶體空間枯竭。 

下面我們來看一個例子

一些LinuxC的小知識點(一)
一些LinuxC的小知識點(一)

     上面的例子就是标準的内聯涵數的用法,使用inline修飾帶來的好處我們表面看不出來,其實在内部的工作就是在每個for循環的内部任何調用 dbtest(i)的地方都換成了(i%2>0)?"奇":"偶"這樣就避免了頻繁調用函數對棧記憶體重複開辟所帶來的消耗。 

      說到這裡很多人可能會問,既然inline這麼好,還不如把所謂的函數都聲明成inline,嗯,這個問題是要注意的,inline的使用是有所限制的,inline隻适合涵數體内代碼簡單的涵數使用,不能包含複雜的結構控制語句例如while switch,并且不能内聯函數本身不能是直接遞歸函數(自己内部還調用自己的函數)。 

      說到這裡我們不得不說一下在c語言中廣泛被使用的#define語句,是的define的确也能夠做到inline的這些工作,但是define是會産生副作用的,尤其是不同類型參數所導緻的錯誤,由此可見inline有更強的限制性和能夠讓編譯器檢查出更多錯誤的特性,在c 中是不推薦使用define的。

參考

<a href="http://book.douban.com/subject/4831448/">《Linux程式設計 第四版》</a>

本文轉自陳哈哈部落格園部落格,原文連結http://www.cnblogs.com/kissazi2/p/3148055.html如需轉載請自行聯系原作者

kissazi2

<a href="http://blog.csdn.net/yapingmcu/article/details/7378170">linux c inline</a>

繼續閱讀