系統調用和系統庫函數的一些基礎知識

文件

linux中文件具有特殊意義,它們爲操作系統服務和設備提供了一個簡單統一的接口,在linux中,幾乎一切都是文件.

我們可以像使用文件那樣使用磁盤,串行口,打印機和其他設備,大多情況下,只需要五個基本系統調用函數便可操作這些硬件:open(),close(),read(),write(),ioctl().

除了本身內容外,文件還有一個名字和一些屬性,例如可讀,所屬用戶等管理信息,這些信息都放在文件的inode(節點)數據結構裏.inode是文件系統中一個特別的數據塊,它還包含文件在磁盤中的位置和長度.


目錄

目錄也是文件,它用來保存其他文件的inode編號和文件名.刪除文件名就等於刪除該文件,磁盤上的相應位置會被記爲可用.

子目錄也包含在目錄中.


設備

硬件在linux中通常被映射爲文件,可以用對文件的操作函數來操作設備.

設備可以分爲字符設備和塊設備,前者只能一次讀寫一個字符,後者可以讀寫某一長度的數據塊.


設備驅動程序

一般設備都會有一個驅動程序,它知道如何啓動,關閉和操作該設備,例如磁帶機的驅動程序知道磁帶必須以固定長度的數據塊進行讀寫,知道如何迴繞到正確位置.

驅動程序封裝了所有與該設備有關的特性.


內核

內核由多個必要的設備驅動程序組成,它是一組可能用到的硬件驅動程序的組合,如磁盤驅動程序+顯卡驅動程序+網卡驅動程序等等.內核爲應用程序提供安全訪問.


系統調用

內核爲應用程序提供安全訪問是通過系統調用實現的,它將硬件驅動封裝起來,爲上層開放一組函數,這組函數被稱爲系統調用.前面的open(),close(),read(),write(),ioctl()都是系統調用函數.


操作系統庫函數

在輸入/輸出操作中,直接用底層系統調用的效率是很低的,因爲:

1.系統調用會影響系統性能;與函數調用相比,系統調用開銷要大些,系統調用時linux必從用戶代碼切換到內核代碼,然後再返回用戶代碼.減少這種開銷的方法是儘量減少系統調用的次數且讓每次調用完成儘可能多的任務.

2.硬件會對底層系統調用一次讀寫的數據量進行限制,例如磁帶機一次通常只能寫10KB.

爲了給設備和磁盤文件提供更高層的接口,linux發行版提供了一系列的標準庫函數.例如提供輸入/輸出緩衝的標準I/O庫,使用它包含的fread(),fwrite()就能夠讀寫任意長度的數據塊.

標準C中與標準I/O庫對應的頭文件就是我們熟悉的stdio.h文件.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章