版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章進(jìn)程控制程序設(shè)計(jì)7.1項(xiàng)目目標(biāo)7.2進(jìn)程控制概述7.3進(jìn)程控制編程7.4守護(hù)進(jìn)程7.5
農(nóng)業(yè)信息采集控制系統(tǒng)主程序設(shè)計(jì)7.1項(xiàng)目目標(biāo)通過本章節(jié)的學(xué)習(xí),理解進(jìn)程控制的方法。設(shè)計(jì)數(shù)據(jù)采集顯示系統(tǒng)的主進(jìn)程,實(shí)現(xiàn)主進(jìn)程基本框架。本章知識(shí)點(diǎn):Linux下的進(jìn)程概念Linux進(jìn)程管理相關(guān)的系統(tǒng)調(diào)用守護(hù)進(jìn)程7.2進(jìn)程控制概述進(jìn)程及相關(guān)概念進(jìn)程控制塊和標(biāo)識(shí)符進(jìn)程調(diào)度進(jìn)程同步互斥Linux進(jìn)程的管理常用命令7.2.1進(jìn)程及相關(guān)概念進(jìn)程的概念首先是在60年代初期由MIT的Multics系統(tǒng)和IBM的TSS/360系統(tǒng)引入的。在40多年的發(fā)展中,人們對(duì)進(jìn)程有過各種各樣的定義?,F(xiàn)列舉較為著名的幾種。進(jìn)程是一個(gè)獨(dú)立的可調(diào)度的活動(dòng)(E.Cohen,D.Jofferson)進(jìn)程是一個(gè)抽象實(shí)體,當(dāng)它執(zhí)行某個(gè)任務(wù)時(shí),要分配和釋放各種資源(P.Denning)進(jìn)程是可以并行執(zhí)行的計(jì)算單位。(S.E.Madnick,J.T.Donovan)以上進(jìn)程的概念都不相同,但其本質(zhì)是一樣的。它指出了進(jìn)程是一個(gè)程序的一次執(zhí)行的過程,同時(shí)也是資源分配的最小單元。它和程序是有本質(zhì)區(qū)別的,程序是靜態(tài)的,它是一些保存在磁盤上的指令的有序集合,沒有任何執(zhí)行的概念;而進(jìn)程是一個(gè)動(dòng)態(tài)的概念,它是程序執(zhí)行的過程,包括了動(dòng)態(tài)創(chuàng)建、調(diào)度和消亡的整個(gè)過程。它是程序執(zhí)行和資源管理的最小單位。進(jìn)程:進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序的一次運(yùn)行活動(dòng)。7.2.1進(jìn)程及相關(guān)概念進(jìn)程的要素:要有一段程序代碼供進(jìn)程去執(zhí)行,我們稱之為代碼段。要擁有專用的系統(tǒng)堆??臻g,我們稱之為堆棧段。存放的是子程序的返回地址、子程序的參數(shù)以及程序的局部變量等。要有一個(gè)由task_struct結(jié)構(gòu)定義的進(jìn)程控制塊。進(jìn)程控制塊包含了進(jìn)程的描述信息、控制信息以及資源信息,它是進(jìn)程的一個(gè)靜態(tài)描述。要有獨(dú)立的存儲(chǔ)空間,我們稱之為數(shù)據(jù)段。“數(shù)據(jù)段”存放的是全局變量、常數(shù)以及動(dòng)態(tài)數(shù)據(jù)分配的數(shù)據(jù)空間,根據(jù)存放的數(shù)據(jù),數(shù)據(jù)段又可以分成普通數(shù)據(jù)段(包括可讀可寫/只讀數(shù)據(jù)段,存放靜態(tài)初始化的全局變量或常量)、BSS數(shù)據(jù)段(存放未初始化的全局變量)以及堆(存放動(dòng)態(tài)分配的數(shù)據(jù))。7.2.1進(jìn)程及相關(guān)概念進(jìn)程的類型:交互進(jìn)程:由一個(gè)Shell啟動(dòng)的進(jìn)程,其既可以在前臺(tái)運(yùn)行,也可以在后臺(tái)運(yùn)行。批處理進(jìn)程:這種進(jìn)程和終端沒有關(guān)系,是一個(gè)進(jìn)程序列。守護(hù)進(jìn)程:伴隨系統(tǒng)啟動(dòng)而啟動(dòng)的進(jìn)程,在后臺(tái)運(yùn)行,與終端無關(guān)。7.2.1進(jìn)程及相關(guān)概念進(jìn)程的狀態(tài):執(zhí)行態(tài):該進(jìn)程正在運(yùn)行,即進(jìn)程正在占用CPU就緒態(tài):進(jìn)程已經(jīng)具備執(zhí)行的一切條件,正在等待分配CPU的處理時(shí)間片。等待(阻塞)態(tài):進(jìn)程不能使用CPU,若等待事件發(fā)生(等待的資源分配到)則可將其喚醒。7.2.1進(jìn)程及相關(guān)概念進(jìn)程的關(guān)系:Linux系統(tǒng)中所有進(jìn)程都是相互聯(lián)系的,程序創(chuàng)建的進(jìn)程之間具有父/子關(guān)系,創(chuàng)建的多個(gè)進(jìn)程之間是兄弟關(guān)系。Linux內(nèi)核創(chuàng)建了進(jìn)程ID為0及進(jìn)程ID為1的進(jìn)程,其中進(jìn)程ID為1的進(jìn)程是一個(gè)初始化進(jìn)程init,Linux中所有進(jìn)程都是由init進(jìn)程派生而來。在Shell下執(zhí)行程序是Shell進(jìn)程的子進(jìn)程,進(jìn)程中可以創(chuàng)建新的子進(jìn)程,從而產(chǎn)生一顆進(jìn)程樹。7.2.1進(jìn)程及相關(guān)概念進(jìn)程特點(diǎn)動(dòng)態(tài)性動(dòng)態(tài)性是進(jìn)程最基本的特征并發(fā)性指多個(gè)進(jìn)程實(shí)體,同時(shí)存在于內(nèi)存中,能在同一時(shí)間內(nèi)同時(shí)運(yùn)行,并發(fā)是進(jìn)程的重要特征,也是OS的重要特征。獨(dú)立性進(jìn)程實(shí)體是一個(gè)能獨(dú)立運(yùn)行的基本單位,同時(shí)也是獲得資源,獨(dú)立調(diào)度的基本單位異步性進(jìn)程按各自獨(dú)立的,不可預(yù)知的速度向前執(zhí)行7.2.2進(jìn)程控制塊和標(biāo)識(shí)符進(jìn)程是Linux系統(tǒng)的基本調(diào)度和管理資源的單位,它是通過進(jìn)程控制塊來描述的。進(jìn)程控制塊包含了進(jìn)程的描述信息、控制信息以及資源信息,它是進(jìn)程的一個(gè)靜態(tài)描述。在Linux中,進(jìn)程控制塊是一個(gè)task_struct結(jié)構(gòu)(include/linux/sched.h)。在Linux中最主要的進(jìn)程標(biāo)識(shí)有進(jìn)程號(hào)(PID,ProcessIdenityNumber)和它的父進(jìn)程號(hào)(PPID,parentprocessID)。其中PID惟一地標(biāo)識(shí)一個(gè)進(jìn)程。PID和PPID都是非零的正整數(shù)。在Linux中獲得當(dāng)前進(jìn)程的PID和PPID的系統(tǒng)調(diào)用函數(shù)為getpid()和getppid(),通常程序獲得當(dāng)前進(jìn)程的PID和PPID之后,可以將其寫入日志文件以做備份。另外,進(jìn)程標(biāo)識(shí)還有用戶和用戶組標(biāo)識(shí)、進(jìn)程時(shí)間、資源利用情況等7.2.3進(jìn)程調(diào)度Linux內(nèi)核用進(jìn)程調(diào)度器來決定下一個(gè)時(shí)間片應(yīng)該分給哪個(gè)進(jìn)程。什么是時(shí)間片?Linux中每個(gè)進(jìn)程只允許運(yùn)行很短的時(shí)間(200ms),當(dāng)這個(gè)時(shí)間用完后,系統(tǒng)將選擇另一個(gè)進(jìn)程運(yùn)行,原來的進(jìn)程必須等待一定時(shí)間再繼續(xù)運(yùn)行。這段時(shí)間就稱為時(shí)間片。調(diào)度器選擇進(jìn)程時(shí)根據(jù)進(jìn)程的優(yōu)先級(jí)來選擇,優(yōu)先級(jí)高的進(jìn)程運(yùn)行的更為頻繁。在Linux中,進(jìn)程運(yùn)行的時(shí)間不能超過分配給它們的時(shí)間片,它們采用的是搶先式多任務(wù)處理,所以進(jìn)程的掛起和繼續(xù)執(zhí)行無需彼此間協(xié)作。7.2.4進(jìn)程同步、互斥一組并發(fā)進(jìn)程按一定的順序執(zhí)行的過程稱為進(jìn)程間的同步。具有同步關(guān)系的一組并發(fā)進(jìn)程稱為合作進(jìn)程,合作進(jìn)程間互相發(fā)送的信號(hào)稱為消息或事件。進(jìn)程互斥是指當(dāng)有若干進(jìn)程都要使用某一共享資源時(shí),任何時(shí)刻最多允許一個(gè)進(jìn)程使用,其他要使用該資源的進(jìn)程必須等待,直到占用該資源者釋放了該資源為止。臨界資源:操作系統(tǒng)中將一次只允許一個(gè)進(jìn)程訪問的資源稱為臨界資源。進(jìn)程中訪問臨界資源的那段程序代碼稱為臨界區(qū)。為實(shí)現(xiàn)對(duì)臨界資源的互斥訪問,應(yīng)保證諸進(jìn)程互斥的進(jìn)入各自的臨界區(qū)。死鎖:多個(gè)進(jìn)程因競(jìng)爭(zhēng)資源而形成一種僵局,若無外力作用,這些進(jìn)程都將永遠(yuǎn)不能再向前推進(jìn)。7.2.5
Linux下的進(jìn)程管理命令啟動(dòng)進(jìn)程手工啟動(dòng)調(diào)度啟動(dòng)進(jìn)程調(diào)度常用命令ps查看系統(tǒng)中的進(jìn)程top動(dòng)態(tài)的現(xiàn)實(shí)系統(tǒng)中的進(jìn)程nice按用戶的指定的優(yōu)先級(jí)運(yùn)行renice改變正在運(yùn)行進(jìn)程的優(yōu)先級(jí)kill終止進(jìn)程bg將掛起的進(jìn)程放到后臺(tái)執(zhí)行7.3Linux進(jìn)程控制編程獲取進(jìn)程標(biāo)識(shí)符進(jìn)程的創(chuàng)建:fork、vfork進(jìn)程的終止:exit、_exit進(jìn)程的等待:wait、waitpidexec函數(shù)族守護(hù)進(jìn)程7.3.1獲取進(jìn)程PID獲取進(jìn)程PID、PPID#include<sys/types.h>#include<unistd.h>pid_tgetpid(void)
獲取本進(jìn)程ID。pid_tgetppid()
獲取父進(jìn)程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進(jìn)程的創(chuàng)建在Linux中創(chuàng)建一個(gè)新進(jìn)程的方法是使用fork()函數(shù)。fork()函數(shù)用于從已存在的進(jìn)程中創(chuàng)建一個(gè)新進(jìn)程。新進(jìn)程稱為子進(jìn)程,而原進(jìn)程稱為父進(jìn)程。使用fork()函數(shù)得到的子進(jìn)程是父進(jìn)程的一個(gè)復(fù)制品,它從父進(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)前工作目錄、根目錄、資源限制和控制終端等,而子進(jìn)程所獨(dú)有的只有它的進(jìn)程號(hào)、資源使用和計(jì)時(shí)器等。因?yàn)樽舆M(jìn)程幾乎是父進(jìn)程的完全復(fù)制,所以父子兩個(gè)進(jìn)程會(huì)運(yùn)行同一個(gè)程序。因此需要用一種方式來區(qū)分它們,并使它們照此運(yùn)行,否則,這兩個(gè)進(jìn)程不可能做不同的事。7.3.2進(jìn)程的創(chuàng)建實(shí)際上是在父進(jìn)程中執(zhí)行fork()函數(shù)時(shí),父進(jìn)程會(huì)復(fù)制出一個(gè)子進(jìn)程,而且父子進(jìn)程的代碼從fork()函數(shù)的返回開始分別在兩個(gè)地址空間中同時(shí)運(yùn)行。從而兩個(gè)進(jìn)程分別獲得其所屬fork()的返回值,其中在父進(jìn)程中的返回值是子進(jìn)程的進(jìn)程號(hào),而在子進(jìn)程中返回0。因此,可以通過返回值來判定該進(jìn)程是父進(jìn)程還是子進(jìn)程。同時(shí)可以看出,使用fork()函數(shù)的代價(jià)是很大的,它復(fù)制了父進(jìn)程中的代碼段、數(shù)據(jù)段和堆棧段里的大部分內(nèi)容,使得fork()函數(shù)的系統(tǒng)開銷比較大,而且執(zhí)行速度也不是很快。7.3.2進(jìn)程的創(chuàng)建#include<sys/types.h>#include<unistd.h>pid_tfork(void)創(chuàng)建子進(jìn)程:fork的奇妙之處在于它被調(diào)用一次,卻返回兩次,它可能有三種不同的返回值在父進(jìn)程中,fork返回新創(chuàng)建的子進(jìn)程的PID在子進(jìn)程中,fork返回0如果出現(xiàn)錯(cuò)誤,fork返回一個(gè)負(fù)值(-1)7.3.2進(jìn)程的創(chuàng)建#include<sys/types.h>
實(shí)例:fork1.c#include<unistd.h>intmain(){ pid_tpid;
//此時(shí)僅有一個(gè)進(jìn)程
pid=fork();
//此時(shí)有兩個(gè)進(jìn)程同時(shí)運(yùn)行
if(pid<0) printf(“errorinfork”); elseif(pid==0) printf(“Iamthechildprocess,IDis%d\n”,getpid()); else printf(“Iamtheparentprocess,IDis%d\n”,getppid());}7.3.2進(jìn)程的創(chuàng)建在pid=fork()之前,只有一個(gè)進(jìn)程在執(zhí)行,但在這條語句執(zhí)行之后,就變成兩個(gè)進(jìn)程在執(zhí)行了,這兩個(gè)進(jìn)程的共享代碼段,將要執(zhí)行的下一條語句都是if(pid<0)。兩個(gè)進(jìn)程中,原來就存在的那個(gè)進(jìn)程被稱作“父進(jìn)程”,新出現(xiàn)的那個(gè)進(jìn)程被稱作“子進(jìn)程”,父子進(jìn)程的區(qū)別在于進(jìn)程標(biāo)識(shí)符(PID)不同。7.3.2進(jìn)程的創(chuàng)建思考下面程序運(yùn)行結(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進(jìn)程的創(chuàng)建count++被父進(jìn)程、子進(jìn)程一共執(zhí)行了兩次,為什么count的第二次輸出不等于2?子進(jìn)程的數(shù)據(jù)空間、堆??臻g都會(huì)從父進(jìn)程得到一個(gè)拷貝,而不是共享。在子進(jìn)程中對(duì)count進(jìn)行加1的操作,并沒有影響到父進(jìn)程中的count值,父進(jìn)程中的count值任然為0。7.3.2進(jìn)程的創(chuàng)建fork有下面兩種用法:一個(gè)父進(jìn)程希望復(fù)制自己,使父、子進(jìn)程同時(shí)執(zhí)行不同的代碼段。這在網(wǎng)絡(luò)服務(wù)進(jìn)程中比較常見,父進(jìn)程等待客戶端的服務(wù)請(qǐng)求,當(dāng)請(qǐng)求到達(dá)時(shí),父進(jìn)程調(diào)用fork,使子進(jìn)程去處理該請(qǐng)求,父進(jìn)程則繼續(xù)等待下一個(gè)服務(wù)請(qǐng)求到達(dá)。一個(gè)進(jìn)程要執(zhí)行一個(gè)不同的程序。這對(duì)shell是常見的情況,這種情況下,子進(jìn)程從fork返回后立即調(diào)用exec執(zhí)行。7.3.2進(jìn)程的創(chuàng)建#include<sys/types.h>#include<unistd.h>pid_tvfork()功能:創(chuàng)建子進(jìn)程目的:該子進(jìn)程的目的是exec一個(gè)新的程序7.3.2進(jìn)程的創(chuàng)建fork與vfork的區(qū)別:fork:子進(jìn)程拷貝父進(jìn)程的數(shù)據(jù)段、堆棧段vfork:子進(jìn)程與父進(jìn)程共享數(shù)據(jù)段fork:父、子進(jìn)程的執(zhí)行順序不確定vfork:保證子進(jìn)程先運(yùn)行,在它調(diào)用了exec或exit之后,父進(jìn)程運(yùn)行(如果在調(diào)用這兩個(gè)函數(shù)之前子進(jìn)程依賴父進(jìn)程的進(jìn)一步動(dòng)作,則會(huì)導(dǎo)致死鎖)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ù)都是用來終止進(jìn)程的。_exit()函數(shù)的作用是:直接使進(jìn)程停止運(yùn)行,清除其使用的內(nèi)存空間,并清除其在內(nèi)核中的各種數(shù)據(jù)結(jié)構(gòu);exit()函數(shù)則在這些基礎(chǔ)上做了一些包裝,在執(zhí)行退出之前加了若干道工序。exit()函數(shù)與_exit()函數(shù)最大的區(qū)別就在于exit()函數(shù)在調(diào)用exit系統(tǒng)之前要檢查文件的打開情況,把文件緩沖區(qū)中的內(nèi)容寫回文件,就是圖中的“清理I/O緩沖”一項(xiàng)。由于在Linux的標(biāo)準(zhǔn)函數(shù)庫(kù)中,有一種被稱作“緩沖I/O(bufferedI/O)”操作,其特征就是對(duì)應(yīng)每一個(gè)打開的文件,在內(nèi)存中都有一片緩沖區(qū)。每次讀文件時(shí),會(huì)連續(xù)讀出若干條記錄,這樣在下次讀文件時(shí)就可以直接從內(nèi)存的緩沖區(qū)中讀??;同樣,每次寫文件的時(shí)候,也僅僅是寫入內(nèi)存中的緩沖區(qū),等滿足了一定的條件(如達(dá)到一定數(shù)量或遇到特定字符等),再將緩沖區(qū)中的內(nèi)容一次性寫入文件。7.3.3進(jìn)程終止7.3.3進(jìn)程終止這種技術(shù)大大增加了文件讀寫的速度,但也為編程帶來了一些麻煩。比如有些數(shù)據(jù),認(rèn)為已經(jīng)被寫入到文件中,實(shí)際上因?yàn)闆]有滿足特定的條件,它們還只是被保存在緩沖區(qū)內(nèi),這時(shí)用_exit()函數(shù)直接將進(jìn)程關(guān)閉,緩沖區(qū)中的數(shù)據(jù)就會(huì)丟失。因此,若想保證數(shù)據(jù)的完整性,就一定要使用exit()函數(shù)。7.3.3進(jìn)程終止原型:void_exit(intstatus);status:該參數(shù)指定進(jìn)程退出時(shí)的返回值,該返回值可以在shell中通過“echo$?”命令查看,也可以通過system函數(shù)的返回值取得,還可以在父進(jìn)程中通過調(diào)用wait函數(shù)獲得。通常進(jìn)程返回0表示正常退出(如exit(0)),返回非零表示異常退出(如exit(1)/exit(-1))。7.3.3進(jìn)程終止例程:exit.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(){ printf(“Usingexit\n”); printf(“Thisisthecontentinbuffer”); exit(0); //_exit(0);}//對(duì)比程序運(yùn)行結(jié)果,printf(“Thisisthecontentinbuffer”);后加\n結(jié)果7.3.4進(jìn)程等待wait()函數(shù)是用于使父進(jìn)程(也就是調(diào)用wait()的進(jìn)程)阻塞,直到一個(gè)子進(jìn)程結(jié)束或者該進(jìn)程接到了一個(gè)指定的信號(hào)為止。如果該父進(jìn)程沒有子進(jìn)程或者他的子進(jìn)程已經(jīng)結(jié)束,則wait()就會(huì)立即返回。waitpid()的作用和wait()一樣,但它并不一定要等待第一個(gè)終止的子進(jìn)程,它還有若干選項(xiàng),如可提供一個(gè)非阻塞版本的wait()功能,也能支持作業(yè)控制。實(shí)際上wait()函數(shù)只是waitpid()函數(shù)的一個(gè)特例,在Linux內(nèi)部實(shí)現(xiàn)wait()函數(shù)時(shí)直接調(diào)用的就是waitpid()函數(shù)。
7.3.4進(jìn)程等待調(diào)用wait或waitpid的進(jìn)程可能會(huì):如果其所有子進(jìn)程都還在運(yùn)行,則父進(jìn)程阻塞如果一個(gè)子進(jìn)程已終止,正等待父進(jìn)程獲取其終止?fàn)顟B(tài),則取得該子進(jìn)程的終止?fàn)顟B(tài)立即返回如果它沒有任何子進(jìn)程,則立即出錯(cuò)返回7.3.4進(jìn)程等待pid_twait(int*status);pid_twaitpid(pid_tpid,int*status,intoptions);status:用于保存子進(jìn)程的結(jié)束狀態(tài)。pid:為欲等待的子進(jìn)程ID,其數(shù)值意義如下:pid<-1:等待進(jìn)程組ID為pid絕對(duì)值的任何子進(jìn)程pid=-1:等待任何子進(jìn)程,相當(dāng)于wait()pid=0:等待進(jìn)程組ID與目前進(jìn)程相同的任何子進(jìn)程pid>0:等待任何子進(jìn)程ID為pid的子進(jìn)程7.3.4進(jìn)程等待options:該參數(shù)提供了一些額外的選項(xiàng)來控制waitpid,可有以下幾個(gè)取值或它們的按位或組合:0:不是用任何選項(xiàng);WNOHANG:若pid指定的子進(jìn)程沒有結(jié)束,則waitpid()函數(shù)返回0,不予以等待。若結(jié)束,則返回該子進(jìn)程的ID。WUNTRACED:若子進(jìn)程進(jìn)入暫停狀態(tài),則馬上返回,但子進(jìn)程的結(jié)束狀態(tài)不予以理會(huì)。返回值:-1:調(diào)用失敗。其他:調(diào)用成功,返回值為退出的子進(jìn)程ID。7.3.4進(jìn)程等待例程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進(jìn)程等待例程:waitpid.cexec函數(shù)族就提供了一個(gè)在進(jìn)程中啟動(dòng)另一個(gè)程序執(zhí)行的方法。它可以根據(jù)指定的文件名或目錄名找到可執(zhí)行文件,并用它來取代原調(diào)用進(jìn)程的數(shù)據(jù)段、代碼段和堆棧段,在執(zhí)行完之后,原調(diào)用進(jìn)程的內(nèi)容除了進(jìn)程號(hào)外,其他全部被新的進(jìn)程替換了。另外,這里的可執(zhí)行文件既可以是二進(jìn)制文件,也可以是Linux下任何可執(zhí)行的腳本文件。使用exec函數(shù)族主要有兩種情況當(dāng)進(jìn)程認(rèn)為自己不能再為系統(tǒng)和用戶做出任何貢獻(xiàn)時(shí),就可以調(diào)用exec函數(shù)族中的任意一個(gè)函數(shù)讓自己重生;如果一個(gè)進(jìn)程想執(zhí)行另一個(gè)程序,那么它就可以調(diào)用fork()函數(shù)新建一個(gè)進(jìn)程,然后調(diào)用exec函數(shù)族中的任意一個(gè)函數(shù),這樣看起來就像通過執(zhí)行應(yīng)用程序而產(chǎn)生了一個(gè)新進(jìn)程(這種情況非常普遍)。7.3.5
exec函數(shù)族7.3.5
exec函數(shù)族e(cuò)xec系列函數(shù)共有6種不同的形式,統(tǒng)稱為exec函數(shù)族。我們把這6個(gè)函數(shù)劃分為兩組:execl、execle和execlpexecv、execve和execvp這兩組函數(shù)的不同在于exec后的第一個(gè)字符,第一組是l,在此稱為execl系列;第二組是v,在此稱為execv系列。這里的l是list(列表)的意思,表示execl系列函數(shù)需要將每個(gè)命令行參數(shù)作為函數(shù)的參數(shù)進(jìn)行傳遞。而v是vector(矢量)的意思,表示execv系列函數(shù)將所有函數(shù)包裝到一個(gè)矢量數(shù)組中傳遞即可。7.3.5
exec函數(shù)族e(cuò)xec函數(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í)行的程序路徑??梢允墙^對(duì)路徑或者是相對(duì)路徑。在execv、execve、execl和execle這四個(gè)函數(shù)中,使用帶路徑名的文件名作為參數(shù)。7.3.5
exec函數(shù)族file:要執(zhí)行的程序名稱。如果該參數(shù)中包含“/”字符,則視為路徑名直接執(zhí)行;否則視為單獨(dú)的文件名,系統(tǒng)將根據(jù)PATH環(huán)境變量指定的路徑順序搜索指定的文件。argv:命令行參數(shù)的矢量數(shù)組。envp:帶有該參數(shù)的exec函數(shù),可以在調(diào)用時(shí)指定一個(gè)環(huán)境變量數(shù)組。其他不帶該參數(shù)的exec函數(shù),則使用調(diào)用進(jìn)程的環(huán)境變量。arg:程序的第0個(gè)參數(shù),即程序名自身,相當(dāng)于argv[0]。...:命令行參數(shù)列表。調(diào)用相應(yīng)程序時(shí)有多少命令行參數(shù),就需要有多少個(gè)輸入?yún)?shù)項(xiàng)。注意:在使用此類函數(shù)時(shí),在所有命令行參數(shù)的最后,應(yīng)該增加一個(gè)空的參數(shù)項(xiàng)(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)生子進(jìn)程,由子程序來調(diào)用/bin/sh–cstring來執(zhí)行參數(shù)string所代表的命令。與exec不同的是system將外部可執(zhí)行程序加載執(zhí)行完畢后繼續(xù)返回調(diào)用進(jìn)程。例:system.c#include<stdlib.h>intmain(){ system(“l(fā)s–al/etc/passwd”);}守護(hù)進(jìn)程就是后臺(tái)服務(wù)進(jìn)程,它是一個(gè)生存期較長(zhǎng)的進(jìn)程,通常獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。守護(hù)進(jìn)程常常在系統(tǒng)引導(dǎo)載入時(shí)啟動(dòng),在系統(tǒng)關(guān)閉時(shí)終止。Linux有很多系統(tǒng)服務(wù),大多數(shù)服務(wù)都是通過守護(hù)進(jìn)程實(shí)現(xiàn)的,守護(hù)進(jìn)程還能完成許多系統(tǒng)任務(wù),例如,偵聽網(wǎng)絡(luò)接口服務(wù)xinetd、打印進(jìn)程lqd等(這里的尾字母d是Daemon的意思)。在Linux中,每一個(gè)系統(tǒng)與用戶進(jìn)行交流的界面稱為終端,每一個(gè)從此終端開始運(yùn)行的進(jìn)程都會(huì)依附于這個(gè)終端,這個(gè)終端就稱為這些進(jìn)程的控制終端,當(dāng)控制終端被關(guān)閉時(shí),相應(yīng)的進(jìn)程都會(huì)自動(dòng)關(guān)閉。但是守護(hù)進(jìn)程卻能夠突破這種限制
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年中國(guó)無骨型雨刮器市場(chǎng)調(diào)查研究報(bào)告
- 2024年江西省德勝企業(yè)集團(tuán)公司職工醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2024年中國(guó)揩布拖把布市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)指天椒市場(chǎng)調(diào)查研究報(bào)告
- 《新型交聯(lián)透明質(zhì)酸顆粒的制備及其性能研究》
- 《我國(guó)行政規(guī)范性文件法律監(jiān)督制度研究》
- 2025年學(xué)校學(xué)生資助與獎(jiǎng)學(xué)金發(fā)放合同3篇
- 2024年中國(guó)平面度測(cè)量?jī)x市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)帽子二件套市場(chǎng)調(diào)查研究報(bào)告
- 2024至2030年硝銨項(xiàng)目投資價(jià)值分析報(bào)告
- 電子技術(shù)基礎(chǔ)與技能-機(jī)工教案第九章教案555集成定時(shí)器介紹
- 污水處理運(yùn)行質(zhì)量保證措施
- 食材供貨及質(zhì)量保障措施方案
- 基于單片機(jī)的智能充電器設(shè)計(jì)
- 關(guān)于新中國(guó)史簡(jiǎn)介 新中國(guó)史簡(jiǎn)介 最好
- 營(yíng)養(yǎng)學(xué)概論演示
- 統(tǒng)編版語文四年級(jí)上冊(cè)期末總復(fù)習(xí)課件
- 2023年四川省鄉(xiāng)村醫(yī)生招聘筆試題庫(kù)及答案解析
- 彈力重力和摩擦力
- 配料罐(攪拌罐)說明書
- 【超星爾雅學(xué)習(xí)通】《中國(guó)近現(xiàn)代史綱要(首都師范大學(xué))》章節(jié)測(cè)試題及答案(一)
評(píng)論
0/150
提交評(píng)論