




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、Linux進程控制11、程序和進程1.1 程序程序(program)是存放在磁盤文件中的可執(zhí)行文件。1.2 進程和進程ID程序的執(zhí)行實例被稱為進程(process)。本書的每一頁幾乎都會使用這一術(shù)語。某些操作系統(tǒng)用任務表示正被執(zhí)行的程序。每個linux進程都一定有一個唯一的數(shù)字標識符,稱為進程ID(process ID)。進程ID總是一非負整數(shù)。21.3 linux下的進程結(jié)構(gòu) Linux系統(tǒng)是一個多進程的系統(tǒng),進程之間具有并行性、互不干擾的特點。 linux中進程包含3個段,分別為“代碼段”、“數(shù)據(jù)段”和“堆棧段”。代碼段數(shù)據(jù)段堆棧段3 “數(shù)據(jù)段”存放全局變量、常數(shù)以及動態(tài)數(shù)據(jù)分配的空間(m
2、alloc函數(shù)取得的空間); “代碼段”存放程序代碼; “堆棧段”存放子程序的返回地址、子程序的參數(shù)以及程序的局部變量。41.3 init進程進程ID為1通常是init進程,在自舉過程結(jié)束時由內(nèi)核調(diào)用。init進程絕不會終止。它是一個普通的用戶進程(與交換進程不同,它不是內(nèi)核中的系統(tǒng)進程),但是它以超級用戶特權(quán)運行。51.4 獲取進程標識#include #include pid_t getpid(void); 返回:調(diào)用進程的進程I Dpid_t getppid(void); 返回:調(diào)用進程的父進程I Duid_t getuid(void); 返回:調(diào)用進程的實際用戶I Duid_t get
3、euid(void); 返回:調(diào)用進程的有效用戶I Dgid_t getgid(void); 返回:調(diào)用進程的實際組I Dgid_t getegid(void); 返回:調(diào)用進程的有效組I D61.5 fork函數(shù)#include #include pid_t fork(void);返回:子進程中為0,父進程中為子進程I D,出錯為-171.6 進程創(chuàng)建 由fork創(chuàng)建的新進程被稱為子進程( child process)。 該函數(shù)被調(diào)用一次,但返回兩次。兩次返回的區(qū)別是子進程的返回值是0,而父進程的返回值則是子進程的進程ID。 一般來說,在f o r k之后是父進程先執(zhí)行還是子進程先執(zhí)行是不確
4、定的。這取決于內(nèi)核所使用的調(diào)度算法。 81.6 進程創(chuàng)建 使用fork函數(shù)得到的子進程是父進程的處繼承了整個進程的地址空間,包括: 進程上下文、進程堆棧、內(nèi)存信息、打開的文件描述符、信號控制設置、進程優(yōu)先級、進程組號、當前工作目錄、根目錄、資源限制、控制終端等。9 父、子進程之間的區(qū)別是:fork的返回值; 進程I D、不同的父進程I D;子進程的t m s _ u t i m e , t m s _ s t i m e , t m s _ c u t i m e以及t m s _ u s t i m e設置為0;父進程設置的鎖,子進程不繼承;子進程的未決告警被清除;子進程的未決信號集設置為空
5、集。Fork 例如:fork.c101.7 vfork函數(shù) vfork函數(shù)的調(diào)用序列和返回值與fork相同,但兩者的語義不同。 現(xiàn)在很多的實現(xiàn)并不做一個父進程數(shù)據(jù)段和堆的完全拷貝,因為在f o r k之后經(jīng)常跟隨著exec。作為替代,使用了在寫時復制( copy-on-Write, COW)的技術(shù)。這些區(qū)域由父、子進程共享,而且內(nèi)核將它們的存取許可權(quán)改變?yōu)橹蛔x的。如果有進程試圖修改這些區(qū)域,則內(nèi)核為有關部分,典型的是虛存系統(tǒng)中的“頁”,做一個拷貝。如:uclinux中的進程創(chuàng)建。111.8 exec函數(shù)在用f o r k函數(shù)創(chuàng)建子進程后,子進程往往要調(diào)用一種e x e c函數(shù)以執(zhí)行另一個程序。
6、當進程調(diào)用一種e x e c函數(shù)時,該進程完全由新程序代換,而新程序則從其m a i n函數(shù)開始執(zhí)行。因為調(diào)用e x e c并不創(chuàng)建新進程,所以前后的進程I D并未改變。e x e c只是用另一個新程序替換了當前進程的正文、數(shù)據(jù)、堆和棧段。121.8 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,
7、 const char * a rg 0, ./* (char *)0, char *const e n v p */);int execve(const char * pathname char *const a rgv , char *const envp );int execlp(const char * pathname, const char * a rg 0, . /* (char *) 0 */);int execvp(const char * pathname, char *const a rgv );六個函數(shù)返回:若出錯則為- 1,若成功則不返回131.8 exec函數(shù)參數(shù)表
8、的傳遞有關( l表示表( list ),v表示矢量( vector ) );e:可傳遞新進程環(huán)境變量,execle、execve;p:可執(zhí)行文件查找方式為文件名,execlp、execvp;例如:execlp.c, execl.c, execle.c, execve.c141.9 exit和_exitexit和_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ù)。15進程運行調(diào)用退出處理函數(shù)清除I
9、/O緩沖調(diào)用exit系統(tǒng)調(diào)用進程終止運行_exitexit161.10 wait和waitpid函數(shù)當一個進程正常或異常終止時,內(nèi)核就向其父進程發(fā)送SIGCHLD信號。因為子進程終止是個異步事件(這可以在父進程運行的任何時候發(fā)生),所以這種信號也是內(nèi)核向父進程發(fā)的異步通知。父進程可以忽略該信號,或者提供一個該信號發(fā)生時即被調(diào)用執(zhí)行的函數(shù)(信號處理程序)。對于這種信號的系統(tǒng)默認動作是忽略它。wait函數(shù)用于使父進程阻塞,直到一個子進程結(jié)束或者該進程接收到一個指定信號為止。17調(diào)用wait或waitpid的進程可能會:阻塞(如果其所有子進程都還在運行)。帶子進程的終止狀態(tài)立即返回(如果一個子進程已
10、終止,正等待父進程存取其終止狀態(tài))。出錯立即返回(如果它沒有任何子進程)。18#include #include pid_t wait(int * status) ;pid_t waitpid(pid_t pid, int * status, int options) ;兩個函數(shù)返回:若成功則為子進程I D號,若出錯則為-1. Status選項,為空時,代表任意狀態(tài)結(jié)束的子進程,若不為空,則代表指定狀態(tài)結(jié)束的子進程。19wait和waitpid函數(shù)的區(qū)別:在一個子進程終止前, wait 使其調(diào)用者阻塞,而waitpid 有一選擇項,可使調(diào)用者不阻塞。waitpid并不等待第一個終止的子進程它有
11、若干個選擇項,可以控制它所等待的特定進程。實際上wait函數(shù)是waitpid函數(shù)的一個特例。20對于waitpid的p i d參數(shù)的解釋與其值有關:pid = -1 等待任一子進程。于是在這一功能方面waitpid與wait等效。pid 0 等待其進程I D與p i d相等的子進程。pid = 0 等待其組I D等于調(diào)用進程的組I D的任一子進程。pid -1 等待其組I D等于p i d的絕對值的任一子進程。21waitpid函數(shù)提供了wait函數(shù)沒有提供的三個功能:(1) waitpid等待一個特定的進程(而w a i t則返回任一終止子進程的狀態(tài))。 (2) waitpid提供了一個w
12、a i t的非阻塞版本。有時希望取得一個子進程的狀態(tài),但不想阻塞。(3) waitpid支持作業(yè)控制(以WUNTRACED選擇項)。例如:waitpid.c222. 守護進程2.1 概述守護進程( daemon)是生存期長的一種進程。它們常常在系統(tǒng)引導裝入時起動,在系統(tǒng)關閉時終止。因為它們沒有控制終端,所以說它們是在后臺運行的。linux系統(tǒng)有很多守護進程,它們執(zhí)行日常事物活動。232.2 守護進程特征所有守護進程都以超級用戶(用戶I D為0)的優(yōu)先權(quán)運行。沒有一個守護進程具有控制終端終端名稱設置為問號(?)、終端前臺進程組I D設置為1。缺少控制終端可能是精靈進程調(diào)用了s e t s i d
13、的結(jié)果。除u p d a t e以外的所有精靈進程都是進程組的首進程,對話期的首進程,而且是這些進程組和對話期中的唯一進程。u p d a t e是它所在進程組和對話期(中的唯一進程,但是該進程組的首進程(可能也是該對話期的首進程)已經(jīng)終止。所有這些守護進程的父進程都是i n i t進程。242.3 守護進程編程規(guī)則(5步)(1)創(chuàng)建子進程,父進程退出: 首先做的是調(diào)用fork,然后使父進程e x i t。這樣做實現(xiàn)了下面幾點:第一,如果該守護進程是由一條簡單s h e l l命令起動的,那么使父進程終止使得s h e l l認為這條命令已經(jīng)執(zhí)行完成。第二,子進程繼承了父進程的進程組I D,但
14、具有一個新的進程I D,這就保證了子進程不是一個進程組的首進程。這對于下面就要做的setsid調(diào)用是必要的前提條件。25(2)調(diào)用setsid以創(chuàng)建一個新的會話,并擔任該會話組的組長。調(diào)用setsid 作用有三個: (a)成為新對話期的首進程, (b)成為一個新進程組的首進程, (c)脫離控制終端。(會話組是一個或多個進程組的集合)26setsid()函數(shù)格式:include include Pid_t setsid(void)函數(shù)成功時返回該進程組ID, 出錯時返回-127(3)改變當前目錄為根目錄chdir(“/”); 從父進程繼承過來的當前工作目錄可能在一個mnt的文件系統(tǒng)中。因為守護進
15、程通常在系統(tǒng)再引導之前是一直存在的,所以如果守護進程的當前工作目錄在一個mnt文件系統(tǒng)中,那么該文件系統(tǒng)就不能被拆卸。28(4)重設文件權(quán)限掩碼 umask(0);由繼承得來的文件方式創(chuàng)建屏蔽字可能會拒絕設置某些許可權(quán)。例如,若守護進程要創(chuàng)建一個組可讀、寫的文件,而繼承的文件方式創(chuàng)建屏蔽字,屏蔽了這兩種許可權(quán),則所要求的組可讀、寫就不能起作用。29(5) 關閉不再需要的文件描述符。用fork函數(shù)創(chuàng)建的子程序會從父進程那繼承一些已經(jīng)打開的文件,由此為使守護進程就不再持有從其父進程繼承來的某些文件描述符。但是,究竟關閉哪些描述符則與具體的精靈進程有關,可以程序中的方法關閉所有文件描述符。for (
16、i=0;iMAX)close(i);守護例如:dameon.c303. 守護進程的出錯處理由于守護進程完全脫離了控制終端,因此,不能像其他程序一樣通過輸出錯誤信息到控制臺的方式來通知程序員。通常的辦法是使用syslog服務,將出錯信息輸入到“/var/log/message”系統(tǒng)日志文件中去。Syslog是linux中的系統(tǒng)日志管理服務通過守護進程syslog來維護。313.1 syslog函數(shù)說明Openlog函數(shù)用于打開系統(tǒng)日志服務的一個連接;Syslog函數(shù)用于向日志文件中寫入消息,在這里可以規(guī)定消息的優(yōu)先級、消息的輸出格式等;Closelog函數(shù)用于關閉系統(tǒng)日志服務的連接。323.1.
17、1 syslog函數(shù)格式(1)openlog函數(shù)#include void openlog(char * ident, int option, int facility) ;Ident:要向每個消息加入的字符串,通常為程序的名稱;33option參數(shù):LOG_CONS: 若日志消息不能通過發(fā)送至syslogd ,則將該消息寫至控制臺;LOG_NDELAY: 立即打開UNIX域數(shù)據(jù)報套接口至syslsgd守護進程。通常,在記錄第一條消息之前,該套接口不打開。LOG_PERROR:除將日志消息發(fā)送給syslog外,還將它寫至標準出錯(stderr)。LOG_PID:每條消息都包含進程ID,此選擇項可供對每個請求都fork一個子進程的守護進程使用。34openlog的facility參數(shù)LOG_AUTH 授權(quán)程序: login.su,getty, LOG_CRONcron 和 atLOG_DAEMON 系統(tǒng)守護進程:, LOG_KERN 內(nèi)核產(chǎn)生的消息LOG_LOCAL07 保留由本地使用LOG_LPR 行打系統(tǒng):lpd, lpc, LOG_MAIL 郵件系統(tǒng)LOG_NEWSU senet網(wǎng)絡新聞系統(tǒng)LOG_SYSLOG syslogd守護進程本身LOG_USER 來自其他用戶進程的消息LOG_UUCP UUCP系統(tǒng)35(2)syslog函數(shù)include vo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電工工考試題及答案
- 文化產(chǎn)業(yè)管理證書考生心得體會
- 精密醫(yī)學發(fā)展的趨勢與挑戰(zhàn)試題及答案
- 育嬰師文化敏感性的提升考核試題及答案
- 林肯事故測試題及答案
- 衛(wèi)生管理創(chuàng)新方法與案例試題及答案
- 激光多功能應用試題及答案
- 自主招生網(wǎng)絡試題及答案
- 污水管道疏通試題及答案
- 西醫(yī)臨床數(shù)據(jù)收集技巧試題及答案
- 【農(nóng)村電商物流最后一公里配送優(yōu)化探究(論文)7600字】
- 耳穴壓豆課件
- 自考15040習新時代思想概論高通過率題庫
- Unit 7 Happy Birthday!Section A(教學教學設計)2024-2025學年人教版英語七年級上冊
- 中職教育二年級下學期數(shù)學《組合數(shù)公式》教學課件
- 急性冠脈綜合征
- 免疫治療中假性進展的機制與評估標準
- 保險客戶經(jīng)理勞動合同樣本
- 2024養(yǎng)雞場雞糞買賣合同范本
- 燃煤發(fā)電廠液氨罐區(qū)安全管理規(guī)定
- 蘇教版六年級下冊數(shù)學期末測試卷【完整版】
評論
0/150
提交評論