版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、嵌入式Linux高級編程,Linux進程管理,王莉,進程的定義和特征,進程的定義 進程是一個具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。 進程的實體結(jié)構(gòu) (1)進程控制塊(PCB) (2)程序段 (3)數(shù)據(jù)段,進程控制塊,進程控制塊是進程實體的一部分,是操作系統(tǒng)中最重要的記錄型數(shù)據(jù)結(jié)構(gòu)。PCB中記錄了操作系統(tǒng)所需的,用于描述進程進展情況及控制進程運行所需的全部信息。 PCB是進程存在的惟一標志。 一般把PCB存放在操作系統(tǒng)專門開辟的PCB區(qū)內(nèi)。 在進程控制塊中,主要包括下述4方面的信息。 (1)進程描述信息 進程標識符。每個進程都有惟一的進程標識符,用以識別不同的進程。 用戶名或用戶
2、標識號。每個進程都隸屬于某個用戶,有利于資源共享與保護。 家族關(guān)系。標識進程之間的家族關(guān)系。,進程控制塊,(2)處理機狀態(tài)信息 通用寄存器、指令計數(shù)器、程序狀態(tài)字(PSW)、用戶棧指針等 (3)進程調(diào)度信息 進程狀態(tài)。指明進程的當前狀態(tài),以作為進程調(diào)度和進程對換時的依據(jù)。 進程優(yōu)先級。用于描述進程使用處理機的優(yōu)先級別的一個整數(shù),優(yōu)先級別高的進程先獲得處理機。 進程調(diào)度所需的其他信息。如進程已等待CPU的時間總和、進程已執(zhí)行的時間總和等。 事件。指進程被阻塞的原因。 (4)進程控制信息 程 序和數(shù)據(jù)的地址。指出該進程的程序和數(shù)據(jù)所在的內(nèi)存或外存地址,以便再調(diào)度到該進程執(zhí)行時,能從中找到其程序和數(shù)
3、據(jù)。 進程同步和通信機制。指實現(xiàn)進程同步和進程通信時所必須的機制,如消息隊列指針、信號量等。這些數(shù)據(jù)應(yīng)全部或部分地存放在PCB中。,進程的狀態(tài)及其轉(zhuǎn)換,1進程的基本狀態(tài) (1)就緒狀態(tài) 當進程已分配到除處理機以外的所有必要的資源后,只要再獲得處理機便可立即執(zhí)行,這時進程的狀態(tài)稱為就緒狀態(tài)。 (2)執(zhí)行狀態(tài) 執(zhí)行狀態(tài)是指進程已獲得處理機、其程序正在執(zhí)行的狀態(tài)。 (3)阻塞狀態(tài) 正在執(zhí)行的進程因發(fā)生某事件而暫時無法繼續(xù)執(zhí)行時,便放棄處理機而處于暫停狀態(tài),這種暫停狀態(tài)被稱為阻塞狀態(tài)。,進程的狀態(tài)及其轉(zhuǎn)換,命令行參數(shù),兩種獲得命令行參數(shù)的寫法: main(int argc, char *argv);
4、main(int argc, char *argv, char *envp);,獲取進程標識,#include #include pid_t getpid(void); 功能:獲取當前進程ID 返回:調(diào)用進程的進程ID #include #include pid_t getppid(void); 功能:獲取父進程ID 返回:調(diào)用進程的父進程ID,進程創(chuàng)建,#include #include pid_t fork(void); 功能:創(chuàng)建一個新的進程。 返回:子進程中為0,父進程中為子進程ID,出錯為-1 說明: 由fork創(chuàng)建的新進程被稱為子進程( child process)。 該函數(shù)被調(diào)用
5、一次,但返回兩次。兩次返回的區(qū)別是子進程的返回值是0,而父進程的返回值則是子進程的進程ID。 一般來說,在fork之后是父進程先執(zhí)行還是子進程先執(zhí)行是不確定的。這取決于內(nèi)核所使用的調(diào)度算法。,父、子進程之間的區(qū)別,fork的返回值; 進程ID、不同的父進程ID; 父進程設(shè)置的鎖,子進程不繼承; 子進程的未決告警被清除; 子進程的未決信號集設(shè)置為空集。,父、子進程之間的繼承,使用fork函數(shù)得到的子進程是父進程的處繼承了整個進程的地址空間,包括:進程上下文、進程堆棧、內(nèi)存信息、打開的文件描述符、信號控制設(shè)置、進程優(yōu)先級、進程組號、當前工作目錄、根目錄、資源限制、控制終端等。,#include #
6、include #include int main(void) pid_t pid; pid=fork(); switch (pid) case -1: perror(fork error); exit(1); case 0: printf(I am the child process, my process id is %dn, getpid(); break; default: printf(I am the parent process, my process id is %dn, getpid(); break; return 0; ,進程的終止,進程的終止有以下幾種方式: exit(
7、) _exit() 由信號終止,exit和_exit,exit和_exit用于中止進程; _exit的作用:直接使進程停止運行,清除其使用的內(nèi)存空間,并清除其在內(nèi)核中的數(shù)據(jù)結(jié)構(gòu); exit與_exit函數(shù)不同,exit函數(shù)在調(diào)用exit系統(tǒng)之前要檢查文件打開情況把文件緩沖區(qū)的內(nèi)容寫回文件中去。如調(diào)用printf()函數(shù)。,_exit,exit,exec函數(shù),在用fork函數(shù)創(chuàng)建子進程后,子進程往往要調(diào)用一個exec函數(shù)以執(zhí)行另一個程序。 當進程調(diào)用一種exec函數(shù)時,該進程完全由新程序代換,而新程序則從其main函數(shù)開始執(zhí)行。因為調(diào)用exec并不創(chuàng)建新進程,所以前后的進程ID并未改變。exec
8、只是用另一個新程序替換了當前進程的正文、數(shù)據(jù)、堆和棧段。,exec函數(shù),#include int execl(const char * pathname, const char * arg 0, . /* (char *) 0 */); int execv(const char * pathname, char *const a rgv ); int execle(const char * pathname, const char * a rg 0, ./* (char *)0, char *const e n v p */); int execve(const char * pathname
9、 char *const a rgv , char *const envp ); int execlp(const char * filename, const char * a rg 0, . /* (char *) 0 */); int execvp(const char * filename, char *const a rgv ); 功能:實現(xiàn)代碼替換 返回值:若出錯則為- 1,若成功替換新代碼。,exec函數(shù),E:指可以傳遞環(huán)境變量表 L:單獨的參數(shù)傳遞,最后要有一個NULL V:傳一個指針數(shù)組名 P:按照環(huán)境變量來查找,程序舉例:,char *ps_argv=“ps”,”-ax”,
10、 NULL; char *ps_envp=“PATH=/bin:/usr/bin”,”TERM=console”, NULL execl(“/bin/ps”, “ps”, “-ax”, NULL); execv(“/bin/ps”, ps_argv); execle(“/bin/ps”, “ps”, “-ax”, NULL, ps_envp); execve(“/bin/ps”, ps_argv, ps_envp); execlp(“ps”, “ps”, “-ax”, NULL); execvp(“ps”, ps_argv);,wait和waitpid函數(shù),當一個進程正?;虍惓=K止時,內(nèi)核就向
11、其父進程發(fā)送SIGCHLD信號。因為子進程終止是個異步事件(這可以在父進程運行的任何時候發(fā)生),所以這種信號也是內(nèi)核向父進程發(fā)的異步通知。父進程可以忽略該信號,或者提供一個該信號發(fā)生時即被調(diào)用執(zhí)行的函數(shù)(信號處理程序)。對于這種信號的系統(tǒng)默認動作是忽略它。 wait函數(shù)用于使父進程阻塞,直到一個子進程結(jié)束或者該進程接收到一個指定信號為止。,wait和waitpid函數(shù),調(diào)用wait或waitpid的進程可能會: 阻塞(如果其所有子進程都還在運行)。 帶子進程的終止狀態(tài)立即返回(如果一個子進程已終止,正等待父進程存取其終止狀態(tài))。 出錯立即返回(如果它沒有任何子進程)。,wait和waitpid
12、函數(shù),#include #include pid_t wait(int * status) ; pid_t waitpid(pid_t pid, int * status, int options) ; 功能:等待進程。 返回值:若成功則為子進程ID號,若出錯則為-1. 參數(shù)說明: status:用于存放進程結(jié)束狀態(tài)。 pid:要等待的進程ID。 pid = -1 等待任一子進程。于是在這一功能方面waitpid與wait等效。 pid 0 等待其進程ID與PID相等的子進程。 pid = 0 等待其組ID等于調(diào)用進程的組ID的任一子進程。 pid -1 等待其組ID等于PID的絕對值的任一子
13、進程。 options:設(shè)置等待方式。 0:不設(shè)置。 WNOHANG:如果沒有任何已經(jīng)結(jié)束的進程則馬上返回,不等待。 WUNTRACED:如果子進程進入暫停狀態(tài)則馬上返回。,#include #include #include #include #include int main( void ) pid_t childpid; int status; childpid = fork(); if ( -1 = childpid ) perror( fork() ); exit( EXIT_FAILURE ); else if ( 0 = childpid ) puts( In child process ); sleep( 3 );/讓
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年陜西省易地扶貧搬遷后續(xù)扶持試題含答案
- 護理課培訓(xùn)教學(xué)課件
- 網(wǎng)絡(luò)文學(xué)創(chuàng)作倫理與規(guī)范建議
- 護理操作技術(shù)配音
- 互聯(lián)網(wǎng)監(jiān)管能力培訓(xùn)課件
- 家居裝飾裝修施工規(guī)范手冊
- 2026年劇本殺運營公司員工安全防護管理制度
- 2025年化工行業(yè)清潔生產(chǎn)工藝報告
- 2025年跨境電商保稅備貨模式創(chuàng)新項目稅收政策影響可行性研究報告
- 何為第一議題制度
- LKJ2000型監(jiān)控裝置控制模式行車安全與設(shè)備96課件
- 驛站轉(zhuǎn)讓協(xié)議書范本
- 2025年河北省職業(yè)院校技能大賽高職組(商務(wù)數(shù)據(jù)分析賽項)參考試題庫(含答案)
- 《造血干細胞移植護理指南》課件
- 2025承攬加工訂做合同范本
- 托幼機構(gòu)傳染病應(yīng)急處置預(yù)案
- 合歡花苷類對泌尿系感染的抗菌作用
- 汕頭市金平區(qū)2025屆九年級數(shù)學(xué)第一學(xué)期期末檢測試題含解析
- 2023年司法鑒定所黨支部年終總結(jié)
- 腫瘤生物學(xué)1(完整版)
- 2023-2024學(xué)年廣東省廣州市小學(xué)數(shù)學(xué)二年級上冊期末自我評估試題
評論
0/150
提交評論