嵌入式應用程序開發基礎知識_第1頁
嵌入式應用程序開發基礎知識_第2頁
嵌入式應用程序開發基礎知識_第3頁
嵌入式應用程序開發基礎知識_第4頁
嵌入式應用程序開發基礎知識_第5頁
已閱讀5頁,還剩85頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發11.1 進程控制進程控制11.2 進程間通信進程間通信11.3 線程編程線程編程11.4 文件編程文件編程11.5 時間編程時間編程第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發1. 進程控制理論進程控制理論 a. 什么是進程 是一個具有一定獨立功能的程序的一次運行活動運行活動; 特點: 動態性(和程序的最大區別) 并發性(即多個進程可同時存在) 獨立性(多個進程互不干擾) 異步性(多個進程的執行次序互不相關) 一進程控制一進程控制第第11 11章章 嵌入式應用程序開發嵌

2、入式應用程序開發 基本狀態: 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發b.進程ID PID是標識進程的唯一唯一數字,父進程的ID表示為PPID,啟動進程的用戶ID表示為UID。 c. 進程互斥 多個進程共享臨界資源時,必須等待,直到資源占用者釋放該資源后方可使用的現象; 臨界資源指操作系統中一次只允許一個進程訪問的資源; 臨界區指進程中訪問臨界資源的程序代碼部分。 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發d. 進程同步 一組并發進程(即合作進程,它們之間傳遞的信號稱為消息或事件)按照一定的順序執行的過程。e. 進程調度 按照一定的算法,從一組待運行的進程中選出一

3、個在CPU中運行; 調度方式分為搶占式和非搶占式2大類; 常見調度算法包括先來先服務、短進程優先、高優先級優先、時間片輪轉等。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發f. 死鎖 多個進程因競爭資源而形成一種僵局,無外力作用無法向前推進的現象。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發擴展知識:第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 * 一個進程共有6種ID,分別為:進程ID、父進程ID、用戶ID、有效用戶ID、組ID、有效組ID(其中進程ID和父進程ID不可更改,其它4個在適當條件下可更改); * 上述ID保存在內核的數據結構中,Linux系統提

4、供了專門的函數用于訪問這些ID值(/home/daquan/show_pids.c ): 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2. 進程控制進程控制 2.1 獲取進程ID(sys/types.h、unistd.h) 獲取當前進程ID:pid_t getpid(void) 獲取父進程ID:pid_t getppid(void) 舉例(見見/home/lesson/getpid.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2.2 創建進程(unistd.h) a. fork函數 原型:pid_t fork(void) 返回值:在父進程中返回新建子進程的PID、在

5、子進程中返回0、在出錯時返回負值; 舉例(見見/home/lesson/fork1.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 該函數創建的子進程和父進程共享代碼共享代碼,但拷貝拷貝父進程的數據空間和堆棧空間: 舉例(見見/home/lesson/fork2.c) 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發b. vfork函數 原型:pid_t vfork(void) 特點:創建的子進程和父進程共享數據段,且先運行子進程后運行父進程。 舉例 (見見/home/lesson/fork3.c) 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2.3 exec

6、函數族函數族 該類函數用被執行的程序替換替換調用它的程序,且保持進程的PID不變。 execl(unistd.h) * 原型:int execl(const char *path,const char *arg1,) * path表示被執行的程序名(包含全路徑),arg表示被執行程序所需的命令行參數(包含程序名),以空指針(NULL)結束; * 舉例(見見/home/lesson/exec1.c) 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 execlp(unistd.h) * 原型:int execlp(const char *path,const char *arg1,) *

7、 path不包含路徑,系統從環境變量中查找,其它同execl; * 舉例(見見/home/lesson/exec2.c) execv(unistd.h) * 原型:int execv(const char *path,char * const arg) * path包含全路徑,argv表示命令行參數數組; * 舉例(見見/home/lesson/exec3.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 system(stdlib.h) * 原型:int system(const char *string) * 功能:調用fork產生子進程,該子進程調用“/bin/sh C st

8、ring”來執行string所代表的命令; * 舉例(見見/home/lesson/system.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發3. 進程等待進程等待(sys/types.h)、(sys/wait.h) 原型:pid_t wait(int *status) 功能:阻塞進程,直到某個子進程退出,返回值為子進程的PID; 舉例(見見/home/lesson/process_wait.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發擴展知識: * 從某種意義上講,該子進程和父進程一模一樣且獨立獨立于父進程于父進程,并接受系統的調度(/home/daquan/

9、fork2.c ); * 有2種情況可能會導致調用fork函數出錯,即系統中已經有太多的進程存在或調用fork的用戶的進程太多了; * vfork和fork的區別(/home/daquan/vfork1.c): 1. 子進程對共享資源的修改會影響到父進程 2. 子進程一定先于父進程運行第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 * Linux使用exit函數退出進程 該函數會深入內核注銷掉進程的內核數據結構并釋放進程的資源; 1. C程序中的return語句將被編譯器翻譯為exit函數 2. exit的參數是一個整型值,表示進程退出的狀態,正常退出為0,否則是非零值。 第第11

10、11章章 嵌入式應用程序開發嵌入式應用程序開發 * 使用exit檢查進程出錯信息 1. 如果將errno變量作為參數傳遞給exit函數,便可在程序退出后檢查程序退出的原因(/home/daquan/exit.c); 2. perror和strerror出現后便很少在shell中直接來檢查errno變量的值了,因為二者能夠提供錯誤信息的更加直觀的文字描述。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 * Linux內核為每個已經終止的子進程都保存了一定的信息(如進程ID、進程的終止狀態、進程的統計信息等),這些信息可以由父進程父進程得到并加以利用: 第第11 11章章 嵌入式應用程序

11、開發嵌入式應用程序開發 * 如果需要等待一個指定的進程可以使用waitpid函數(/home/daquan/wait2.c ): 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 * 什么是僵尸進程?(/home/daquan/zombie1.c) 1. 子進程已經結束運行,但其父進程沒有調用父進程沒有調用wait函函數數回收其退出狀態信息的進程稱之為僵尸進程(它放棄了幾乎所有的系統資源,不能被調度執行,不能占用CPU時間,只占用了微乎其微的內存用于保存其退出狀態信息); 2. 僵尸進程是系統安全的一大隱患,其負作用是占用了系統的進程ID,大量僵尸進程的出現會導致系統進程ID的枯竭,最

12、終使得系統無法產生新的進程。 注:上例執行過程中在shell內使用“ps -ax”命令可查看進程的狀態(S表示正常狀態,Z表示僵尸狀態)。 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 * 避免僵尸進程的產生(/home/daquan/zombie2.c) 注:上例中同樣需要使用命令“ps -ax”查看進程狀態,但結果中沒有顯示init,可能是系統默認不顯示該進程。 第一種方法是父進程調用wait函數,主動回收子進程的退出狀態信息; 第二種方法是借助于Linux系統中的init進程:如果父進程在子進程之前退出,該子進程便成為了“孤兒進程”,所有的孤兒進程都將被init進程所領養,而

13、該進程是系統的守護進程,它一定會調用wait函數回收孤兒進程的退出狀態信息。 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發4.1 概述概述 1. 進程間為什么要通信 數據傳輸(一個進程有數據要傳給另一個進程) 資源共享(多個進程相互協調,共同使用臨界資源) 通知事件(一個進程要向另一個進程發送消息,通知其某個事件) 進程控制(有些進程要控制另一些進程,如Debug)二進程間通信二進程間通信 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2. Linux進程間通信(IPC)的基礎 UNIX進程間通信 基于system V的進程間通信 POSIX進程間通信 第第11 11章章

14、 嵌入式應用程序開發嵌入式應用程序開發3. Linux使用的進程間通信方式 管道和有名管道 信號 消息隊列 共享內存 信號量 套接字第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發擴展知識: * IPC的作用就是為運行中需要外部數據的進程提供一種數據傳輸的通道數據傳輸的通道: 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 * 進程運行期間其地址空間對于其他進程是不可見的(共享內存機制除外),IPC就是Linux系統提供的一種中間轉發機中間轉發機制制,將數據從源頭發送到目的地:第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發第第11 11章章 嵌入式應用程序開發嵌入式

15、應用程序開發4.2 管道通信管道通信 1. 什么是管道 將一個進程的輸出和另一個進程的輸入連接在一起,是單向的單向的、先進先出的; 寫進程負責在管道尾部寫入數據,讀進程負責從管道頭部讀出數據; 數據被進程讀出后將被從管道中刪除; 讀空管道和寫滿管道的進程都將被阻塞; 管道分為無名管道和有名管道。 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2. 創建無名管道 原型:int pipe(int fieldis2),filedis是文件描述符,filedis0用于讀管道,filedis1用于寫管道: 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 舉例(見見/home/less

16、on/create_pipe.c) 關閉管道:使用close函數關閉兩個文件描述符即可; 使用無名管道進行父子進程通信的步驟(見見/home/lesson/pipe_rw.c): * 創建一個無名管道 * 利用fork創建一個子進程,該子進程便繼承了父進程所創建的管道 * 父子進程分別利用兩個文件描述符完成通信任務第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發3. 創建有名管道(也稱為FIFO):、 原型:int mkfifo(const char* pathname,mode_t mode),FIFO是文件名; 有名管道實質是一個文件,創建后可以像普通文件一樣進行操作; 打開管道文

17、件時是否使用參數O_NONBLOCK會產生不同的結果: * 不使用該參數時,如果訪問要求得不到滿足則進程被阻塞 * 使用該參數時,如果訪問要求得不到滿足則出錯返回(errno信息是ENXIO) 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 舉例(見見/home/lesson/fifo_read.c和和fifo_write.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發擴展知識: * 管道是Linux系統中較為原始的進程間通信方式,數據在其中是以數據流數據流(即沒有格式)的方式傳輸的; * 管道實質上是利用文件文件來實現的(用文件來緩存所要傳輸的數據),但又不同于普通文

18、件(如數據讀出后管道便被清空了)。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發一. 匿名管道 在系統中是沒有實名的(是看不到的),只是進程的一種資源(屬于文件系統屬于文件系統),會隨著進程的結束而被系統清除; 主要特性 * 數據只能在一個方向一個方向上流動(其實是單工) * 只能在具有公共祖先的進程間通信(如父子進程、兄弟進程)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發對此類管道的讀寫使用read和write函數: * 步驟:先使用pipe函數建立管道再調用fork函數創建子進程(順序不能反?); * 管道的方向性取決于使用雙方如何維護該管道,發送數據的一方應關閉管道

19、的讀出端,而接收數據的一方應關閉管道的寫入端)(見/home/daquan/guandao1.c):第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 * 兄弟進程使用管道進行通信時,應先在父進程中建立管道再使用fork創建兩個兄弟進程(父進程要在兩個子進程均建立后再關閉管道?見/home/daquan/guandao2.c); * 每個進程都應該都應該在退出前完成所使用管道的關閉工作(即調用close函數關閉管道的兩端)。 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發二. 有名管道 * 匿名管道只能在父子進程或兄弟進程間通信,而使用FIFO可以實現無關進程間的數據傳輸(文件

20、更持久穩定),見/home/daquan/guandao3.c。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發4.3 信號通信信號通信 信號機制是Unix系統中最為古老的進程間通信機制,有很多情況可以產生一個信號: 用戶按下某個按鍵 硬件異常(如除數為0) 進程使用kill函數函數向另一個進程發送信號 用戶使用kill命令命令向其他進程發送信號第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 1. 信號類型 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2. 和信號相關的函數 a. kill函數(sys/types.h、signal.h) 原型:int kill(p

21、id_t pid,int signo) 功能:給自身或其他進程發送信號; pid的4種取值: * pid0表示將信號發送給PID=pid的進程 * pid=0表示將信號發送給同組的進程 * pid0表示將信號發送給PID=|pid|的進程 * pid=-1表示將信號發給所有進程第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發b. raise函數(sys/types.h、signal.h) 原型:int raise(int signo) 功能:給自身發送信號。 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發c. alarm函數(unistd.h) 原型:unsigned int

22、 alarm(unsigned int seconds) 功能:設置一個鬧鐘時間,到點時產生SIGALRM信號給自己(如果不捕獲該信號,則默認操作為終止該進程); 說明: * 每個進程只能有一個鬧鐘時間,舊鬧鐘未超時而設置新鬧鐘時,新的替換舊的; * 舊鬧鐘未超時而設置新鬧鐘,且新鬧鐘的second=0時表示取消舊鬧鐘。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發d. pause函數(unistd.h) 原型:int pause(void) 功能:使調用該函數的進程掛起,直到捕捉到一個信號。 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發e. signal函數(signa

23、l.h) 原型:void (*signal(int signo,void(*func)(int)(int) 功能:用于給信號指定響應函數; func的3種取值: * func=SIG_IGN表示忽略此信號 * func=SIG_DFL表示以默認方式處理 * func=函數名表示以該函數來進行處理 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發3. 信號處理 當某種信號出現時,通常有3種處理情形: * 忽略此信號(大多數信號被這樣處理,但SIGKILL和SIGSTOP不能被忽略,因為二者為超級用戶提供了一種終止進程的方法) * 執行用戶希望的動作(通知內核在某種信號發生時,調用事先聲明

24、的函數) * 執行系統默認的動作(大多數信號的默認動作是終止該進程)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 實現信號處理的方法有2種: * 使用簡單的signal函數 * 使用信號集函數組4. 舉例(見見/home/lesson/my_signal.c) 注:注:signal只是用來注冊處理函數的,沒有給進程發送信只是用來注冊處理函數的,沒有給進程發送信號的功能,故要使該程序工作需要按下述步驟操作:號的功能,故要使該程序工作需要按下述步驟操作: * 運行該程序運行該程序 * 在另一個終端中使用在另一個終端中使用“ps aux”命令查看該程序的進程號命令查看該程序的進程號 *

25、使用命令使用命令“kill s 信號信號 pid”給該進程發送信號給該進程發送信號 * 查看結果查看結果第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發4.4 共享內存共享內存 1. 概述 共享內存是被多個進程共享的一部分物理內存,是進程間共享數據的最快的方法。 工作原理第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 一個進程向共享內存區域寫入數據,其它共享進程便可以立刻看到其中的內容,無需專門的函數進行操作,極其簡便。 實現共享內存的步驟 * 使用shmget函數創建共享內存 * 使用shmat函數映射共享內存第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2. 創

26、建共享內存 原型:int shmget(key_t key,int size,int shmflg) key=IPC_PRIVATE或key=0且shmflg=IPC_PRIVATE表示創建一塊新的共享內存; 操作成功時返回共享內存標識符,否則返回-1。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發3. 映射共享內存 原型:int shmat(int shmid,char *shmaddr,int flag) shmid是shmget返回的共享內存標識符,shmaddr用于獲取共享內存在進程空間的映射地址,flag用于決定以什么方式確定映射地址(通常為0); 操作成功返回共享內存映射

27、到進程中的地址,否則返回-1。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發4. 映射解除 原型:int shmdt(char *shmaddr) 功能:將共享內存從進程空間中脫離。5. 舉例(見見/home/lesson/shmem.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發4.5 消息隊列消息隊列 1. 概述 信號能傳送的信息量有限,而管道只能傳送無格式的字節流; 消息隊列是一個鏈表,消息是其中的記錄,且具有特定的格式; 進程可以按照一定的規則向消息隊列中添加新消息,而其他進程可以從中讀取消息; Linux中常用的消息隊列有2種:POSIX消息隊列和system

28、 V消息隊列(本節介紹的內容)。 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2. system V消息隊列 具有持續性,即隊列一旦被創建便一直存在,直到內核重啟或人為刪除; 持續性要求每個隊列在系統中有唯一對應的“鍵值鍵值”,要獲得一個隊列的“描述字描述字”就必須提供該隊列的鍵值。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發3. 獲取鍵值(sys/types.h、sys/ipc.h) 原型: key_t ftok(char *pathname,char proj),pathname是文件名,proj是項目名,不為0即可; 功能:返回pathname所對應的鍵值。第第1

29、1 11章章 嵌入式應用程序開發嵌入式應用程序開發 4. 打開/創建消息隊列(sys/types.h、sys/ipc.h、sys/msg.h) 原型:int msgget(key_t key,int msgflg),key是消息隊列的鍵值,由ftok函數獲得,msgflg是標志位; 功能:打開/創建消息隊列; msgflg的取值: * IPC_CREAT表示創建新的消息隊列 * IPC_EXCL和IPC_CREAT共同使用時,如果要創建的消息隊列已存在則返回錯誤信息 * IPC_NOWAIT表示消息隊列的要求無法滿足時不阻塞 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 創建新的消

30、息隊列的方法有2種: * msgflg中包含IPC_CREAT且系統中沒有和key對應的消息隊列 * key =IPC_PRIVATE第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 5. 發送消息(sys/types.h、sys/ipc.h、sys/msg.h) 原型:int msgsnd(int msgid,struct msgbuf* msgp,int msgsz,int msgflg) * msgid是消息隊列描述字,來源于msgget的返回值 * msgp是存放消息的結構,msgsz表示消息的大小 * msgflg取IPC_NOWAIT表示不阻塞 功能:向消息隊列發送一條消息

31、; 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發6. 接收消息(sys/types.h、sys/ipc.h、sys/msg.h) 原型:int msgrcv(int msgid,struct msgbuf* msgp,int msgsz,long msgtyp,int msgflg) 功能:從msgid所代表的消息隊列中讀取一個msgtyp類型的消息,將其存儲在msgp所指向的結構中(操作成功時,該消息將從消息隊列中刪除)。7. 舉例(見見/home/lesson/msg.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發4.6 信號量信號量 1. 概述 主要用于保護臨界

32、資源或用于進程同步; 信號量分為2種: * 二值信號量 * 計數信號量第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2. 創建/打開信號量(sys/types.h、sys/ipc.h、sys/sem.h) 原型:int semget(key_t key,int nsems,int semflg) 參數: * key是鍵值,由ftok函數獲得 * nsems是打開/創建的信號量集中包含的信號量數目 * semflg是標識。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發3. 操作信號量 原型:int semop(int semid,struct sembuf* sops,uns

33、igned nsops) * semid是要操作的信號量集的ID * sops表明要進行什么操作 * nsops是所指向的數組的元素個數 功能:對信號量進行控制。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發1. 線程基礎線程基礎 線程技術提出于上世紀60年代,廣泛應用于80年代,如今多線程技術已被許多操作系統支持; 進程是資源分配的最小單位,而線程是調度的最小單位。 a. 線程的優勢有哪些 線程是一種“節儉”的多任務操作方式; 線程間具有方便的通信機制。 三線程編程三線程編程 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發b. Linux下的多線程 Linux下的多線程遵

34、循POSIX線程接口,也稱其為pthread; 編寫Linux下多線程程序需要使用“pthread.h”頭文件,鏈接時要使用“libpthread.a”庫。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2. 創建線程創建線程(pthread.h) 原型:int pthread_create(pthread_t *tidp,const pthread_addr_t * attr,void*(*start_rtn)(void*),void* arg) * tidp是線程ID(是用來獲取的) * attr是線程屬性(通常為空) * start_rtn是線程要執行的函數 * arg是star

35、t_rtn的參數;第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 pthread庫不是Linux系統的庫,故編譯時要加上“-lpthread”選項,如gcc filename.c -lpthread -o filename; 舉例(見見/home/lesson/) * thread_create.c(無參數傳遞) * thread_int.c(傳遞整數) * thread_string.c(傳遞字符串) * thread_share.c第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發3. 終止線程終止線程 如果在進程的任意一個線程中調用exit或_exit,則整個進整個進程程

36、都會終止。 a. 線程正常的退出方式 線程從啟動例程中返回(即利用return函數返回) 線程自己調用破pthread_exit函數終止 線程被其它進程終止第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發b. 線程退出函數(pthread.h) 原型:void pthread_exit(void *rval_ptr) 功能:終止調用線程,返回一個值給進程使用 rval_ptr:線程退出時返回值的指針 舉例(見見/home/lesson/thread_exit.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發4. 線程的等待線程的等待 原型:int pthread_join(

37、pthread_t tid,void *rval_pt),tid是要等待的線程的id,rval_pt是線程退出的返回值的指針; 功能:阻塞調用線程,直到指定的線程終止; 舉例(見見/home/lesson/thread_join.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發5. 獲取線程標識獲取線程標識 原型:pthread_t pthread_self(void) 功能:獲取調用線程的thread identifier 舉例(見見/home/lesson/thread_id.c)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發6. 線程的清除線程的清除 a. 線程的終

38、止 線程終止有2種情況:正常終止(可預見)和非正常終止(不可預見) * 正常終止包括:1.線程主動調用pthread_exit;2.線程利用return函數返回 * 非正常終止包括:1.其它線程干預退出;2.自身運行出錯退出 無論哪種退出,都會存在“資源回收”的問題(如線程代碼中分配的內存、使用的信號量等)。 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發b. 線程非正常退出非正常退出的資源回收 非正常退出退出具有不可預見性,使得利用free等函數回收資源變得不切實際。 然而,從pthread_cleanup_push調用點到pthread_clean_pop之間的程序片段中的終止動

39、作,系統執行pthread_cleanup_push中所指定的清除函數,從而使得線程退出后的資源得到回收。 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 原型:void pthread_cleanup_push(void (*rtn)(void *),void *arg),rtn表示清除函數,arg是其參數; 功能:將清除函數壓入清除棧,帶異常退出時自動執行自動執行。 原型:void pthread_cleanup_pop(int execute),execute決定彈出清除函數時是否執行該函數(0:不執行,非0:執行); 功能:將清除函數彈出清除棧。 舉例(見見/home/les

40、son/thread_clean.c) 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 Linux中的文件編程有2種方法:Linux系統調用和C語言函數庫,前者依賴于Linux系統,后者獨立于操作系統,在任何操作系統下都是一樣的。1. 系統調用系統調用 a. 創建文件creat 原型:int creat( const char * filename,mode_t mode ),filename是要創建的文件名(包含路徑,缺省值為當前路徑),mode是創建模式;四文件編程四文件編程第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 mode的取值: * S_IRUSR表示可讀(數

41、字取值為4) * S_IWUSR表示可寫(數字取值為2) * S_IXUSR表示可執行(數字取值為1) * S_IRWXU表示可讀、寫、執行 舉例(見見Linux操作系統的操作系統的/home/lesson/file_create.c) 第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發b. 打開文件open Linux中每個被打開的文件都對應一個“文件描述符”,其本質是一個非負數非負數,由系統分配,取值范圍是0-OPEN_MAX; 原型:1.int open(const char *pathname,int flags)或 2. int open(const char *pathnam

42、e,int flags,mode_t mode) 其中pathname的缺省值為當前路徑,flags表示打開標志,函數的返回值是文件描述符;第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 flags的取值: * O_RDONLY表示以只讀方式打開 * O_WRONLY表示以只寫方式打開 * O_RDWR表示以讀寫方式打開 * O_APPEND表示以追加方式打開 * O_CREAT表示創建一個文件 * O_NOBLOCK表示以非阻塞方式打開第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發c. 文件關閉close 原型:int close(int fd),fd為文件描述符; 舉例

43、(見見Linux操作系統的操作系統的/home/lesson/file_open.c)。d. 讀文件read 原型:int read(int fd,const void *buf,size_t length); 功能:從fd指定的文件中讀取length個字節字節到buf指向的緩沖區,返回實際讀取的字節字節數;第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發e. 寫文件write 原型:int write(int fd,const void *buf,size_t length) 舉例(見見Linux操作系統的操作系統的/home/lesson/file_cp.c)f. 文件定位lsee

44、k 原型:int lseek(int fd,offset_t offset,int whence) 功能:將文件指針相對于whence移動offset個字節字節,成功時返回文件指針相對于文件頭文件頭的位置;第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發 whence的取值: * SEEK_SET表示相對于文件頭 * SEEK_CUR表示相對于文件指針的當前位置 * SEEK_END表示相對于文件尾 offset取正值表示向后移動,取負值表示向前移動。第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發g. 文件訪問判斷access 原型:int access(const char

45、 *pathname,int mode),pathname表示文件名,mode表示要判斷的訪問權限; 功能:判斷文件是否可以進行某種操作,測試成功返回0,否則返回-1; mode的取值: * R_OK表示可讀 * W_OK表示可寫 * X_OK表示可執行 * F_OK表示存在第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發2. C庫函數庫函數 a. 文件打開open 原型:FILE *fopen(const char* filename,const char* mode),filename的缺省值為當前路徑,mode表示打開模式; mode的取值: * r/rb表示以只讀方式打開 * w/wb表示以只寫方式打開(如果文件不存在則創建之) * a/ab表示以追加方式打開(如果文件不存在則創建之) * r+/r+b/rb+表示以讀寫方式打開 * w+/w+b/wb+表示以讀寫方式打開(不存在則創建之) * a/a+b/ab+表示以讀和追加方式打開(不存在則創建之)第第11 11章章 嵌入式應用程序開發嵌入式應用程序開發b. 讀文件read 原型:size_t fread(void

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論