




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、菲 菱 科 思 內 部 資 料 , 注 意 保 密菲 菱 科 思 內 部 資 料 , 注 意 保 密LinuxLinux編程知識編程知識主要內容 Linux編程的風格及與編程的風格及與COMWARE的比較的比較 Linux程序的常見概念程序的常見概念 Linux Make的使用的使用Linux編程的風格編程的風格變量類型:Linux的更直觀:u_int32_t VS ULONG變量命名:Linux采用全小寫,簡短,但對英語要求較高COMWARE;采用的是匈牙利命名法,容易理解,但長度較長控制塊的使用:COMWARE是強制要求if、else等后面必須有,不容易出錯;而Linux是能不用則不用,且
2、盡量多容納有效行函數返回值:功能性的函數,Linux一般是0返回正確,小于0的是出錯;COMWARE是VOS_OK正確,VOS_ERR錯誤常數的使用:Linux使用常數的地方較多,需聯系上下文才能看懂;COMWARE是提倡用有意義的宏來代替,能夠顧名思義.Linux用的是最新gcc編譯器,支持C99,可變宏、更多的關鍵字,等等,編碼更靈活;COMWARE僅支持ANSI C89總之,Linux是天才們的編碼,更追求技術;COMWARE是普通人的編碼,更追求穩定Linux程序的常見概念程序的常見概念(一一)進程:亦可稱為任務。Linux下的進程互不影響,各自使用獨立的空間,由CPU、OS共同負責內
3、存保護、任務切換;COMWARE使用相同的地址空間,能夠互相訪問,因此也會發生踩內存的現象。COMWARE下啟動任務是VOS_T_Create函數,通常是任務A調用該函數來啟動B,兩者代碼通常不相同。Linux是fork函數來啟動子進程。通常返回值PID來區分:1、返回值是0,則是子進程,子進程可以通過getpid來獲取自身PID2、返回值是-1,表明創建任務出錯3、其它,則是父進程,并得到了子進程的PIDLinux程序的常見概念程序的常見概念(一一)fork代碼常見形式: . if ( (pid = fork() = 0 ) /* Child process */ else if (pid
4、= -1) /* Error Handler */ else /* Parent process */ .Linux程序的常見概念程序的常見概念(二二)線程:可以說是輕量級的進程。創建一個線程比創建一個進程的開銷少得多。同一個進程下的線程可以共享父進程的所有資源,很方便地實現線程間的通訊。COMWARE不支持。Linux下用得也較少。Windows下用得最多。線程通常是用來UI和Function分離:主線程負責從圖形化界面上接收用戶的數據,并將其傳給對應的子線程。子線程負責接收數據并計算,并將結果返回給主線程,由主線程顯示給用戶。好處:避免了長時間的計算,用戶無法進行控制。缺點:編碼時需要考慮
5、同步、互斥的問題。Miniware短時間內不會用到線程。有興趣的可參考pthread_createLinux程序的常見概念程序的常見概念(三三)共享鏈接庫:共享一份代碼,數據各自獨立,更常用的是COW-Copy on Write與可執行文件的區別:不能直接運行,不需要main函數編譯共享鏈接庫時,需要使用-fPIC和-shared別的程序要使用,編碼時需要提供頭文件,聲明各函數;鏈接時,需要-L給出鏈接庫的目錄以及-l給出鏈接庫的名稱程序運行時,由OS負責裝入-fPIC:Position-Independent Code:Access all constant addresses throug
6、h a Global Offset Table與靜態庫的區別:靜態庫的代碼是編譯鏈接時使用,而且用哪些鏈接哪些,使用一次鏈接一次,編譯鏈接后直接存在于可執行文件中,類似于C語言中的#define;共享鏈接庫是運行時加載,鏈接時放在可執行文件的是文件名和代碼起始地址(或函數名),類似于C語言的函數調用Linux程序的常見概念程序的常見概念(三三)對于Miniware來說,靜態庫的代碼已經是vmlinux.64文件中可執行文件的一部分;而共享鏈接庫的代碼則是vmlinux.64文件中不可執行的文件,放在ram fs,執行時才會用到。COMWARE沒有共享鏈接庫的說法。Linux還可以動態加載共享鏈
7、接庫,但需要程序員的額外編碼。避免了一開始就加載,但后續用不到的浪費(比如if分支加載不同的動態鏈接庫)。Linux下是dlopen、dlsym;Miniware基本不需要用到該特性。Linux程序的常見概念程序的常見概念(四四)信號量:用于訪問全局資源的互斥、進程間同步的手段。本質是非負的整數計數器。使用者在訪問全局資源前,首先需要去獲取一個信號,如果計數器大于0,則使用者可以獲取成功;否則的話,使用者的任務將會被掛起;獲取信號量成功后,可以開始訪問全局資源;訪問結束后,應當及時釋放,使得在其上面阻塞的任務能夠盡快得到調度。如果計數器初始化為1,且只有兩個競爭者,則是互斥的典型現象。Linu
8、x程序的常見概念程序的常見概念(四四)sem_init:用于初始化一個信號量sem_wait:獲取信號量,如果計數器當前大于0,則獲取成功,否則任務被掛起sem_trywait:獲取信號號,與sem_wait的區別是獲取不成功,不會被掛起sem_post:釋放信號量,訪問全局資源后,應當及時釋放上述函數僅用于Linux線程間的同步Linux程序的常見概念程序的常見概念(四四)semget:用于初始化一個信號量semop:操作一個信號量,獲取還是釋放semctl:控制一個信號量,通常初始化初值或者釋放信號量所使用的內核資源上述函數可用于Linux進程間的同步Linux程序的常見概念程序的常見概念
9、(四四)#define MY_KEY 5555struct sembuf operation1 ;union semun int val; struct semid_ds *buf; USHORT *array; semctl_arg,ignored_argument;int semidsemid = semget(MY_KEY, 1, IPC_CREATE);/Set Initial value for the resource - initially one process ownedsemctl_arg.val = 1; /Setting semval to 1semctl(semid,
10、 0, SETVAL, semctl_arg);Linux程序的常見概念程序的常見概念(四四)/ get semaphoreoperation0.sem_op = -1;operation0.sem_num = 0;operation0.sem_flg = IPC_WAIT;semop(semid, operation,1);/ access global shared resource/ release semaphoreoperation0.sem_op = 1;operation0.sem_num = 0;operation0.sem_flg = IPC_WAITsemop(semid,
11、 operation,0);/ close semaphoresemctl(semid, 1, IPC_RMID , ignored_argument);Linux程序的常見概念程序的常見概念(四四)內核的鎖:通常來說,內核很少會用到信號量,更多的是用到讀寫同步鎖使用宏DEFINE_RWLOCK(lockname)來定義一個鎖使用write_lock_bh、write_unlock_bh和read_lock_bh、read_lock_bh來上鎖、解鎖自旋鎖用得也很多:spin_lock、spin_unlockLinux程序的常見概念程序的常見概念(四四)COMWARE由于任務是互斥的,通常不必
12、考慮互斥,進程間通信基本是基于消息隊列Linux的System V是從Unix學習而來的,函數的控制參數多帶有IPC字段Windows的對信號量、事件、互斥量等,函數名、函數參數上各自獨立,有較好的理解性Linux程序的常見概念程序的常見概念(五五)共享內存:進程間通信的常用方法創建一塊共享內存:int shmget(key_t key,int size,int shmflg);其中key必須是唯一,并且這組進程調用該函數時,key必須相同。否則的話,得到的共享內存,也許屬于別的進程。shmflg通常是IPC_CREAT,表示不存在該共享內存時則創建,存在的話則去打開。除非失敗,否則都會得到該
13、內存的描述符Linux程序的常見概念程序的常見概念(五五)得到描述符后,通常調用shmat,把當前進程與該共享內存關聯起來。int shmat ( int shmid, char *shmaddr, int shmflg);后兩個參數通常填0shmaddr填0的話則系統自動去選擇系統一塊空閑內存與共享內存關聯起來。非0表示使用指定的內存地址,容易引起沖突返回值是這塊內存的起始地址,注意保存Linux程序的常見概念程序的常見概念(五五)不需要再使用時,shmdt將其引用計數釋放掉原型:int shmdt ( char *shmaddr )即使釋放到0,該內存也不會釋放,除非使用shmctl將其標
14、志為可移除int shmctl( int shmqid, int cmd, struct shmid_ds *buf )cmd為IPC_RMID,表示標志其為可移除Linux程序的常見概念程序的常見概念(五五)#define MY_KEY 55555#define MY_SIZE 2048/* Process 1 */shmid = shmget(MY_KEY, MY_SIZE, IPC_CREATE);char * p = (char *)shmat(shmid, 0, 0)/* 此時p指向該共享內存的起始地址,通過信號量或鎖,占住該資源后,即可往該內存里讀、寫 */.shmdt(p);/*
15、 釋放信號量或鎖 */Linux程序的常見概念程序的常見概念(五五)/* Process 2 */shmid = shmget(MY_KEY, MY_SIZE, IPC_CREATE);char * p = (char *)shmat(shmid, 0, 0)/* 此時p也指向該共享內存的起始地址,同樣地,通過信號量或鎖,占住該資源后,即可往該內存里讀、寫 */.shmdt(p);/* 釋放信號量或鎖 */兩個進程經過shmat、shmdt后,該內存的引用計數顯然是0,但該內存仍然不會被釋放。但進程1、2任意一個調用shmctl(shmid, IPC_RMID, &buf)后,該內存就
16、會被釋放,其中buf對于IPC_RMID總被忽略小結和展望小結和展望多學習,多看源碼.其實餓也不懂Make Linux下編譯工程的好幫手,能夠根據時間戳檢測到哪些.c文件需要重新編譯,鏈接 target . : prerequisites .command. 其中target、prerequisites可以是一個或多個file,都支持通配符,比如%.c表示以.c結束的文件名Make command前必須有一個t,否則的話,Make會報錯;同時command必須是shell命令 target、prerequisites、command都支持變量 Make還支持include,跟C語言類似;如果i
17、nclude的文件是一個target,那么target被更新后,這個文件還會被重新include進來Make Make支持變量,除在command外可以任意定義,用$(variable)即可得到變量值 內建的函數,比如wildcard,patsubst等等 還支持shell函數,調用shell命令,將其結果賦給變量,相當于平時在shell運行命令,得到的結果由輸出到屏幕變為賦值給變量Make gcc的-M命令,可以知道該.c文件依賴于哪些.h文件 這些頭文件包括標準的頭文件及用戶自定義的頭文件 如果編寫的是用戶態程序,可以使用-MM命令來得到依賴于哪些用戶自定義的頭文件Make 對于特殊后綴名
18、的文件,Make有其內建的目標依賴規則 比如.o文件 %.o : %.c$(CC) -c $(CFLAGS) $ -o $ 我們可以添加自己的目標依賴規則 %.d : %.ccommandMake Cavium上的makefile,與我們以前ARX9上的makefile大相徑庭,不需要告訴make,這個.c文件依賴于哪個.h文件,也不需要告訴如何編譯這個.c文件 這就是Make的魅力Make Cavium上自動編譯的Make簡化版: obj-y += -include $(obj-y:.c=.d) .PHONY: all all: ; %.d: %.c-rm $(CC) -M $(CPPFLAGS) $ $.$sed s,($*).o :*,1.o $ : ,g $-rm $.$Make 通過obj-y,得到需要編譯的所有.c文件,在Cavium上是分散在kernel各子目錄下的Makefile文件中 -include $(obj-y:.c=.d)首先把各個文件的后綴由.c變成.d,再include進來;前面加-,表示即使文件不存在,也不報錯退出 .PHONY: all all: ; 擺設而已,Make總需要一個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 信息處理技術員專業能力試題及答案
- 計算機網絡架構設計的原則與方法試題及答案
- 戰略溝通的重要性試題及答案
- 如何進行項目風險評估試題及答案
- 委婉拒絕合同條款回復函
- 重新定義品牌核心價值的方法計劃
- 2025【設備租賃合同】設備租賃合同
- 程序調試與優化方法試題及答案
- 班級心理健康知識普及活動計劃
- 精煉試題2024年高考數學及答案
- 印刷產品檢驗報告
- 雷霆傳奇親測-h5修改匯總
- 2023年版-腫瘤內科臨床路徑
- (完整版)水電工安全技術交底
- 《中國傳統文化心理學》課件第五章 傳統文化與心理治療(修)
- 幼兒園各類檔案借閱登記表
- 蒸汽疏水閥性能監測斯派莎克工程中國有限公司-Armstrong
- 機械創新設計技術結課論文
- 普通車床的主軸箱設計機械外文文獻翻譯、中英文翻譯、外文翻譯
- 神經外科各種引流管的護理精品課件
- 湘教版初中地理會考重點圖復習匯集
評論
0/150
提交評論