1.阻塞和非阻塞的區別
阻塞的定義:
對於read,block指當串列埠輸入緩衝區沒有資料的時候,read函式將會阻塞在這裡,移植到串列埠輸入緩衝區中有資料可讀取,read讀到了需要的位元組數之後,返回值為讀到的位元組數;
對於write,block指當串列埠輸出緩衝區滿,或剩下的空間小於將要寫入的位元組數,則write將阻塞,一直到串列埠輸出緩衝區中剩下的空間大於等於將要寫入的位元組數,執行寫入操作,返回寫入的位元組數。
非阻塞的定義:
對於read,no block指當串列埠輸入緩衝區沒有資料的時候,read函式立即返回,返回值為0。
2.open函式
標頭檔案
#include
#include
#include
定義函式
int
open(
const
char
*pathname,
int
flags);
int
open(
const
char
*pathname,
int
flags,mode_tmode);
fifo和pipe的區別在於:
fifo在檔案系統中有對應的inode,可以通過ls命令檢視。
sh-3.2# ls -lhf 。/fifo_file
100 prwxrwxrwx 1 root root 0 jan 1 1970 。/fifo_file|
sh-3.2#
正因為它有乙個名字,所以任何程序都可以訪問它,所以fifo可用於任意兩個程序之間的通訊。
pipe沒有名字,在現有檔案系統中無法檢視到它的存在。
它只能用於父子程序、兄弟程序等具有血緣關係的程序間通訊。
裝置檔案中的塊裝置檔案和字元裝置檔案的區別?
裝置檔案分為block
device driver和character device drive兩類。character device drive又被稱為字元裝置或裸裝置raw
devices; block device driver通常成為塊裝置。而block device driver是以固定大小長度來傳送轉移資料
;character device driver是以不定長度的字元傳送資料 。且所連線的devices也有所不同,block
device大致是可以隨機訪問(random access)資料的裝置,如硬碟機或光碟機;而character
device剛好相反,依循先後順序訪問資料的裝置,如印表機 、終端機等皆是。
/dev/dsk對應的為塊裝置,檔案系統的操作用到它,如mount。/dev/rdsk對應的為字元裝置(裸裝置,rdsk的r即為 raw),fsck
newfs等會涉及到。一般我們的作業系統和各種軟體都是以塊方式讀寫硬碟,這裡的塊是邏輯塊,建立檔案系統時可以選擇,windows裡叫簇。可看 newfs or
mkfs的manual。oracle是比較常見的字元方式讀寫硬碟。
字元裝置還是塊裝置的定義屬於作業系統的裝置訪問層,與實際物理裝置的特性無必然聯絡。裝置訪問層下面是驅動程式,所以只要驅動程式提供的方式,都可以。也就是說驅動程式支援stream方式,那麼就可以用這種方式訪問,驅動程式如果還支援block方式,那麼你想用哪種方式訪問都可以,典型的比如硬碟式的裸裝置,兩種都支援塊裝置(block
device):是一種具有一定結構的隨機訪問裝置,對這種裝置的讀寫是按塊進行的,他使用緩衝區來存放暫時的資料,待條件成熟後,從快取一次性寫入裝置或從裝置中一次性讀出放入到緩衝區,如磁碟和檔案系統等字元裝置(character
device):這是乙個順序的資料流裝置,對這種裝置的讀寫是按字元進行的,而且這些字元是連續地形成乙個資料流。他不具備緩衝區,所以對這種裝置的讀寫是實時的,如終端、磁帶機等。
系統中能夠隨機(不需要按順序)訪問固定大小資料片(chunks)的裝置被稱作塊裝置,這些資料片就稱作塊。最常見的塊裝置是硬碟,除此以外,還有軟盤驅動器、cd-rom驅動器和快閃儲存器等等許多其他塊裝置。注意,它們都是以安裝檔案系統的方式使用的——這也是塊裝置一般的訪問方式。
另一種基本的裝置型別是字元裝置。字元裝置按照字元流的方式被有序訪問,像串列埠和鍵盤就都屬於字元裝置。如果乙個硬體裝置是以字元流的方式被訪問的話,那就應該將它歸於字元裝置;反過來,如果乙個裝置是隨機(無序的)訪問的,那麼它就屬於塊裝置。
這兩種型別的裝置的根本區別在於它們是否可以被隨機訪問——換句話說就是,能否在訪問裝置時隨意地從乙個位置跳轉到另乙個位置。舉個例子,鍵盤這種裝置提供的就是乙個資料流,當你敲入「fox」這個字串時,鍵盤驅動程式會按照和輸入完全相同的順序返回這個由三個字元組成的資料流。如果讓鍵盤驅動程式打亂順序來讀字串,或讀取其他字元,都是沒有意義的。所以鍵盤就是一種典型的字元裝置,它提供的就是使用者從鍵盤輸入的字元流。對鍵盤進行讀操作會得到乙個字元流,首先是「f」,然後是「o」,最後是「x」,最終是檔案的結束(eof)。當沒人敲鍵盤時,字元流就是空的。硬碟裝置的情況就不大一樣了。硬碟裝置的驅動可能要求讀取磁碟上任意塊的內容,然後又轉去讀取別的塊的內容,而被讀取的塊在磁碟上位置不一定要連續,所以說硬碟可以被隨機訪問,而不是以流的方式被訪問,顯然它是乙個塊裝置。
核心管理塊裝置要比管理字元裝置細緻得多,需要考慮的問題和完成的工作相比字元裝置來說要複雜許多。這是因為字元裝置僅僅需要控制乙個位置—當前位置—而塊裝置訪問的位置必須能夠在介質的不同區間前後移動。所以事實上核心不必提供乙個專門的子系統來管理字元裝置,但是對塊裝置的管理卻必須要有乙個專門的提供服務的子系統。不僅僅是因為塊裝置的複雜性遠遠高於字元裝置,更重要的原因是塊裝置對執行效能的要求很高;對硬碟每多一分利用都會對整個系統的效能帶來提公升,其效果要遠遠比鍵盤吞吐速度成倍的提高大得多。另外,我們將會看到,塊裝置的複雜性會為這種優化留下很大的施展空間。
linux驅動程式中字元裝置和塊裝置的三點區別
1.字元裝置只能以位元組為最小單位訪問,而塊裝置以塊為單位訪問,例如512位元組,1024位元組等
2.塊裝置可以隨機訪問,但是字元裝置不可以
3.字元和塊沒有訪問量大小的限制,塊也可以以位元組為單位來訪問
嵌入式開發必備知識點
一.c語言 結構體struct 聯合union 指標巨集定義 預編譯 動態記憶體分配 malloc和calloc函式申請記憶體空間 delete 記憶體洩漏 變數的生命週期 static關鍵字 函式指標 鍊錶 雙向鍊錶 佇列 fifo 樹二.51微控制器 定時器 計數器原理 什麼暫存器 外部中斷 串...
嵌入式小知識點
1 stm32的boot0和boot1管腳 在每個stm32的晶元上都有兩個管腳boot0和boot1,這兩個管腳在晶元復位時的電平狀態決定了晶元復位後從哪個區域開始執行程式,見下表 boot1 x boot0 0 從使用者快閃儲存器啟動,這是正常的工作模式。boot1 0 boot0 1 從系統儲...
傳統開發與嵌入式開發相關知識點
1 微處理器 微控制器 dsp stm32 plc 2 傳統開發的缺點 軟體的移植性差 換乙個平台或許就不能用 軟體開發人員必須懂硬體。3 傳統開發與嵌入式的區別 是否有作業系統的參與 在軟體與硬體層移植了作業系統 移植 修改作業系統的原碼 4 嵌入式開發的優點 解決了軟體的移植性 軟體開發人員不需...