先列一下Linux系統開發要掌握的知識,以後有時間再一一介紹。
歡迎關注我的微信公衆号:fensnote
文章目錄
-
-
- Linux系統開發會用到什麼?
-
- C語言基礎
- shell腳本
- 學會使用Makefile
- 正常Linux系統程式設計知識都有什麼?哪些常用?哪些不常用?
-
- 正常Linux程式設計知識
-
- 檔案IO
- 檔案與目錄操作
- 标準IO庫
- 程序控制
- 線程程式設計
- 進階IO
- 程序間通信
- 資料庫
- 序列槽程式設計
- 網絡程式設計
- 結束語
-
Linux系統開發會用到什麼?
C語言基礎
Linux系統核心是C語言編寫的,是以,Linux系統開發可能會和很多系統API打交道,需要掌握C語言基礎,C語言是Linux最基礎的開發語言,當然也可以用C++。一般做與系統互動的子產品時,用C語言多一些,做上層業務應用時,為了開發效率,會使用C++來開發,畢竟C++是面向對象的開發語言,适合大型項目的開發,友善子產品化,代碼複用率高。
shell腳本
shell腳本,也就是使用Linux系統下的一系列指令,有機組合在一起,而完成預期的功能。Linux設計思想是“小即是美”,這一思想是shell腳本程式設計的完美展現。每個指令隻完成一種功能,不同的指令組合在一起,卻可以實作複雜的功能。做Linux下開發,免不了要與腳本打交道(比如測試、分析資料等)。
學會使用Makefile
Makefile是Linux程式開發時必不可少的編譯管理腳本,這個裡面東西也很多,不過剛開始可以簡單看看,夠用就行,随着項目的越做越大,代碼檔案與目錄越來越複雜,這時候的Makefile可能就會複雜一些,牽扯到不同目錄的Makefile的互相調用或者協調。
比如嵌入式系統中,一般不止一個應用程式,可能會有多個程式,在整體編譯時,會包括如下内容:
- 各個應用程式子產品的編譯(需要判斷是否編譯成功,出現編譯失敗的情況停下來,抛出錯誤資訊)
- 應用程式打包(做成壓縮包或者分區鏡像)
- 預設配置檔案打包
- uboot、核心、檔案系統、應用程式整體打包成一個鏡像檔案,大小對應flash分區的大小(大小不足需要填充空資料,保證與分區對應)。
- 自動版本管理,在編譯完成,打包完成後,可以通過腳本來自動根據時間生成版本号。
這些東西做起來其實挺複雜的,需要Makefile與shell腳本搭配完成。
正常Linux系統程式設計知識都有什麼?哪些常用?哪些不常用?
正常Linux程式設計知識
檔案IO
比較常用
Linux系統下,所有的資源都是以檔案的形式通路的,裝置被抽象為裝置檔案,放于/dev目錄下。
基本的通路函數:
函數名 | 簡介 | 一般怎麼用 |
---|---|---|
open | 打開裝置檔案 | 通路裝置檔案,首先要先打開裝置 |
close | 關閉裝置檔案 | 檔案通路結束後,需要調用該接口,如果不關閉,會造fb耗盡 |
read | 讀取資料 | 讀取資料,可以是文本檔案内容,也可以是攝像頭資料等 |
write | 寫入資料 | 向裝置寫資料,比如序列槽通信時,可以用write發送資料 |
ioctl | IO操作函數 | 該函數功能比較多,被稱作雜物箱~,可以讀、寫資料,做驅動的同學應該很了解 |
fcntl | 屬性設定函數 | 對已經打開的裝置,設定屬性,比如可以設定序列槽讀資料的阻塞和非阻塞屬性 |
lseek | 改變偏移量 | 一般用于對已打開的檔案讀寫位置的偏移量修改 |
檔案與目錄操作
常用
系統程式設計少不了檔案與目錄的通路,比如你要讀取某個目錄下的所有檔案名字,或者修改檔案名、修改目錄,移動檔案等等。
函數名 | 簡介 | 一般怎麼用 |
---|---|---|
stat、 fstat 、lstat | 擷取檔案狀态 | 可以擷取到檔案的建立、通路時間,檔案大小等 |
access | 檢測檔案屬性 | 常用于判斷檔案是否存在 |
chmod | 修改檔案權限 | 一般涉及到檔案通路權限修改時,會用到,比如增加可執行權限 |
mkdir | 建立目錄 | 一般在程式裡判斷到需要用到的目錄不存在時,用此函數建立 |
rmdir | 删除目錄 | 需要删除目錄時使用,一般很少用到 |
opendir | 打開目錄 | 在讀取目錄資訊之前,需要先打開目錄(類中與檔案通路) |
readdir | 讀取目錄内容 | 在檢索檔案時,會用到,讀取目錄下檔案清單 |
closedir | 關閉目錄 | 在讀取完成後,記得關閉目錄 |
sync | 同步資料到磁盤 | 這個函數一般在修改檔案,寫入資料後調用,讓系統把資料同步到磁盤 |
标準IO庫
比較常用
所謂标準IO庫,其實是C語言裡的檔案IO,另外這裡面的IO與前面提到的“檔案IO”在檔案的讀寫上有個差別,标準IO是有緩存的,而Linux系統的檔案IO函數是無緩存的。
主要是檔案操作函數:
函數名 | 簡介 | 一般怎麼用 |
---|---|---|
fopen | 打開檔案 | 放檔案檔案前先調用fopen擷取檔案句柄 |
fclose | 關閉檔案 | 檔案通路結束後,記得關閉檔案,否則造成記憶體洩露 |
fread | 讀取檔案 | 讀取檔案資料 |
fseek | 修改檔案讀寫位置 | 用于修改檔案讀寫的位置偏移量 |
程序控制
一般
如果你不使用多程序程式設計的話,這一項可能就用的不多,我的代碼裡用的也不是太多。
這個知識點主要是程序的建立、子程序管理、程序退出資源釋放等等。
線程程式設計
比較常用
上了系統,一般跑的任務就會比較多,線程是比較常用的,一般可以分為兩種,一種是長時間運作的任務,一種是執行完任務自行退出。現在C++11已經支援了線程,使用起來非常友善。之前沒有C++11時,為了友善使用,都是對pthrea_簇函數進行了二次封裝。
進階IO
常用
可能你會比較奇怪,為什麼這麼多“IO”相關的東西:檔案IO、标準檔案IO、進階IO!
是的,這裡的IO比較多,前兩個“IO”還有點相似,這個進階IO和前面兩個有點不太一樣。
進階IO裡主要是講的IO操作的方式:阻塞、非阻塞控制,最主要的是通過select和poll實作IO多路複用,這樣可以實作程式的異步執行。現在用的比較多的Nginx,就是使用的epoll模型,實作的高并發。
程序間通信
非常常用
一般在linux系統下面,既然是系統,就不止一個應用程式在運作,那多個應用程式,就會需要資料互動,那麼,就用到了程序間通信,程序間通信有許多開源的工具(比如DBUS),這裡簡單介紹一下系統裡提供的通信方式:
名稱 | 簡介 |
---|---|
管道 | 一般用于父子程序間通信,有名管道可以跨程式 |
消息隊列 | 消息隊列可以分類型,适用于資料量小的,簡單通信 |
信号量 | PV操作,用于同步,可以與共享記憶體搭配用,寫完資料,告訴另一個線程可以讀取了 |
共享記憶體 | 适用于大資料量的傳輸 |
socket | socke不僅是網絡通信的接口,也可以是本地程序間通信(UNIX socke),這種方式很常用 |
資料庫
常用
如果是存儲配置參數,我不太推薦用資料庫,用json就挺好。資料一般用于存儲比較規則的資料,這樣友善資料的管理。在嵌入式系統,用的比較多的是sqlite資料庫。
序列槽程式設計
比較常用
在Linux下,特别是做嵌入式系統,這個可能是少不了的,比較常用。其實序列槽程式設計也很簡單,可能200行代碼就可以把序列槽通信建立起來了。應用層的資料通信,就是使用write、和read函數操作,但是如果想做的比較好一些,就需要花點時間去做個軟體架構,比如利用前面提到的select實作異步操作(後面文章會介紹實作方式以及序列槽的封裝)。
網絡程式設計
超級常用
相信現在的嵌入式裝置基本上都需要網絡通信功能,是以,網絡程式設計自然是非常常用的。特備是現在物聯網的發展,萬物互聯。Linux下的網絡程式設計,有一系列的API函數,挺多的,參數配置也比較多,剛開始會讓人很頭疼,不知道哪個參數設定個什麼值合适(我們都是慢慢試錯試出來的)。這個也不用擔心,我後面會給大家分享出來我用C++封裝好的網絡通信庫,包括TCP、UPD、UDP多點傳播、域套接字(本地)等的封裝。
結束語
以後有時間再介紹,歡迎大家關注。
微信公衆号:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cscXTq1Ee4wmYoZFWjFDZzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcukTMxQjN0ADMyEzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)