天天看點

一文搞懂Linux系統開發

先列一下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的互相調用或者協調。

比如嵌入式系統中,一般不止一個應用程式,可能會有多個程式,在整體編譯時,會包括如下内容:

  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多點傳播、域套接字(本地)等的封裝。

結束語

以後有時間再介紹,歡迎大家關注。

微信公衆号:

一文搞懂Linux系統開發

繼續閱讀