一文搞懂Linux系統開發

先列一下Linux系統開發要掌握的知識,後續的文章中,會一 一講解。
歡迎關注我的微信公衆號:fensnote

Linux系統開發會用到什麼?

C語言基礎

Linux系統內核是C語言編寫的,所以,Linux系統開發可能會和很多系統API打交道,需要掌握C語言基礎,C語言是Linux最基礎的開發語言,當然也可以用C++。一般做與系統交互的模塊時,用C語言多一些,做上層業務應用時,爲了開發效率,會使用C++來開發,畢竟C++是面向對象的開發語言,適合大型項目的開發,方便模塊化,代碼複用率高。

shell腳本

shell腳本,也就是使用Linux系統下的一系列命令,有機組合在一起,而完成預期的功能。Linux設計思想是“小即是美”,這一思想是shell腳本編程的完美體現。每個命令只完成一種功能,不同的命令組合在一起,卻可以實現複雜的功能。做Linux下開發,免不了要與腳本打交道(比如測試、分析數據等)。

慢慢學會使用Makefile

Makefile是Linux程序開發時必不可少的編譯管理腳本,這個裏面東西也很多,不過剛開始可以簡單看看,夠用就行,隨着項目的越做越大,代碼文件與目錄越來越複雜,這時候的Makefile可能就會複雜一些,牽扯到不同目錄的Makefile的相互調用或者協調。
比如嵌入式系統中,一般不止一個應用程序,可能會有多個程序,在整體編譯時,會包括如下內容:

  1. 各個應用程序模塊的編譯(需要判斷是否編譯成功,出現編譯失敗的情況停下來,拋出錯誤信息)
  2. 應用程序打包(做成壓縮包或者分區鏡像)
  3. 默認配置文件打包
  4. uboot、內核、文件系統、應用程序整體打包成一個鏡像文件,大小對應flash分區的大小(大小不足需要填充空數據,保證與分區對應)。
  5. 自動版本管理,在編譯完成,打包完成後,可以通過腳本來自動根據時間生成版本號。

這些東西做起來其實挺複雜的,需要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組播、域套接字(本地)等的封裝。

結束語

後續準備按照今天列出的這幾項內容,在後面的文章一一介紹,歡迎大家關注跟進。

微信公衆號:
在這裏插入圖片描述

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