一文搞懂Linux系統(tǒng)開發(fā)(linux 系統(tǒng)開發(fā))
文章目錄
Linux系統(tǒng)開發(fā)會用到什么?
C語言基礎(chǔ)
shell腳本
慢慢學(xué)會使用Makefile
常規(guī)Linux系統(tǒng)編程知識都有什么?哪些常用?哪些不常用?
常規(guī)Linux編程知識
文件IO
文件與目錄操作
標(biāo)準(zhǔn)IO庫
進(jìn)程控制
線程編程
高級IO
進(jìn)程間通信
數(shù)據(jù)庫
串口編程
網(wǎng)絡(luò)編程
結(jié)束語
Linux系統(tǒng)開發(fā)會用到什么?
C語言基礎(chǔ)
Linux系統(tǒng)內(nèi)核是C語言編寫的,所以,Linux系統(tǒng)開發(fā)可能會和很多系統(tǒng)API打交道,需要掌握C語言基礎(chǔ),C語言是Linux最基礎(chǔ)的開發(fā)語言,當(dāng)然也可以用C 。一般做與系統(tǒng)交互的模塊時(shí),用C語言多一些,做上層業(yè)務(wù)應(yīng)用時(shí),為了開發(fā)效率,會使用C 來開發(fā),畢竟C 是面向?qū)ο蟮拈_發(fā)語言,適合大型項(xiàng)目的開發(fā),方便模塊化,代碼復(fù)用率高。
shell腳本
shell腳本,也就是使用Linux系統(tǒng)下的一系列命令,有機(jī)組合在一起,而完成預(yù)期的功能。Linux設(shè)計(jì)思想是“小即是美”,這一思想是shell腳本編程的完美體現(xiàn)。每個(gè)命令只完成一種功能,不同的命令組合在一起,卻可以實(shí)現(xiàn)復(fù)雜的功能。做Linux下開發(fā),免不了要與腳本打交道(比如測試、分析數(shù)據(jù)等)。
慢慢學(xué)會使用Makefile
Makefile是Linux程序開發(fā)時(shí)必不可少的編譯管理腳本,這個(gè)里面東西也很多,不過剛開始可以簡單看看,夠用就行,隨著項(xiàng)目的越做越大,代碼文件與目錄越來越復(fù)雜,這時(shí)候的Makefile可能就會復(fù)雜一些,牽扯到不同目錄的Makefile的相互調(diào)用或者協(xié)調(diào)。
比如嵌入式系統(tǒng)中,一般不止一個(gè)應(yīng)用程序,可能會有多個(gè)程序,在整體編譯時(shí),會包括如下內(nèi)容:
各個(gè)應(yīng)用程序模塊的編譯(需要判斷是否編譯成功,出現(xiàn)編譯失敗的情況停下來,拋出錯(cuò)誤信息)
應(yīng)用程序打包(做成壓縮包或者分區(qū)鏡像)
默認(rèn)配置文件打包
uboot、內(nèi)核、文件系統(tǒng)、應(yīng)用程序整體打包成一個(gè)鏡像文件,大小對應(yīng)flash分區(qū)的大?。ù笮〔蛔阈枰畛淇諗?shù)據(jù),保證與分區(qū)對應(yīng))。
自動(dòng)版本管理,在編譯完成,打包完成后,可以通過腳本來自動(dòng)根據(jù)時(shí)間生成版本號。
這些東西做起來其實(shí)挺復(fù)雜的,需要Makefile與shell腳本搭配完成。
常規(guī)Linux系統(tǒng)編程知識都有什么?哪些常用?哪些不常用?
常規(guī)Linux編程知識
文件IO
比較常用
Linux系統(tǒng)下,所有的資源都是以文件的形式訪問的,設(shè)備被抽象為設(shè)備文件,放于/dev目錄下。
基本的訪問函數(shù):
函數(shù)名 簡介 一般怎么用
open 打開設(shè)備文件 訪問設(shè)備文件,首先要先打開設(shè)備
close 關(guān)閉設(shè)備文件 文件訪問結(jié)束后,需要調(diào)用該接口,如果不關(guān)閉,會造fb耗盡
read 讀取數(shù)據(jù) 讀取數(shù)據(jù),可以是文本文件內(nèi)容,也可以是攝像頭數(shù)據(jù)等
write 寫入數(shù)據(jù) 向設(shè)備寫數(shù)據(jù),比如串口通信時(shí),可以用write發(fā)送數(shù)據(jù)
ioctl IO操作函數(shù) 該函數(shù)功能比較多,被稱作雜物箱~,可以讀、寫數(shù)據(jù),做驅(qū)動(dòng)的同學(xué)應(yīng)該很了解
fcntl 屬性設(shè)置函數(shù) 對已經(jīng)打開的設(shè)備,設(shè)置屬性,比如可以設(shè)置串口讀數(shù)據(jù)的阻塞和非阻塞屬性
lseek 改變偏移量 一般用于對已打開的文件讀寫位置的偏移量修改
文件與目錄操作
常用
系統(tǒng)編程少不了文件與目錄的訪問,比如你要讀取某個(gè)目錄下的所有文件名字,或者修改文件名、修改目錄,移動(dòng)文件等等。
函數(shù)名 簡介 一般怎么用
stat、 fstat 、lstat 獲取文件狀態(tài) 可以獲取到文件的創(chuàng)建、訪問時(shí)間,文件大小等
access 檢測文件屬性 常用于判斷文件是否存在
chmod 修改文件權(quán)限 一般涉及到文件訪問權(quán)限修改時(shí),會用到,比如增加可執(zhí)行權(quán)限
mkdir 創(chuàng)建目錄 一般在程序里判斷到需要用到的目錄不存在時(shí),用此函數(shù)創(chuàng)建
rmdir 刪除目錄 需要?jiǎng)h除目錄時(shí)使用,一般很少用到
opendir 打開目錄 在讀取目錄信息之前,需要先打開目錄(類中與文件訪問)
readdir 讀取目錄內(nèi)容 在檢索文件時(shí),會用到,讀取目錄下文件列表
closedir 關(guān)閉目錄 在讀取完成后,記得關(guān)閉目錄
sync 同步數(shù)據(jù)到磁盤 這個(gè)函數(shù)一般在修改文件,寫入數(shù)據(jù)后調(diào)用,讓系統(tǒng)把數(shù)據(jù)同步到磁盤
標(biāo)準(zhǔn)IO庫
比較常用
所謂標(biāo)準(zhǔn)IO庫,其實(shí)是C語言里的文件IO,另外這里面的IO與前面提到的“文件IO”在文件的讀寫上有個(gè)區(qū)別,標(biāo)準(zhǔn)IO是有緩存的,而Linux系統(tǒng)的文件IO函數(shù)是無緩存的。
主要是文件操作函數(shù):
函數(shù)名 簡介 一般怎么用
fopen 打開文件 放文件文件前先調(diào)用fopen獲取文件句柄
fclose 關(guān)閉文件 文件訪問結(jié)束后,記得關(guān)閉文件,否則造成內(nèi)存泄露
fread 讀取文件 讀取文件數(shù)據(jù)
fseek 修改文件讀寫位置 用于修改文件讀寫的位置偏移量
進(jìn)程控制
一般
如果你不使用多進(jìn)程編程的話,這一項(xiàng)可能就用的不多,我的代碼里用的也不是太多。
這個(gè)知識點(diǎn)主要是進(jìn)程的創(chuàng)建、子進(jìn)程管理、進(jìn)程退出資源釋放等等。
線程編程
比較常用
上了系統(tǒng),一般跑的任務(wù)就會比較多,線程是比較常用的,一般可以分為兩種,一種是長時(shí)間運(yùn)行的任務(wù),一種是執(zhí)行完任務(wù)自行退出。現(xiàn)在C 11已經(jīng)支持了線程,使用起來非常方便。之前沒有C 11時(shí),為了方便使用,都是對pthrea_簇函數(shù)進(jìn)行了二次封裝。
高級IO
常用
可能你會比較奇怪,為什么這么多“IO”相關(guān)的東西:文件IO、標(biāo)準(zhǔn)文件IO、高級IO!
是的,這里的IO比較多,前兩個(gè)“IO”還有點(diǎn)相似,這個(gè)高級IO和前面兩個(gè)有點(diǎn)不太一樣。
高級IO里主要是講的IO操作的方式:阻塞、非阻塞控制,最主要的是通過select和poll實(shí)現(xiàn)IO多路復(fù)用,這樣可以實(shí)現(xiàn)程序的異步執(zhí)行?,F(xiàn)在用的比較多的Nginx,就是使用的epoll模型,實(shí)現(xiàn)的高并發(fā)。
進(jìn)程間通信
非常常用
一般在linux系統(tǒng)下面,既然是系統(tǒng),就不止一個(gè)應(yīng)用程序在運(yùn)行,那多個(gè)應(yīng)用程序,就會需要數(shù)據(jù)交互,那么,就用到了進(jìn)程間通信,進(jìn)程間通信有許多開源的工具(比如DBUS),這里簡單介紹一下系統(tǒng)里提供的通信方式:
名稱 簡介
管道 一般用于父子進(jìn)程間通信,有名管道可以跨程序
消息隊(duì)列 消息隊(duì)列可以分類型,適用于數(shù)據(jù)量小的,簡單通信
信號量 PV操作,用于同步,可以與共享內(nèi)存搭配用,寫完數(shù)據(jù),告訴另一個(gè)線程可以讀取了
共享內(nèi)存 適用于大數(shù)據(jù)量的傳輸
socket socke不僅是網(wǎng)絡(luò)通信的接口,也可以是本地進(jìn)程間通信(UNIX socke),這種方式很常用
數(shù)據(jù)庫
常用
如果是存儲配置參數(shù),我不太推薦用數(shù)據(jù)庫,用json就挺好。數(shù)據(jù)一般用于存儲比較規(guī)則的數(shù)據(jù),這樣方便數(shù)據(jù)的管理。在嵌入式系統(tǒng),用的比較多的是sqlite數(shù)據(jù)庫。
串口編程
比較常用
在Linux下,特別是做嵌入式系統(tǒng),這個(gè)可能是少不了的,比較常用。其實(shí)串口編程也很簡單,可能200行代碼就可以把串口通信建立起來了。應(yīng)用層的數(shù)據(jù)通信,就是使用write、和read函數(shù)操作,但是如果想做的比較好一些,就需要花點(diǎn)時(shí)間去做個(gè)軟件框架,比如利用前面提到的select實(shí)現(xiàn)異步操作(后面文章會介紹實(shí)現(xiàn)方式以及串口的封裝)。
網(wǎng)絡(luò)編程
超級常用
相信現(xiàn)在的嵌入式設(shè)備基本上都需要網(wǎng)絡(luò)通信功能,所以,網(wǎng)絡(luò)編程自然是非常常用的。特備是現(xiàn)在物聯(lián)網(wǎng)的發(fā)展,萬物互聯(lián)。Linux下的網(wǎng)絡(luò)編程,有一系列的API函數(shù),挺多的,參數(shù)配置也比較多,剛開始會讓人很頭疼,不知道哪個(gè)參數(shù)設(shè)置個(gè)什么值合適(我們都是慢慢試錯(cuò)試出來的)。這個(gè)也不用擔(dān)心,我后面會給大家分享出來我用C 封裝好的網(wǎng)絡(luò)通信庫,包括TCP、UPD、UDP組播、域套接字(本地)等的封裝。
結(jié)束語
————————————————
版權(quán)聲明:本文為CSDN博主「fensnote」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wuquan_1230/article/details/104808817