版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Linux進(jìn)程控制11、程序和進(jìn)程1.1 程序程序(program)是存放在磁盤文件中的可執(zhí)行文件。1.2 進(jìn)程和進(jìn)程ID程序的執(zhí)行實(shí)例被稱為進(jìn)程(process)。本書的每一頁幾乎都會(huì)使用這一術(shù)語。某些操作系統(tǒng)用任務(wù)表示正被執(zhí)行的程序。每個(gè)linux進(jìn)程都一定有一個(gè)唯一的數(shù)字標(biāo)識(shí)符,稱為進(jìn)程ID(process ID)。進(jìn)程ID總是一非負(fù)整數(shù)。21.3 linux下的進(jìn)程結(jié)構(gòu) Linux系統(tǒng)是一個(gè)多進(jìn)程的系統(tǒng),進(jìn)程之間具有并行性、互不干擾的特點(diǎn)。 linux中進(jìn)程包含3個(gè)段,分別為“代碼段”、“數(shù)據(jù)段”和“堆棧段”。代碼段數(shù)據(jù)段堆棧段3 “數(shù)據(jù)段”存放全局變量、常數(shù)以及動(dòng)態(tài)數(shù)據(jù)分配的空間(m
2、alloc函數(shù)取得的空間); “代碼段”存放程序代碼; “堆棧段”存放子程序的返回地址、子程序的參數(shù)以及程序的局部變量。41.3 init進(jìn)程進(jìn)程ID為1通常是init進(jìn)程,在自舉過程結(jié)束時(shí)由內(nèi)核調(diào)用。init進(jìn)程絕不會(huì)終止。它是一個(gè)普通的用戶進(jìn)程(與交換進(jìn)程不同,它不是內(nèi)核中的系統(tǒng)進(jìn)程),但是它以超級(jí)用戶特權(quán)運(yùn)行。51.4 獲取進(jìn)程標(biāo)識(shí)#include #include pid_t getpid(void); 返回:調(diào)用進(jìn)程的進(jìn)程I Dpid_t getppid(void); 返回:調(diào)用進(jìn)程的父進(jìn)程I Duid_t getuid(void); 返回:調(diào)用進(jìn)程的實(shí)際用戶I Duid_t get
3、euid(void); 返回:調(diào)用進(jìn)程的有效用戶I Dgid_t getgid(void); 返回:調(diào)用進(jìn)程的實(shí)際組I Dgid_t getegid(void); 返回:調(diào)用進(jìn)程的有效組I D61.5 fork函數(shù)#include #include pid_t fork(void);返回:子進(jìn)程中為0,父進(jìn)程中為子進(jìn)程I D,出錯(cuò)為-171.6 進(jìn)程創(chuàng)建 由fork創(chuàng)建的新進(jìn)程被稱為子進(jìn)程( child process)。 該函數(shù)被調(diào)用一次,但返回兩次。兩次返回的區(qū)別是子進(jìn)程的返回值是0,而父進(jìn)程的返回值則是子進(jìn)程的進(jìn)程ID。 一般來說,在f o r k之后是父進(jìn)程先執(zhí)行還是子進(jìn)程先執(zhí)行是不確
4、定的。這取決于內(nèi)核所使用的調(diào)度算法。 81.6 進(jìn)程創(chuàng)建 使用fork函數(shù)得到的子進(jìn)程是父進(jìn)程的處繼承了整個(gè)進(jìn)程的地址空間,包括: 進(jìn)程上下文、進(jìn)程堆棧、內(nèi)存信息、打開的文件描述符、信號(hào)控制設(shè)置、進(jìn)程優(yōu)先級(jí)、進(jìn)程組號(hào)、當(dāng)前工作目錄、根目錄、資源限制、控制終端等。9 父、子進(jìn)程之間的區(qū)別是:fork的返回值; 進(jìn)程I D、不同的父進(jìn)程I D;子進(jìn)程的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設(shè)置為0;父進(jìn)程設(shè)置的鎖,子進(jìn)程不繼承;子進(jìn)程的未決告警被清除;子進(jìn)程的未決信號(hào)集設(shè)置為空
5、集。Fork 例如:fork.c101.7 vfork函數(shù) vfork函數(shù)的調(diào)用序列和返回值與fork相同,但兩者的語義不同。 現(xiàn)在很多的實(shí)現(xiàn)并不做一個(gè)父進(jìn)程數(shù)據(jù)段和堆的完全拷貝,因?yàn)樵趂 o r k之后經(jīng)常跟隨著exec。作為替代,使用了在寫時(shí)復(fù)制( copy-on-Write, COW)的技術(shù)。這些區(qū)域由父、子進(jìn)程共享,而且內(nèi)核將它們的存取許可權(quán)改變?yōu)橹蛔x的。如果有進(jìn)程試圖修改這些區(qū)域,則內(nèi)核為有關(guān)部分,典型的是虛存系統(tǒng)中的“頁”,做一個(gè)拷貝。如:uclinux中的進(jìn)程創(chuàng)建。111.8 exec函數(shù)在用f o r k函數(shù)創(chuàng)建子進(jìn)程后,子進(jìn)程往往要調(diào)用一種e x e c函數(shù)以執(zhí)行另一個(gè)程序。
6、當(dāng)進(jìn)程調(diào)用一種e x e c函數(shù)時(shí),該進(jìn)程完全由新程序代換,而新程序則從其m a i n函數(shù)開始執(zhí)行。因?yàn)檎{(diào)用e x e c并不創(chuàng)建新進(jìn)程,所以前后的進(jìn)程I D并未改變。e x e c只是用另一個(gè)新程序替換了當(dāng)前進(jìn)程的正文、數(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 );六個(gè)函數(shù)返回:若出錯(cuò)則為- 1,若成功則不返回131.8 exec函數(shù)參數(shù)表
8、的傳遞有關(guān)( l表示表( list ),v表示矢量( vector ) );e:可傳遞新進(jìn)程環(huán)境變量,execle、execve;p:可執(zhí)行文件查找方式為文件名,execlp、execvp;例如:execlp.c, execl.c, execle.c, execve.c141.9 exit和_exitexit和_exit用于中止進(jìn)程;_exit的作用:直接使進(jìn)程停止運(yùn)行,清除其使用的內(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進(jìn)程運(yùn)行調(diào)用退出處理函數(shù)清除I
9、/O緩沖調(diào)用exit系統(tǒng)調(diào)用進(jìn)程終止運(yùn)行_exitexit161.10 wait和waitpid函數(shù)當(dāng)一個(gè)進(jìn)程正?;虍惓=K止時(shí),內(nèi)核就向其父進(jìn)程發(fā)送SIGCHLD信號(hào)。因?yàn)樽舆M(jìn)程終止是個(gè)異步事件(這可以在父進(jìn)程運(yùn)行的任何時(shí)候發(fā)生),所以這種信號(hào)也是內(nèi)核向父進(jìn)程發(fā)的異步通知。父進(jìn)程可以忽略該信號(hào),或者提供一個(gè)該信號(hào)發(fā)生時(shí)即被調(diào)用執(zhí)行的函數(shù)(信號(hào)處理程序)。對(duì)于這種信號(hào)的系統(tǒng)默認(rèn)動(dòng)作是忽略它。wait函數(shù)用于使父進(jìn)程阻塞,直到一個(gè)子進(jìn)程結(jié)束或者該進(jìn)程接收到一個(gè)指定信號(hào)為止。17調(diào)用wait或waitpid的進(jìn)程可能會(huì):阻塞(如果其所有子進(jìn)程都還在運(yùn)行)。帶子進(jìn)程的終止?fàn)顟B(tài)立即返回(如果一個(gè)子進(jìn)程已
10、終止,正等待父進(jìn)程存取其終止?fàn)顟B(tài))。出錯(cuò)立即返回(如果它沒有任何子進(jìn)程)。18#include #include pid_t wait(int * status) ;pid_t waitpid(pid_t pid, int * status, int options) ;兩個(gè)函數(shù)返回:若成功則為子進(jìn)程I D號(hào),若出錯(cuò)則為-1. Status選項(xiàng),為空時(shí),代表任意狀態(tài)結(jié)束的子進(jìn)程,若不為空,則代表指定狀態(tài)結(jié)束的子進(jìn)程。19wait和waitpid函數(shù)的區(qū)別:在一個(gè)子進(jìn)程終止前, wait 使其調(diào)用者阻塞,而waitpid 有一選擇項(xiàng),可使調(diào)用者不阻塞。waitpid并不等待第一個(gè)終止的子進(jìn)程它有
11、若干個(gè)選擇項(xiàng),可以控制它所等待的特定進(jìn)程。實(shí)際上wait函數(shù)是waitpid函數(shù)的一個(gè)特例。20對(duì)于waitpid的p i d參數(shù)的解釋與其值有關(guān):pid = -1 等待任一子進(jìn)程。于是在這一功能方面waitpid與wait等效。pid 0 等待其進(jìn)程I D與p i d相等的子進(jìn)程。pid = 0 等待其組I D等于調(diào)用進(jìn)程的組I D的任一子進(jìn)程。pid -1 等待其組I D等于p i d的絕對(duì)值的任一子進(jìn)程。21waitpid函數(shù)提供了wait函數(shù)沒有提供的三個(gè)功能:(1) waitpid等待一個(gè)特定的進(jìn)程(而w a i t則返回任一終止子進(jìn)程的狀態(tài))。 (2) waitpid提供了一個(gè)w
12、a i t的非阻塞版本。有時(shí)希望取得一個(gè)子進(jìn)程的狀態(tài),但不想阻塞。(3) waitpid支持作業(yè)控制(以WUNTRACED選擇項(xiàng))。例如:waitpid.c222. 守護(hù)進(jìn)程2.1 概述守護(hù)進(jìn)程( daemon)是生存期長(zhǎng)的一種進(jìn)程。它們常常在系統(tǒng)引導(dǎo)裝入時(shí)起動(dòng),在系統(tǒng)關(guān)閉時(shí)終止。因?yàn)樗鼈儧]有控制終端,所以說它們是在后臺(tái)運(yùn)行的。linux系統(tǒng)有很多守護(hù)進(jìn)程,它們執(zhí)行日常事物活動(dòng)。232.2 守護(hù)進(jìn)程特征所有守護(hù)進(jìn)程都以超級(jí)用戶(用戶I D為0)的優(yōu)先權(quán)運(yùn)行。沒有一個(gè)守護(hù)進(jìn)程具有控制終端終端名稱設(shè)置為問號(hào)(?)、終端前臺(tái)進(jìn)程組I D設(shè)置為1。缺少控制終端可能是精靈進(jìn)程調(diào)用了s e t s i d
13、的結(jié)果。除u p d a t e以外的所有精靈進(jìn)程都是進(jìn)程組的首進(jìn)程,對(duì)話期的首進(jìn)程,而且是這些進(jìn)程組和對(duì)話期中的唯一進(jìn)程。u p d a t e是它所在進(jìn)程組和對(duì)話期(中的唯一進(jìn)程,但是該進(jìn)程組的首進(jìn)程(可能也是該對(duì)話期的首進(jìn)程)已經(jīng)終止。所有這些守護(hù)進(jìn)程的父進(jìn)程都是i n i t進(jìn)程。242.3 守護(hù)進(jìn)程編程規(guī)則(5步)(1)創(chuàng)建子進(jìn)程,父進(jìn)程退出: 首先做的是調(diào)用fork,然后使父進(jìn)程e x i t。這樣做實(shí)現(xiàn)了下面幾點(diǎn):第一,如果該守護(hù)進(jìn)程是由一條簡(jiǎn)單s h e l l命令起動(dòng)的,那么使父進(jìn)程終止使得s h e l l認(rèn)為這條命令已經(jīng)執(zhí)行完成。第二,子進(jìn)程繼承了父進(jìn)程的進(jìn)程組I D,但
14、具有一個(gè)新的進(jìn)程I D,這就保證了子進(jìn)程不是一個(gè)進(jìn)程組的首進(jìn)程。這對(duì)于下面就要做的setsid調(diào)用是必要的前提條件。25(2)調(diào)用setsid以創(chuàng)建一個(gè)新的會(huì)話,并擔(dān)任該會(huì)話組的組長(zhǎng)。調(diào)用setsid 作用有三個(gè): (a)成為新對(duì)話期的首進(jìn)程, (b)成為一個(gè)新進(jìn)程組的首進(jìn)程, (c)脫離控制終端。(會(huì)話組是一個(gè)或多個(gè)進(jìn)程組的集合)26setsid()函數(shù)格式:include include Pid_t setsid(void)函數(shù)成功時(shí)返回該進(jìn)程組ID, 出錯(cuò)時(shí)返回-127(3)改變當(dāng)前目錄為根目錄chdir(“/”); 從父進(jìn)程繼承過來的當(dāng)前工作目錄可能在一個(gè)mnt的文件系統(tǒng)中。因?yàn)槭刈o(hù)進(jìn)
15、程通常在系統(tǒng)再引導(dǎo)之前是一直存在的,所以如果守護(hù)進(jìn)程的當(dāng)前工作目錄在一個(gè)mnt文件系統(tǒng)中,那么該文件系統(tǒng)就不能被拆卸。28(4)重設(shè)文件權(quán)限掩碼 umask(0);由繼承得來的文件方式創(chuàng)建屏蔽字可能會(huì)拒絕設(shè)置某些許可權(quán)。例如,若守護(hù)進(jìn)程要?jiǎng)?chuàng)建一個(gè)組可讀、寫的文件,而繼承的文件方式創(chuàng)建屏蔽字,屏蔽了這兩種許可權(quán),則所要求的組可讀、寫就不能起作用。29(5) 關(guān)閉不再需要的文件描述符。用fork函數(shù)創(chuàng)建的子程序會(huì)從父進(jìn)程那繼承一些已經(jīng)打開的文件,由此為使守護(hù)進(jìn)程就不再持有從其父進(jìn)程繼承來的某些文件描述符。但是,究竟關(guān)閉哪些描述符則與具體的精靈進(jìn)程有關(guān),可以程序中的方法關(guān)閉所有文件描述符。for (
16、i=0;iMAX)close(i);守護(hù)例如:dameon.c303. 守護(hù)進(jìn)程的出錯(cuò)處理由于守護(hù)進(jìn)程完全脫離了控制終端,因此,不能像其他程序一樣通過輸出錯(cuò)誤信息到控制臺(tái)的方式來通知程序員。通常的辦法是使用syslog服務(wù),將出錯(cuò)信息輸入到“/var/log/message”系統(tǒng)日志文件中去。Syslog是linux中的系統(tǒng)日志管理服務(wù)通過守護(hù)進(jìn)程syslog來維護(hù)。313.1 syslog函數(shù)說明Openlog函數(shù)用于打開系統(tǒng)日志服務(wù)的一個(gè)連接;Syslog函數(shù)用于向日志文件中寫入消息,在這里可以規(guī)定消息的優(yōu)先級(jí)、消息的輸出格式等;Closelog函數(shù)用于關(guān)閉系統(tǒng)日志服務(wù)的連接。323.1.
17、1 syslog函數(shù)格式(1)openlog函數(shù)#include void openlog(char * ident, int option, int facility) ;Ident:要向每個(gè)消息加入的字符串,通常為程序的名稱;33option參數(shù):LOG_CONS: 若日志消息不能通過發(fā)送至syslogd ,則將該消息寫至控制臺(tái);LOG_NDELAY: 立即打開UNIX域數(shù)據(jù)報(bào)套接口至syslsgd守護(hù)進(jìn)程。通常,在記錄第一條消息之前,該套接口不打開。LOG_PERROR:除將日志消息發(fā)送給syslog外,還將它寫至標(biāo)準(zhǔn)出錯(cuò)(stderr)。LOG_PID:每條消息都包含進(jìn)程ID,此選擇項(xiàng)可供對(duì)每個(gè)請(qǐng)求都fork一個(gè)子進(jìn)程的守護(hù)進(jìn)程使用。34openlog的facility參數(shù)LOG_AUTH 授權(quán)程序: login.su,getty, LOG_CRONcron 和 atLOG_DAEMON 系統(tǒng)守護(hù)進(jìn)程:, LOG_KERN 內(nèi)核產(chǎn)生的消息LOG_LOCAL07 保留由本地使用LOG_LPR 行打系統(tǒng):lpd, lpc, LOG_MAIL 郵件系統(tǒng)LOG_NEWSU senet網(wǎng)絡(luò)新聞系統(tǒng)LOG_SYSLOG syslogd守護(hù)進(jìn)程本身LOG_USER 來自其他用戶進(jìn)程的消息LOG_UUCP UUCP系統(tǒng)35(2)syslog函數(shù)include vo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度包裝設(shè)計(jì)創(chuàng)新大賽參賽作品使用權(quán)合同6篇
- 2025年滬科版八年級(jí)物理上冊(cè)月考試卷含答案
- 2025年人教新課標(biāo)三年級(jí)語文下冊(cè)階段測(cè)試試卷含答案
- 2025年人教版七年級(jí)科學(xué)上冊(cè)月考試卷
- 2025年中圖版九年級(jí)地理下冊(cè)月考試卷
- 2024年繪畫講師聘請(qǐng)書3篇
- 2024消防工程驗(yàn)收信息共享與保密協(xié)議
- 2024新版房產(chǎn)中介個(gè)人執(zhí)業(yè)合作合同版
- 二零二五年度房產(chǎn)交易稅費(fèi)繳納與退還合同范本3篇
- 2025年魯教五四新版九年級(jí)科學(xué)上冊(cè)階段測(cè)試試卷
- 定崗定編定員實(shí)施方案(一)
- 太平洋戰(zhàn)爭(zhēng)課件
- 河北省房屋建筑和市政基礎(chǔ)設(shè)施施工圖設(shè)計(jì)文件審查要點(diǎn)(版)
- 醫(yī)院院長(zhǎng)年終工作總結(jié)報(bào)告精編ppt
- 綠化養(yǎng)護(hù)重點(diǎn)難點(diǎn)分析及解決措施
- “三排查三清零”回頭看問題整改臺(tái)賬
- 造價(jià)咨詢結(jié)算審核服務(wù)方案
- 中國(guó)人民財(cái)產(chǎn)保險(xiǎn)股份有限公司機(jī)動(dòng)車綜合商業(yè)保險(xiǎn)條款
- 八年級(jí)物理上冊(cè)計(jì)算題精選(50道)
- 礦井反風(fēng)演習(xí)方案
- 2022年脛骨平臺(tái)三柱理論
評(píng)論
0/150
提交評(píng)論