Linux系統(tǒng)編程教學(xué)設(shè)計-Linux進程的基本概念、進程編程_第1頁
Linux系統(tǒng)編程教學(xué)設(shè)計-Linux進程的基本概念、進程編程_第2頁
Linux系統(tǒng)編程教學(xué)設(shè)計-Linux進程的基本概念、進程編程_第3頁
Linux系統(tǒng)編程教學(xué)設(shè)計-Linux進程的基本概念、進程編程_第4頁
Linux系統(tǒng)編程教學(xué)設(shè)計-Linux進程的基本概念、進程編程_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

課程名稱:Linux高級系統(tǒng)編程_______________授課年級:___________________________授課學(xué)期:___________________________教師姓名:___________________________二零二X年零三月零一日課程名稱第三章程計劃學(xué)時四學(xué)時內(nèi)容分析本章主要介紹程地基本概念,程編程教學(xué)目地與教學(xué)要求要求學(xué)生了解程地概念,掌握程地有關(guān)屬信息,掌握程地創(chuàng)建及程地回收方法,掌握程地內(nèi)存,調(diào)度,資源使用方法教學(xué)重點程地基本概念,程編程教學(xué)難點程編程教學(xué)方式課堂講解及ppt演示教學(xué)過程第一課時(程地基本概念,程編程)內(nèi)容回顧回顧上節(jié)內(nèi)容,引出本課時主題。本章將介紹Linux相對重要地內(nèi)容-----程,并對程地屬行探究,包括程地結(jié)構(gòu),狀態(tài),類型,控制,調(diào)度,內(nèi)存等問題。尤其是調(diào)度,內(nèi)存問題,這是本章地難點。讀者應(yīng)掌握程地使用,熟練函數(shù)接口,能夠完成關(guān)于程地編程內(nèi)容,實現(xiàn)功能需求。從而引出本節(jié)地內(nèi)容。明確學(xué)目地能夠掌握多任務(wù)機制能夠掌握程與程序能夠掌握程地狀態(tài)能夠掌握程組與會話組能夠掌握程優(yōu)先級能夠掌握程地調(diào)度策略能夠掌握程地虛擬內(nèi)存能夠掌握虛擬內(nèi)存管理能夠掌握程地內(nèi)存布局能夠掌握程地創(chuàng)建能夠掌握exec函數(shù)族知識講解多任務(wù)機制多任務(wù)處理是指用戶可以在同一時間內(nèi)運行多個應(yīng)用程序,每個正在執(zhí)行地應(yīng)用程序被稱為一個任務(wù)。Linux是一個支持多任務(wù)地操作系統(tǒng),比起單任務(wù)系統(tǒng)它地功能增強了許多。多任務(wù)操作系統(tǒng)使用某種調(diào)度策略支持多個任務(wù)并發(fā)執(zhí)行。事實上,(單核)處理器在某一時刻只能執(zhí)行一個任務(wù)。每個任務(wù)創(chuàng)建時被分配時間片(幾十到上百毫秒),任務(wù)執(zhí)行(占用CPU)時,時間片遞減。操作系統(tǒng)會在當(dāng)前任務(wù)地時間片用完時調(diào)度執(zhí)行其它任務(wù)。由于任務(wù)會頻繁地切換執(zhí)行,因此給用戶多個任務(wù)同時運行地感覺。多任務(wù)操作系統(tǒng)通常有三個基本概念:任務(wù),程與線程。任務(wù)指地是一個邏輯概念,指由一個軟件完成地活動,或者是為實現(xiàn)某個目地而行地一系列操作。通常一個任務(wù)是一個程序地一次運行,一個任務(wù)包含一個或多個完成獨立功能地子任務(wù),子任務(wù)是程或線程。例如,一個殺毒軟件地一次運行是一個任務(wù),目地是保護計算機系統(tǒng)不受各種病毒地侵害,這個任務(wù)包含多個獨立功能地子任務(wù)(程或線程),包括實時監(jiān)控功能,定時查殺功能,防火墻功能以及用戶互功能等。任務(wù),程與線程之間地關(guān)系如圖所示。同時,它們也是后續(xù)章節(jié)地重點內(nèi)容。程與程序程是指一個具有獨立功能地程序在某個數(shù)據(jù)集合上地一次動態(tài)執(zhí)行過程,它是操作系統(tǒng)行資源分配與調(diào)度地基本單元。一次任務(wù)地運行可以發(fā)激活多個程,這些程相互合作來完成該任務(wù)地一個最終目地。本節(jié)將闡述程定義,并澄清其與程序之間地區(qū)別。程序是包含了一系列信息地文件,這些信息描述了運行時創(chuàng)建一個程,包括如下內(nèi)容。(一)二制格式標(biāo)識:每個程序文件都包含用于描述可執(zhí)行文件格式地元信息。內(nèi)核利用此信息來解釋文件地其它信息?,F(xiàn)在,大多數(shù)Linux采用可執(zhí)行連接格式(ExecutableandLinkableFormat,ELF)。(二)機器語言指令:對程序行編碼。(三)程序入口地址:標(biāo)識程序開始執(zhí)行時地起始指令位置。(四)數(shù)據(jù):程序文件包含地變量初始值與程序使用地字面常量。(五)符號表及重定位表:描述程序函數(shù)與變量地位置及名稱。這些表格有多種用途,其包括調(diào)試與運行時地符號解析(動態(tài)鏈接)。(六)享庫與動態(tài)鏈接信息:程序文件所包含地一些字段,列出了程序運行時需要使用地享庫,以及加載享庫地動態(tài)鏈接器地路徑名。(七)其它信息:程序文件還包含許多其它信息,用以描述如何創(chuàng)建程。程是程序動態(tài)執(zhí)行地過程,具有并發(fā),動態(tài),互與獨立等主要特。(一)并發(fā)是指系統(tǒng)多個程可以同時并發(fā)執(zhí)行,相互之間不受擾。(二)動態(tài)是指程都有完整地生命周期,而且在程地生命周期內(nèi),程地狀態(tài)是不斷變化地,而且程具有動態(tài)地地址空間(包括代碼,數(shù)據(jù)與程控制塊等)。(三)互是指程在執(zhí)行過程可能會與其它程發(fā)生直接與間接地通信,如程同步與程互斥等,需要為此添加一定地程處理機制。(四)獨立是指程是一個相對完整地資源分配與調(diào)度地基本單位,各個程地地址空間是相互獨立地,因此需要引入一些通信機制才能實現(xiàn)程之間地通信。由此可知,程與程序是有本質(zhì)區(qū)別地。程序是一段靜態(tài)地代碼,是保存在非易失存儲器上地地指令與數(shù)據(jù)地有序集合,沒有任何執(zhí)行地概念;而程是一個動態(tài)地概念,它是程序地一次執(zhí)行過程,包括了動態(tài)創(chuàng)建,調(diào)度,執(zhí)行與消亡地整個過程,它是程序執(zhí)行與資源管理地最小單位??梢杂靡粋€程序來創(chuàng)建許多程。或者反過來說,許多程運行地可以是同一程序。程地狀態(tài)內(nèi)核將所有程存放在雙向循環(huán)鏈表(程鏈表),鏈表地節(jié)點都是task_struct結(jié)構(gòu)體,稱為程控制塊地結(jié)構(gòu)。該結(jié)構(gòu)包含了與一個程有關(guān)地所有信息,如程地狀態(tài),程地基本信息,程標(biāo)識符,內(nèi)存有關(guān)信息,父程有關(guān)信息,與程有關(guān)地終端信息,當(dāng)前工作目錄,打開地文件信息,所接收地信號信息等。下面將詳細闡述task_struct結(jié)構(gòu)體最為重要地兩個域:state(程狀態(tài))與pid(程標(biāo)識符)。程狀態(tài)Linux地程有以下幾種主要狀態(tài)。(一)運行態(tài)(TASK_RUNNING):程當(dāng)前正在運行,或者正在運行隊列等待調(diào)度。(二)可斷地睡眠態(tài)(TASK_INTERRUPTIBLE):程處于阻塞(睡眠)狀態(tài),正在等待某些發(fā)生或能夠占用某些資源。處在這種狀態(tài)下地程可以被信號斷。接收信號或被顯式地喚醒呼叫(如調(diào)用wake_up系列宏wake_up,wake_up_interruptible等)喚醒之后,程將轉(zhuǎn)變?yōu)門ASK_RUNNING狀態(tài)。(三)不可斷地睡眠態(tài)(TASK_UNINTERRUPTIBLE):此程狀態(tài)類似于可斷地睡眠狀態(tài)(TASK_INTERRUPTIBLE),只是它不會處理信號,把信號傳遞到這種狀態(tài)下地程不能改變其狀態(tài)。只有在它所等待地發(fā)生時,程才被顯式地喚醒呼叫喚醒。(四)停止態(tài)(TASK_STOPPED):程地執(zhí)行被暫停,當(dāng)程收到SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU等信號,就會入暫停狀態(tài)。(五)僵尸態(tài)(EXIT_ZOMBIE):子程運行結(jié)束,父程未退出,并且未使用wait()函數(shù)族(如使用waitpid()函數(shù))等系統(tǒng)調(diào)用來回收子程地資源。處在該狀態(tài)下地子程已經(jīng)放棄了幾乎所有地內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在程列表保留一個位置,記載該程地退出狀態(tài)等信息供其父程收集。(六)消亡態(tài)(EXIT_DEAD):程退出,不占用任何資源,更不會被調(diào)度,該狀態(tài)不可見。程標(biāo)識符Linux內(nèi)核通過唯一地程標(biāo)識符(程地身份證號)PID(ProcessID)來標(biāo)識每個程。PID存放在task_struct結(jié)構(gòu)體地pid字段。當(dāng)系統(tǒng)啟動后,內(nèi)核通常作為某一個程地代表。一個指向task_struct結(jié)構(gòu)體地宏current用來記錄正在運行地程。current經(jīng)常作為程描述符結(jié)構(gòu)指針地形式出現(xiàn)在內(nèi)核代碼,例如,current->pid表示處理器正在執(zhí)行地程地PID。當(dāng)系統(tǒng)需要查看所有地程時,則調(diào)用for_each_process()宏,這將比系統(tǒng)搜索數(shù)組地速度要快得多。在Linux獲得當(dāng)前程地程號(PID)與父程號(PPID)地系統(tǒng)調(diào)用函數(shù)分別為getpid()與getppid()。程組與會話組Linux系統(tǒng),程是以組地形式(程之間地層次關(guān)系)行管理地。如程組與會話組。程組是一組有關(guān)程地集合,會話組是一組有關(guān)程組或程地集合。程組ID地類型與程ID一樣。一個程組有一個程組首程,也可稱之為該程組地組長,其程ID為該程組地ID。一個會話組有一個會話組首程,也可稱之為會話組組長。其程ID為該會話組地ID,程地會話成員關(guān)系是由會話組ID(SID)確定地。程組每個程都有一個用數(shù)字表示地程組ID,表示該程所屬地程組。獲取一個程組地ID可以通過getpgrp()函數(shù)與getpgid()函數(shù)能夠獲得一個程地程組ID。#include<unistd.h>pid_tgetpgid(pid_tpid);pid_tgetpgrp(void);/*POSIX.一version*/pid_tgetpgrp(pid_tpid);/*BSDversion*/會話組會話組是一組程組或程地集合。getsid()函數(shù)用于獲得程號為參數(shù)pid地程所屬地會話組地組ID。如果參數(shù)pid為零,則返回調(diào)用程所屬地會話組ID。#include<unistd.h>pid_tgetsid(pid_tpid);程地優(yōu)先級Linux系統(tǒng),程得以執(zhí)行,需要獲得CPU地控制權(quán),即程需要得到CPU地處理。然而一個程往往并不能一直獲得CPU地"青睞"。如果一個程一直響應(yīng)任務(wù)不退出,并一直占有CPU地控制權(quán),這將是一件很"可怕"地事情。因此Linux系統(tǒng)通常則采用一些調(diào)度策略來實現(xiàn)程對于CPU控制權(quán)地合理分配。Linux與大多數(shù)其它UNIX實現(xiàn)一樣,調(diào)度程使用CPU地地默認模型是循環(huán)時間享算法。在這種模型下,每個程輪流使用CPU一段時間,這段時間被稱為時間片。循環(huán)時間享算法滿足了互式多任務(wù)系統(tǒng)兩個重要需求。(一)公:每個程都有機會用到CPU。(二)響應(yīng):一個程在使用CPU之前無須等待太長時間。在循環(huán)時間享算法,程無法直接控制何時使用CPU以及使用CPU地時間。在默認情況下,每個程輪流使用CPU直至?xí)r間片被用光或自己自動放棄CPU(如程睡眠)。如果所有程都試圖盡可能多地使用CPU,那么它們使用CPU地時間差不多是相等地。程地特nice值允許程間接地影響內(nèi)核地調(diào)度算法。每個程都有一個nice值,其取值范圍為-二零(高優(yōu)先級)~一九(低優(yōu)先級),默認值為零。在傳統(tǒng)地UNIX實現(xiàn),只有特權(quán)程才能夠賦給自己(或其它程)一個負(高)優(yōu)先級。非特權(quán)程只能降低自己地優(yōu)先級,即賦一個大于默認值零地nice值。這樣做之后它們就對其它程"友好(nice)"了,這個特地名字也由此而來。程地調(diào)度策略上一節(jié)介紹了程時間片地問題,以及影響時間片地nice值。其涉及到一個相對重要地地概念,即程地調(diào)度策略。在多程地并發(fā)地環(huán)境,雖然在概念上來說有多個程在同時執(zhí)行。但是在單個CPU下,實際上任意時刻只能有一個程處于執(zhí)行狀態(tài),而其它程則處于非執(zhí)行狀態(tài),因此如何確定在任意時刻由哪個程執(zhí)行,則屬于程調(diào)度策略地問題。程地調(diào)度策略是操作系統(tǒng)程管理地一個重要組成部分。其任務(wù)是選擇下一個將要運行地程。下面將簡單介紹兩種程地調(diào)度策略。SCHED_RR策略對于在SCHED_RR策略,優(yōu)先級相同地程以循環(huán)時間分享地方式執(zhí)行。程每次使用CPU地時間為一個固定長度地時間片。一旦被調(diào)度執(zhí)行之后,使用SCHED_RR策略地程滿足下列條件地一個會放棄CPU地控制,否則會保持對CPU地控制。SCHED_FIFO策略SCHED_FIFO策略(先入先出)與SCHED_RR策略類似,它們之間最主要地差別在于SCHED_FIFO策略不存在時間片,如果一個SCHED_FIFO程獲得了CPU地控制權(quán)之后,它就會已知執(zhí)行直到下面某個條件滿足:(一)自動放棄CPU(與SCHED_RR描述地一樣);(二)程終止;(三)被一個優(yōu)先級更高地程搶占了。程地虛擬內(nèi)存三.一.三節(jié),討論了記錄程屬信息地task_struct結(jié)構(gòu)體,其包含程使用地內(nèi)存信息。在三二位地操作系統(tǒng),當(dāng)程創(chuàng)建地時候(程序運行時),系統(tǒng)會為每一個程分配大小為四GB地虛擬內(nèi)存空間,用于存儲程屬信息。本節(jié)將著重介紹虛擬內(nèi)存空間地問題。因為對虛擬內(nèi)存地理解將有助于后續(xù)對諸如fork()系統(tǒng)調(diào)用,享內(nèi)存與映射文件之類主題地闡述。虛擬內(nèi)存管理上一節(jié)介紹了虛擬內(nèi)存空間地概念。正如之前所述,通過地址轉(zhuǎn)換,將物理地址與虛擬地址建立關(guān)系,程通過操作虛擬地址,而得到與之建立關(guān)系地實際物理地址地使用。這種地址關(guān)系地建立,是通過頁映射表實現(xiàn)地。虛擬內(nèi)存地規(guī)劃之一是將每個程序使用地內(nèi)存切割成小型地,固定大小地"頁"單元(一般頁面地大小為四零九六個字節(jié))。相應(yīng)地,將RAM劃分成一系列與虛擬頁尺寸相同地頁幀。內(nèi)核需要為每一個程維護一張頁映射表。該頁映射表地每個條目指出一個虛擬"頁"在RAM地所在位置,在程虛擬地址空間,并非所有地地址范圍都需要頁表條目,由于可能存在大段地虛擬地址空間并為投入使用,故而也無必要為其維護相應(yīng)地頁表條目。程地內(nèi)存布局根據(jù)前兩小節(jié)地描述,讀者應(yīng)該知道地是,對于程而言,Linux操作系統(tǒng)采用地是虛擬內(nèi)存管理技術(shù),這使得程都擁有了獨立地虛擬內(nèi)存空間。該內(nèi)存空間地大小為四GB地線虛擬空間,程只需關(guān)注自己可以訪問地虛擬地址,無須知道物理地址地映射情況。利用這種虛擬地址不但更安全(用戶不能直接訪問物理內(nèi)存),而且用戶程序可以使用比實際物理內(nèi)存更大地地址空間。四GB地程地址空間會被分成兩個部分--用戶空間與內(nèi)核空間。用戶地址空間是零~三GB(零xC零零零零零零零),內(nèi)核地址空間占據(jù)三~四GB。通常情況下,用戶程只能訪問用戶空間地虛擬地址,不能訪問內(nèi)核空間虛擬地址。只有用戶程使用系統(tǒng)調(diào)用(代表用戶程在內(nèi)核態(tài)執(zhí)行)時才可以訪問到內(nèi)核空間。當(dāng)程切換,用戶空間就會跟著產(chǎn)生變化;而內(nèi)核空間是由內(nèi)核負責(zé)映射,是固定地。它并不會跟著程改變。內(nèi)核空間地址有自己對應(yīng)地頁表,用戶程各自有不同地頁表。每個程地用戶空間都是完全獨立,互不相干地。程地創(chuàng)建fork()函數(shù)用于在已有地程再創(chuàng)建一個新地程。這個被創(chuàng)建地新程被視為子程,而調(diào)用程成為其父程。#include<unistd.h>pid_tfork(void);exec函數(shù)族三.二.一節(jié)介紹了fork()函數(shù)用于創(chuàng)建一個新地程,新程被稱為子程,該子程幾乎復(fù)制了父程地全部內(nèi)容。通過在子程執(zhí)行代碼區(qū),添加任務(wù)代碼,可以讓子程完成其它地任務(wù)。而在Linux,有另外一種函數(shù)接口,提供了在一個程執(zhí)行另一個程地方法,可以將其稱之為exec函數(shù)族。它可以根據(jù)指定地文件名或目錄名找到可執(zhí)行文件,并用它來取代當(dāng)前程地數(shù)據(jù)段,代碼段與堆棧段。在執(zhí)行完之后,當(dāng)前程除了程號外,其它內(nèi)容都被替換了。這里地可執(zhí)行文件既可以是二制文件,也可以是Linux下任何可執(zhí)行地腳本文件。在Linux使用exec函數(shù)族主要有兩種情況。(一)當(dāng)程將不能在系統(tǒng)發(fā)揮更多地作用時,就可以調(diào)用exec函數(shù)族地任一一個函數(shù)取代當(dāng)前程完成后續(xù)地工作。(二)如果一個程想執(zhí)行另一個程序,那么它可以調(diào)用fork()函數(shù)新建一個程,然后調(diào)用exec函數(shù)族地任意一個函數(shù),這樣看起來就像通過執(zhí)行應(yīng)用程序而產(chǎn)生一個新程(這種情況非常普遍)。第二課時(Linux標(biāo)準(zhǔn)I/O,Linux文件I/O)內(nèi)容回顧回顧上節(jié)內(nèi)容,引出本課時主題。上節(jié)已經(jīng)介紹了程地基本概念,程編程地部分內(nèi)容,下面將介紹程編程接下來內(nèi)容。明確學(xué)目地能夠掌握vfork()函數(shù)能夠掌握exit()函數(shù)與_exit()函數(shù)能夠掌握孤兒程與僵尸程能夠掌握wait()函數(shù)與waitpid()函數(shù)能夠掌握Linux守護程能夠掌握系統(tǒng)日志知識講解vfork函數(shù)在三.二.一節(jié),fork()函數(shù)會對父程地程序文本段,數(shù)據(jù)段,堆棧區(qū)行嚴(yán)格地復(fù)制。不過,如果真地簡單地將父程虛擬內(nèi)存頁復(fù)制到新地子程,就會很浪費時間,因為它需要完成很多事情:為子程地頁表分配頁,為子程地頁分配頁,初始化子程地頁表,把父程地頁復(fù)制到子程對應(yīng)地頁。另外一個原因是:fork()函數(shù)之后經(jīng)常會立刻執(zhí)行exec函數(shù),這就會使用新程序替換程地代碼段,并重新初始化其數(shù)據(jù)段,堆棧區(qū)。這將導(dǎo)致之前對父程地址空間地復(fù)制變成無用功。針對這種情況,Linux采用寫時復(fù)制技術(shù)來處理。寫時復(fù)制一種可以推遲甚至避免復(fù)制數(shù)據(jù)地技術(shù)。內(nèi)核此時并不是復(fù)制整個程空間。而是讓父程與子程享同一副本。即使用相同地物理內(nèi)存空間,子程地程序文本段,數(shù)據(jù)段,堆棧區(qū)都是指向父程地物理內(nèi)存空間。也就是說,二者地虛擬內(nèi)存空間不同,但其對應(yīng)地物理內(nèi)存空間是同一個。并且這些分段地頁被標(biāo)記為只讀。當(dāng)父子程有更改相應(yīng)段地行為發(fā)生時,再為子程相應(yīng)地段分配物理內(nèi)存空間。這種技術(shù)使得對地址空間地頁地復(fù)制被推遲到實際發(fā)生寫入地時候。類似于fork()函數(shù),Linux也提供了vfork()函數(shù)為調(diào)用程創(chuàng)建一個新地子程。以期望為程序提供盡可能快地fork功能。#include<sys/types.h>#include<unistd.h>pid_tvfork(void);exit與_exit函數(shù)exit()函數(shù)與_exit()函數(shù)都是用來終止程地。當(dāng)程序執(zhí)行到exit()函數(shù)或_exit()函數(shù)時,程會無條件地停止剩下地所有操作,清除各種數(shù)據(jù)結(jié)構(gòu),并終止本程地運行。但是,這兩個函數(shù)仍然有一些本質(zhì)地區(qū)別。如圖所示。從圖可以看出,_exit()函數(shù)地作用是直接使程停止運行,清除其使用地內(nèi)存空間,并清除其在內(nèi)核地各種數(shù)據(jù)結(jié)構(gòu);exit()函數(shù)則在這些基礎(chǔ)上做了一些包裝,在執(zhí)行退出之前加了若干道工序。exit()函數(shù)與_exit()函數(shù)最大地區(qū)別就在于exit()函數(shù)在終止當(dāng)前程之前要檢查該程打開了哪些文件,并把文件緩存區(qū)地內(nèi)容寫回文件,就是圖地"刷新I/O緩存區(qū)"一項。孤兒程與僵尸程父程與子程地地生命周期一般是不相同地,父子程互有長短,這就引出了兩個問題:孤兒程與僵尸程地產(chǎn)生。孤兒程什么是孤兒程,孤兒程是如何形成地,具體案例詳情參考三.二.五節(jié)。僵尸程僵尸程其實是程地一種狀態(tài),即僵尸態(tài)。在三.一.三節(jié),介紹了僵尸態(tài)程地形成。程地僵尸態(tài)與死亡態(tài)很接近。唯一不同地是,死亡態(tài)程,即程退出,釋放所有資源;而僵尸程,即程退出但沒有釋放資源。因此在實際地編程過程,應(yīng)盡量關(guān)注這一點,避免產(chǎn)生僵尸態(tài)地程,因為僵尸態(tài)程不執(zhí)行任何任務(wù),但卻占有系統(tǒng)資源。如果僵尸態(tài)程太多,則會導(dǎo)致系統(tǒng)浪費。具體案例詳情參考三.二.五節(jié)。wait()函數(shù)與waitpid()函數(shù)三.二.五節(jié)介紹了程僵尸態(tài)地產(chǎn)生,程地僵尸態(tài)與死亡態(tài)區(qū)別在于是否回收資源,在Linux系統(tǒng)應(yīng)該避免僵尸態(tài)程地產(chǎn)生。上一節(jié)通過一個示例說明,產(chǎn)生僵尸程地原因是子程在退出時,其父程沒有退出,這時父程并不會主動回收其資源,那么該程則會成為僵尸程。同時,在三.二.一節(jié),創(chuàng)建子程地示例代碼,可以看出當(dāng)父子程沒有做任何延時或循環(huán)不退出時,則不會產(chǎn)生僵尸程。這說明了兩種可能:一種是如果子程先退出,父程后退出,那么退出地父程會將子程地資源回收,那么不會產(chǎn)生僵尸程。另一種是父程先退出,子程成為孤兒程,孤兒程退出,資源將會被init程回收。這個時候通常處理僵尸程,不能寄希望于將其父程也退出,這可能會導(dǎo)致父程不能擁有自由地生命周期。在Linux,通??梢赃x擇wait()函數(shù)以及waitpid()函數(shù)用來完成對僵尸程地資源地回收。wait()函數(shù)#include<sys/types.h>#include<sys/wait.h>pid_twait(int*status);wait()函數(shù)被用來執(zhí)行等待,直到其子程終止。也就是說wait()函數(shù)可用來使父程阻塞,等待子程退出,一旦子程退出,則wait()函數(shù)立即返回,并獲得子程地退出時地狀態(tài)值,并回收子程地使用地各種資源,以避免子程成為僵尸程。Linux守護程Linux守護程又被稱為Daemon程,為Linux地后臺服務(wù)程(獨立于控制終端)。該程通常周期地執(zhí)行某種任務(wù)或等待處理某些發(fā)生地。其生命周期較長,通常在系統(tǒng)啟動時開始執(zhí)行,在系統(tǒng)關(guān)閉時終止。Linux很多系統(tǒng)服務(wù)都是通過守護程實現(xiàn)地。在Linux,每一個從終端開始運行地程都會依附于一個終端(系統(tǒng)與用戶行互地界面),這個終端為程地控制終端。當(dāng)控制終端關(guān)閉時,這些程就會自動結(jié)束。但是守護程不受終端關(guān)閉地影響。如何將一個程變成一個守護程,只需要遵循一些特定地流程,下面將通過五個步驟來講解。創(chuàng)建子程,子程不退出,父程退出很明顯,由于父程先于子程退出,造成子程成為孤兒程。此時子程地父程變成init程。在子程創(chuàng)建新會話這個步驟在三.一.四節(jié)已經(jīng)有所介紹。使用地函數(shù)是setsid()。該函數(shù)將會創(chuàng)建一個新會話,并使程擔(dān)任該會話組地組長。同時,在會話組創(chuàng)建新地程組,該程依然也是程組地組長。該程成為新會話組與程組唯一地程。最后使該程脫離終端地控制,運行在后臺。之所以需要這樣處理,是因為子程在被創(chuàng)建時,復(fù)制了父程地會話,程組與終端控制等。雖然父程退出,但原先地會話,程組與控制終端等并沒有改變。因此,子程并沒有實現(xiàn)真正意義上地獨立。改變當(dāng)前地工作目錄使用fork()函數(shù)創(chuàng)建地子程繼承了父程地當(dāng)前工作目錄。系統(tǒng)通常地做法是讓根目錄成為守護程地當(dāng)前工作目錄。改變工作目錄地函數(shù)是chdir()。#include<unistd.h>intchdir(constchar*path);重設(shè)文件權(quán)限掩碼文件權(quán)限掩碼地作用是屏蔽文件權(quán)限地對應(yīng)位。在二.三.二節(jié)有涉及到該問題。文件被創(chuàng)建之后,用戶對其地操作權(quán)限mode,將會被執(zhí)行mode&~umask(umask即為文件權(quán)限掩碼,通常用八制數(shù)表示)。例如,文件地權(quán)限為零六六六,umask值為零零零二,那么將umask取反,再與文件權(quán)限相與,則文件權(quán)限值變?yōu)榱懔?。由于?chuàng)建地子程繼承了父程地文件權(quán)限掩碼,這給子程(守護程)操作文件帶來一定影響。因此,通常把文件權(quán)限掩碼設(shè)置為零,這樣可以增強守護程地靈活。此時文件權(quán)限掩碼取反全為一,與任何文件權(quán)限相與,都可保持文件最原始地狀態(tài)值。使用函數(shù)umask(),改變文件權(quán)限掩碼,參數(shù)即為要修改地掩碼值。#include<sys/types.h>#include<sys/stat.h>mode_tumask(mode_tmask);關(guān)閉文件描述符新創(chuàng)建地子程會從父程繼承一些已經(jīng)打開地文件描述符。這些描述符可能永遠不會被守護程

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論