第7章進程控制程序設計_第1頁
第7章進程控制程序設計_第2頁
第7章進程控制程序設計_第3頁
第7章進程控制程序設計_第4頁
第7章進程控制程序設計_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章進程控制程序設計7.1項目目標7.2進程控制概述7.3進程控制編程7.4守護進程7.5

農(nóng)業(yè)信息采集控制系統(tǒng)主程序設計7.1項目目標通過本章節(jié)的學習,理解進程控制的方法。設計數(shù)據(jù)采集顯示系統(tǒng)的主進程,實現(xiàn)主進程基本框架。本章知識點:Linux下的進程概念Linux進程管理相關(guān)的系統(tǒng)調(diào)用守護進程7.2進程控制概述進程及相關(guān)概念進程控制塊和標識符進程調(diào)度進程同步互斥Linux進程的管理常用命令7.2.1進程及相關(guān)概念進程的概念首先是在60年代初期由MIT的Multics系統(tǒng)和IBM的TSS/360系統(tǒng)引入的。在40多年的發(fā)展中,人們對進程有過各種各樣的定義?,F(xiàn)列舉較為著名的幾種。進程是一個獨立的可調(diào)度的活動(E.Cohen,D.Jofferson)進程是一個抽象實體,當它執(zhí)行某個任務時,要分配和釋放各種資源(P.Denning)進程是可以并行執(zhí)行的計算單位。(S.E.Madnick,J.T.Donovan)以上進程的概念都不相同,但其本質(zhì)是一樣的。它指出了進程是一個程序的一次執(zhí)行的過程,同時也是資源分配的最小單元。它和程序是有本質(zhì)區(qū)別的,程序是靜態(tài)的,它是一些保存在磁盤上的指令的有序集合,沒有任何執(zhí)行的概念;而進程是一個動態(tài)的概念,它是程序執(zhí)行的過程,包括了動態(tài)創(chuàng)建、調(diào)度和消亡的整個過程。它是程序執(zhí)行和資源管理的最小單位。進程:進程是一個具有一定獨立功能的程序的一次運行活動。7.2.1進程及相關(guān)概念進程的要素:要有一段程序代碼供進程去執(zhí)行,我們稱之為代碼段。要擁有專用的系統(tǒng)堆??臻g,我們稱之為堆棧段。存放的是子程序的返回地址、子程序的參數(shù)以及程序的局部變量等。要有一個由task_struct結(jié)構(gòu)定義的進程控制塊。進程控制塊包含了進程的描述信息、控制信息以及資源信息,它是進程的一個靜態(tài)描述。要有獨立的存儲空間,我們稱之為數(shù)據(jù)段?!皵?shù)據(jù)段”存放的是全局變量、常數(shù)以及動態(tài)數(shù)據(jù)分配的數(shù)據(jù)空間,根據(jù)存放的數(shù)據(jù),數(shù)據(jù)段又可以分成普通數(shù)據(jù)段(包括可讀可寫/只讀數(shù)據(jù)段,存放靜態(tài)初始化的全局變量或常量)、BSS數(shù)據(jù)段(存放未初始化的全局變量)以及堆(存放動態(tài)分配的數(shù)據(jù))。7.2.1進程及相關(guān)概念進程的類型:交互進程:由一個Shell啟動的進程,其既可以在前臺運行,也可以在后臺運行。批處理進程:這種進程和終端沒有關(guān)系,是一個進程序列。守護進程:伴隨系統(tǒng)啟動而啟動的進程,在后臺運行,與終端無關(guān)。7.2.1進程及相關(guān)概念進程的狀態(tài):執(zhí)行態(tài):該進程正在運行,即進程正在占用CPU就緒態(tài):進程已經(jīng)具備執(zhí)行的一切條件,正在等待分配CPU的處理時間片。等待(阻塞)態(tài):進程不能使用CPU,若等待事件發(fā)生(等待的資源分配到)則可將其喚醒。7.2.1進程及相關(guān)概念進程的關(guān)系:Linux系統(tǒng)中所有進程都是相互聯(lián)系的,程序創(chuàng)建的進程之間具有父/子關(guān)系,創(chuàng)建的多個進程之間是兄弟關(guān)系。Linux內(nèi)核創(chuàng)建了進程ID為0及進程ID為1的進程,其中進程ID為1的進程是一個初始化進程init,Linux中所有進程都是由init進程派生而來。在Shell下執(zhí)行程序是Shell進程的子進程,進程中可以創(chuàng)建新的子進程,從而產(chǎn)生一顆進程樹。7.2.1進程及相關(guān)概念進程特點動態(tài)性動態(tài)性是進程最基本的特征并發(fā)性指多個進程實體,同時存在于內(nèi)存中,能在同一時間內(nèi)同時運行,并發(fā)是進程的重要特征,也是OS的重要特征。獨立性進程實體是一個能獨立運行的基本單位,同時也是獲得資源,獨立調(diào)度的基本單位異步性進程按各自獨立的,不可預知的速度向前執(zhí)行7.2.2進程控制塊和標識符進程是Linux系統(tǒng)的基本調(diào)度和管理資源的單位,它是通過進程控制塊來描述的。進程控制塊包含了進程的描述信息、控制信息以及資源信息,它是進程的一個靜態(tài)描述。在Linux中,進程控制塊是一個task_struct結(jié)構(gòu)(include/linux/sched.h)。在Linux中最主要的進程標識有進程號(PID,ProcessIdenityNumber)和它的父進程號(PPID,parentprocessID)。其中PID惟一地標識一個進程。PID和PPID都是非零的正整數(shù)。在Linux中獲得當前進程的PID和PPID的系統(tǒng)調(diào)用函數(shù)為getpid()和getppid(),通常程序獲得當前進程的PID和PPID之后,可以將其寫入日志文件以做備份。另外,進程標識還有用戶和用戶組標識、進程時間、資源利用情況等7.2.3進程調(diào)度Linux內(nèi)核用進程調(diào)度器來決定下一個時間片應該分給哪個進程。什么是時間片?Linux中每個進程只允許運行很短的時間(200ms),當這個時間用完后,系統(tǒng)將選擇另一個進程運行,原來的進程必須等待一定時間再繼續(xù)運行。這段時間就稱為時間片。調(diào)度器選擇進程時根據(jù)進程的優(yōu)先級來選擇,優(yōu)先級高的進程運行的更為頻繁。在Linux中,進程運行的時間不能超過分配給它們的時間片,它們采用的是搶先式多任務處理,所以進程的掛起和繼續(xù)執(zhí)行無需彼此間協(xié)作。7.2.4進程同步、互斥一組并發(fā)進程按一定的順序執(zhí)行的過程稱為進程間的同步。具有同步關(guān)系的一組并發(fā)進程稱為合作進程,合作進程間互相發(fā)送的信號稱為消息或事件。進程互斥是指當有若干進程都要使用某一共享資源時,任何時刻最多允許一個進程使用,其他要使用該資源的進程必須等待,直到占用該資源者釋放了該資源為止。臨界資源:操作系統(tǒng)中將一次只允許一個進程訪問的資源稱為臨界資源。進程中訪問臨界資源的那段程序代碼稱為臨界區(qū)。為實現(xiàn)對臨界資源的互斥訪問,應保證諸進程互斥的進入各自的臨界區(qū)。死鎖:多個進程因競爭資源而形成一種僵局,若無外力作用,這些進程都將永遠不能再向前推進。7.2.5

Linux下的進程管理命令啟動進程手工啟動調(diào)度啟動進程調(diào)度常用命令ps查看系統(tǒng)中的進程top動態(tài)的現(xiàn)實系統(tǒng)中的進程nice按用戶的指定的優(yōu)先級運行renice改變正在運行進程的優(yōu)先級kill終止進程bg將掛起的進程放到后臺執(zhí)行7.3Linux進程控制編程獲取進程標識符進程的創(chuàng)建:fork、vfork進程的終止:exit、_exit進程的等待:wait、waitpidexec函數(shù)族守護進程7.3.1獲取進程PID獲取進程PID、PPID#include<sys/types.h>#include<unistd.h>pid_tgetpid(void)

獲取本進程ID。pid_tgetppid()

獲取父進程ID。獲取ID舉例:getpid.c#include<stdio.h>#include<unistd.h>#include<stdlib.h>intmain(){ printf(“PID=%d\n”,getpid()); printf((“PPID=%d\n”,getppid()); return0;}7.3.2進程的創(chuàng)建在Linux中創(chuàng)建一個新進程的方法是使用fork()函數(shù)。fork()函數(shù)用于從已存在的進程中創(chuàng)建一個新進程。新進程稱為子進程,而原進程稱為父進程。使用fork()函數(shù)得到的子進程是父進程的一個復制品,它從父進程處繼承了整個進程的地址空間,包括進程上下文、代碼段、進程堆棧、內(nèi)存信息、打開的文件描述符、信號控制設定、進程優(yōu)先級、進程組號、當前工作目錄、根目錄、資源限制和控制終端等,而子進程所獨有的只有它的進程號、資源使用和計時器等。因為子進程幾乎是父進程的完全復制,所以父子兩個進程會運行同一個程序。因此需要用一種方式來區(qū)分它們,并使它們照此運行,否則,這兩個進程不可能做不同的事。7.3.2進程的創(chuàng)建實際上是在父進程中執(zhí)行fork()函數(shù)時,父進程會復制出一個子進程,而且父子進程的代碼從fork()函數(shù)的返回開始分別在兩個地址空間中同時運行。從而兩個進程分別獲得其所屬fork()的返回值,其中在父進程中的返回值是子進程的進程號,而在子進程中返回0。因此,可以通過返回值來判定該進程是父進程還是子進程。同時可以看出,使用fork()函數(shù)的代價是很大的,它復制了父進程中的代碼段、數(shù)據(jù)段和堆棧段里的大部分內(nèi)容,使得fork()函數(shù)的系統(tǒng)開銷比較大,而且執(zhí)行速度也不是很快。7.3.2進程的創(chuàng)建#include<sys/types.h>#include<unistd.h>pid_tfork(void)創(chuàng)建子進程:fork的奇妙之處在于它被調(diào)用一次,卻返回兩次,它可能有三種不同的返回值在父進程中,fork返回新創(chuàng)建的子進程的PID在子進程中,fork返回0如果出現(xiàn)錯誤,fork返回一個負值(-1)7.3.2進程的創(chuàng)建#include<sys/types.h>

實例:fork1.c#include<unistd.h>intmain(){ pid_tpid;

//此時僅有一個進程

pid=fork();

//此時有兩個進程同時運行

if(pid<0) printf(“errorinfork”); elseif(pid==0) printf(“Iamthechildprocess,IDis%d\n”,getpid()); else printf(“Iamtheparentprocess,IDis%d\n”,getppid());}7.3.2進程的創(chuàng)建在pid=fork()之前,只有一個進程在執(zhí)行,但在這條語句執(zhí)行之后,就變成兩個進程在執(zhí)行了,這兩個進程的共享代碼段,將要執(zhí)行的下一條語句都是if(pid<0)。兩個進程中,原來就存在的那個進程被稱作“父進程”,新出現(xiàn)的那個進程被稱作“子進程”,父子進程的區(qū)別在于進程標識符(PID)不同。7.3.2進程的創(chuàng)建思考下面程序運行結(jié)果?#include<sys/types.h>

#include<unistd.h>intmain(){ pid_tpid; intcount=0; pid=fork();

count++; printf(“count=%d\n”,count); return0;}輸出:count=1count=17.3.2進程的創(chuàng)建count++被父進程、子進程一共執(zhí)行了兩次,為什么count的第二次輸出不等于2?子進程的數(shù)據(jù)空間、堆??臻g都會從父進程得到一個拷貝,而不是共享。在子進程中對count進行加1的操作,并沒有影響到父進程中的count值,父進程中的count值任然為0。7.3.2進程的創(chuàng)建fork有下面兩種用法:一個父進程希望復制自己,使父、子進程同時執(zhí)行不同的代碼段。這在網(wǎng)絡服務進程中比較常見,父進程等待客戶端的服務請求,當請求到達時,父進程調(diào)用fork,使子進程去處理該請求,父進程則繼續(xù)等待下一個服務請求到達。一個進程要執(zhí)行一個不同的程序。這對shell是常見的情況,這種情況下,子進程從fork返回后立即調(diào)用exec執(zhí)行。7.3.2進程的創(chuàng)建#include<sys/types.h>#include<unistd.h>pid_tvfork()功能:創(chuàng)建子進程目的:該子進程的目的是exec一個新的程序7.3.2進程的創(chuàng)建fork與vfork的區(qū)別:fork:子進程拷貝父進程的數(shù)據(jù)段、堆棧段vfork:子進程與父進程共享數(shù)據(jù)段fork:父、子進程的執(zhí)行順序不確定vfork:保證子進程先運行,在它調(diào)用了exec或exit之后,父進程運行(如果在調(diào)用這兩個函數(shù)之前子進程依賴父進程的進一步動作,則會導致死鎖)vfork舉例:#include<sys/types.h>

#include<unistd.h>intmain(){ pid_tpid; intcount=0;

pid=vfork();

count++; printf(“count=%d\n”,count); return0;}exit()和_exit()函數(shù)都是用來終止進程的。_exit()函數(shù)的作用是:直接使進程停止運行,清除其使用的內(nèi)存空間,并清除其在內(nèi)核中的各種數(shù)據(jù)結(jié)構(gòu);exit()函數(shù)則在這些基礎上做了一些包裝,在執(zhí)行退出之前加了若干道工序。exit()函數(shù)與_exit()函數(shù)最大的區(qū)別就在于exit()函數(shù)在調(diào)用exit系統(tǒng)之前要檢查文件的打開情況,把文件緩沖區(qū)中的內(nèi)容寫回文件,就是圖中的“清理I/O緩沖”一項。由于在Linux的標準函數(shù)庫中,有一種被稱作“緩沖I/O(bufferedI/O)”操作,其特征就是對應每一個打開的文件,在內(nèi)存中都有一片緩沖區(qū)。每次讀文件時,會連續(xù)讀出若干條記錄,這樣在下次讀文件時就可以直接從內(nèi)存的緩沖區(qū)中讀??;同樣,每次寫文件的時候,也僅僅是寫入內(nèi)存中的緩沖區(qū),等滿足了一定的條件(如達到一定數(shù)量或遇到特定字符等),再將緩沖區(qū)中的內(nèi)容一次性寫入文件。7.3.3進程終止7.3.3進程終止這種技術(shù)大大增加了文件讀寫的速度,但也為編程帶來了一些麻煩。比如有些數(shù)據(jù),認為已經(jīng)被寫入到文件中,實際上因為沒有滿足特定的條件,它們還只是被保存在緩沖區(qū)內(nèi),這時用_exit()函數(shù)直接將進程關(guān)閉,緩沖區(qū)中的數(shù)據(jù)就會丟失。因此,若想保證數(shù)據(jù)的完整性,就一定要使用exit()函數(shù)。7.3.3進程終止原型:void_exit(intstatus);status:該參數(shù)指定進程退出時的返回值,該返回值可以在shell中通過“echo$?”命令查看,也可以通過system函數(shù)的返回值取得,還可以在父進程中通過調(diào)用wait函數(shù)獲得。通常進程返回0表示正常退出(如exit(0)),返回非零表示異常退出(如exit(1)/exit(-1))。7.3.3進程終止例程:exit.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(){ printf(“Usingexit\n”); printf(“Thisisthecontentinbuffer”); exit(0); //_exit(0);}//對比程序運行結(jié)果,printf(“Thisisthecontentinbuffer”);后加\n結(jié)果7.3.4進程等待wait()函數(shù)是用于使父進程(也就是調(diào)用wait()的進程)阻塞,直到一個子進程結(jié)束或者該進程接到了一個指定的信號為止。如果該父進程沒有子進程或者他的子進程已經(jīng)結(jié)束,則wait()就會立即返回。waitpid()的作用和wait()一樣,但它并不一定要等待第一個終止的子進程,它還有若干選項,如可提供一個非阻塞版本的wait()功能,也能支持作業(yè)控制。實際上wait()函數(shù)只是waitpid()函數(shù)的一個特例,在Linux內(nèi)部實現(xiàn)wait()函數(shù)時直接調(diào)用的就是waitpid()函數(shù)。

7.3.4進程等待調(diào)用wait或waitpid的進程可能會:如果其所有子進程都還在運行,則父進程阻塞如果一個子進程已終止,正等待父進程獲取其終止狀態(tài),則取得該子進程的終止狀態(tài)立即返回如果它沒有任何子進程,則立即出錯返回7.3.4進程等待pid_twait(int*status);pid_twaitpid(pid_tpid,int*status,intoptions);status:用于保存子進程的結(jié)束狀態(tài)。pid:為欲等待的子進程ID,其數(shù)值意義如下:pid<-1:等待進程組ID為pid絕對值的任何子進程pid=-1:等待任何子進程,相當于wait()pid=0:等待進程組ID與目前進程相同的任何子進程pid>0:等待任何子進程ID為pid的子進程7.3.4進程等待options:該參數(shù)提供了一些額外的選項來控制waitpid,可有以下幾個取值或它們的按位或組合:0:不是用任何選項;WNOHANG:若pid指定的子進程沒有結(jié)束,則waitpid()函數(shù)返回0,不予以等待。若結(jié)束,則返回該子進程的ID。WUNTRACED:若子進程進入暫停狀態(tài),則馬上返回,但子進程的結(jié)束狀態(tài)不予以理會。返回值:-1:調(diào)用失敗。其他:調(diào)用成功,返回值為退出的子進程ID。7.3.4進程等待例程wait.c#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>#include<stdlib.h>intmain(){ pid_tpc,pr; pc=fork(); if(pc==0){ printf(“thisischildprocesswithpidof%d\n”,getpid()); sleep(10);} elseif(pc>0){ pr=wait(NULL); printf(“Icatchedachildprocesswithpidof%d\n”,pr); } exit(0);}7.3.4進程等待例程:waitpid.cexec函數(shù)族就提供了一個在進程中啟動另一個程序執(zhí)行的方法。它可以根據(jù)指定的文件名或目錄名找到可執(zhí)行文件,并用它來取代原調(diào)用進程的數(shù)據(jù)段、代碼段和堆棧段,在執(zhí)行完之后,原調(diào)用進程的內(nèi)容除了進程號外,其他全部被新的進程替換了。另外,這里的可執(zhí)行文件既可以是二進制文件,也可以是Linux下任何可執(zhí)行的腳本文件。使用exec函數(shù)族主要有兩種情況當進程認為自己不能再為系統(tǒng)和用戶做出任何貢獻時,就可以調(diào)用exec函數(shù)族中的任意一個函數(shù)讓自己重生;如果一個進程想執(zhí)行另一個程序,那么它就可以調(diào)用fork()函數(shù)新建一個進程,然后調(diào)用exec函數(shù)族中的任意一個函數(shù),這樣看起來就像通過執(zhí)行應用程序而產(chǎn)生了一個新進程(這種情況非常普遍)。7.3.5

exec函數(shù)族7.3.5

exec函數(shù)族exec系列函數(shù)共有6種不同的形式,統(tǒng)稱為exec函數(shù)族。我們把這6個函數(shù)劃分為兩組:execl、execle和execlpexecv、execve和execvp這兩組函數(shù)的不同在于exec后的第一個字符,第一組是l,在此稱為execl系列;第二組是v,在此稱為execv系列。這里的l是list(列表)的意思,表示execl系列函數(shù)需要將每個命令行參數(shù)作為函數(shù)的參數(shù)進行傳遞。而v是vector(矢量)的意思,表示execv系列函數(shù)將所有函數(shù)包裝到一個矢量數(shù)組中傳遞即可。7.3.5

exec函數(shù)族exec函數(shù)的原型為:intexecv(constchar*path,char*

const

argv[]);intexecve(constchar*path,char*

const

argv[],char*constenvp[]);intexecvp(constchar*file,char*

const

argv[]);intexecl(constchar*path,constchar*arg,...);intexecle(constchar*path,constchar*arg,char*constenvp[]);intexeclp(constchar*file,constchar*arg,...);參數(shù)說明:path:要執(zhí)行的程序路徑??梢允墙^對路徑或者是相對路徑。在execv、execve、execl和execle這四個函數(shù)中,使用帶路徑名的文件名作為參數(shù)。7.3.5

exec函數(shù)族file:要執(zhí)行的程序名稱。如果該參數(shù)中包含“/”字符,則視為路徑名直接執(zhí)行;否則視為單獨的文件名,系統(tǒng)將根據(jù)PATH環(huán)境變量指定的路徑順序搜索指定的文件。argv:命令行參數(shù)的矢量數(shù)組。envp:帶有該參數(shù)的exec函數(shù),可以在調(diào)用時指定一個環(huán)境變量數(shù)組。其他不帶該參數(shù)的exec函數(shù),則使用調(diào)用進程的環(huán)境變量。arg:程序的第0個參數(shù),即程序名自身,相當于argv[0]。...:命令行參數(shù)列表。調(diào)用相應程序時有多少命令行參數(shù),就需要有多少個輸入?yún)?shù)項。注意:在使用此類函數(shù)時,在所有命令行參數(shù)的最后,應該增加一個空的參數(shù)項(NULL),表明命令行參數(shù)結(jié)束。返回值:-1:表明調(diào)用exec失敗。無返回:表明調(diào)用成功7.3.5

exec函數(shù)族#include<unistd.h>intexecl(constchar*path,constchar*arg1,……)參數(shù):path:被執(zhí)行程序名(含完整路徑)arg1-argn:被執(zhí)行程序所需的命令行參數(shù),含程序名。以空指針NULL結(jié)束例:execl.cintmain(){ execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char*)0);}7.3.5

exec函數(shù)族#include<unistd.h>intexeclp(constchar*file,constchar*arg1,……)參數(shù):file:被執(zhí)行程序名(不含路徑,將從path環(huán)境變量中查找該程序)arg1-argn:被執(zhí)行程序所需的命令行參數(shù),含程序名。以空指針NULL結(jié)束例:execlp.cintmain(){ execlp(“l(fā)s”,”ls”,”-al”,”/etc/passwd”,(char*)0);}7.3.5

exec函數(shù)族#include<unistd.h>intexecv(constchar*path,char*constargv[])參數(shù):path:被執(zhí)行程序名(含完整路徑)argv[]:被執(zhí)行程序所需的命令行參數(shù)數(shù)組例:execv.cintmain(){ char*argv[]={“l(fā)s”,”-al”,”/etc/passwd”,(char*)0}; execv(“/bin/ls”,argv);}7.3.5

exec函數(shù)族#include<unistd.h>intexecve(constchar*path,char*constargv[],char*constenvp[])參數(shù):path:被執(zhí)行程序名(含完整路徑)argv[]:被執(zhí)行程序所需的命令行參數(shù)數(shù)組envp[]:指向環(huán)境字符串指針數(shù)組例:execve.cintmain(){ char*argv[]={“l(fā)s”,”-al”,”/etc/passwd”,(char*)0}; char*envp[]={“PATH=/tmp”,”USER=wxq”,NULL}; if(fork()==0) { if(execve(“/usr/bin/env”,arg,envp)<0) printf(“Execveerror\n”); } }7.3.5

exec函數(shù)族intsystem(constchar*string)功能:調(diào)用fork產(chǎn)生子進程,由子程序來調(diào)用/bin/sh–cstring來執(zhí)行參數(shù)string所代表的命令。與exec不同的是system將外部可執(zhí)行程序加載執(zhí)行完畢后繼續(xù)返回調(diào)用進程。例:system.c#include<stdlib.h>intmain(){ system(“l(fā)s–al/etc/passwd”);}守護進程就是后臺服務進程,它是一個生存期較長的進程,通常獨立于控制終端并且周期性地執(zhí)行某種任務或等待處理某些發(fā)生的事件。守護進程常常在系統(tǒng)引導載入時啟動,在系統(tǒng)關(guān)閉時終止。Linux有很多系統(tǒng)服務,大多數(shù)服務都是通過守護進程實現(xiàn)的,守護進程還能完成許多系統(tǒng)任務,例如,偵聽網(wǎng)絡接口服務xinetd、打印進程lqd等(這里的尾字母d是Daemon的意思)。在Linux中,每一個系統(tǒng)與用戶進行交流的界面稱為終端,每一個從此終端開始運行的進程都會依附于這個終端,這個終端就稱為這些進程的控制終端,當控制終端被關(guān)閉時,相應的進程都會自動關(guān)閉。但是守護進程卻能夠突破這種限制

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論