




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第15章進(jìn)程控制Linux系統(tǒng)是多任務(wù)操作系統(tǒng),可同時(shí)進(jìn)行多個(gè)程序完成多項(xiàng)工作。進(jìn)程是處于活動(dòng)狀態(tài)的程序,在操作系統(tǒng)的管理下,所有進(jìn)程共享計(jì)算機(jī)中的硬件資源。進(jìn)程作為系統(tǒng)運(yùn)行時(shí)的基本邏輯成員,不僅作為獨(dú)立個(gè)體運(yùn)行在系統(tǒng)上,而且還將相互競(jìng)爭(zhēng)系統(tǒng)資源。了解進(jìn)程的本質(zhì)對(duì)于理解、描述和設(shè)計(jì)系統(tǒng)軟件有著極為重要的意義,了解進(jìn)程的活動(dòng)狀態(tài)也有利于設(shè)計(jì)復(fù)雜的程序。本章將介紹Linux系統(tǒng)中進(jìn)程的概念和與進(jìn)程有關(guān)的系統(tǒng)調(diào)用函數(shù)。15.1進(jìn)程的基本概念在討論進(jìn)程的基本概念之前,首先介紹兩種查看Linux系統(tǒng)中進(jìn)程信息的方法。本書(shū)3.2節(jié)介紹了在終端內(nèi)輸入命令ps
-e可列出所有進(jìn)程,ps命令的參數(shù)還有-f,顯示進(jìn)程的全部信息;-h不顯示進(jìn)程標(biāo)題列出所有進(jìn)程;-l,以長(zhǎng)格式顯示進(jìn)程,-w,以寬格式顯示進(jìn)程;-a顯示終端上的所有進(jìn)程,包括其它用戶(hù)的進(jìn)程;-r只顯示正在運(yùn)行的進(jìn)程;-x顯示沒(méi)有控制終端的進(jìn)程。在Dash主頁(yè)中搜索“系統(tǒng)監(jiān)視器”程序,打開(kāi)程序后可查看“進(jìn)程”選項(xiàng)卡內(nèi)的進(jìn)程信息。15.1.1進(jìn)程狀態(tài)和狀態(tài)轉(zhuǎn)換進(jìn)程在生存周期中呈現(xiàn)出各種狀態(tài)及狀態(tài)的轉(zhuǎn)換,這些信息反映了進(jìn)程獲取系統(tǒng)資源的情況。Linux系統(tǒng)的進(jìn)程狀態(tài)模型如表所示。狀態(tài)名稱(chēng)說(shuō)
明創(chuàng)建狀態(tài)進(jìn)程正在被Linux內(nèi)核創(chuàng)建就緒進(jìn)程還沒(méi)有開(kāi)始執(zhí)行,但相關(guān)數(shù)據(jù)已被創(chuàng)建,只要內(nèi)核調(diào)度它就立即可以執(zhí)行內(nèi)核狀態(tài)進(jìn)程在內(nèi)核狀態(tài)下運(yùn)行,被調(diào)度上CPU執(zhí)行用戶(hù)狀態(tài)進(jìn)程在用戶(hù)狀態(tài)下運(yùn)行,等待被調(diào)度上CPU執(zhí)行睡眠進(jìn)程正在睡眠,等待系統(tǒng)資源或相關(guān)信號(hào)喚醒喚醒正在睡眠的進(jìn)程收到Linux內(nèi)核喚醒的信號(hào)被搶先具有更高優(yōu)先級(jí)的進(jìn)程強(qiáng)制獲得進(jìn)程的CPU時(shí)鐘周期僵死狀態(tài)進(jìn)程通過(guò)系統(tǒng)調(diào)用結(jié)束,進(jìn)程不再存在,但在進(jìn)程表項(xiàng)中仍有記錄,該記錄可由父進(jìn)程收集15.1.1進(jìn)程狀態(tài)和狀態(tài)轉(zhuǎn)換1.子進(jìn)程被Linux內(nèi)核調(diào)入CPU執(zhí)行的過(guò)程進(jìn)程的生命周期包括從創(chuàng)建到退出的全部狀態(tài)轉(zhuǎn)化,它的生命周期里并不一定要經(jīng)歷所有的狀態(tài)。父進(jìn)程創(chuàng)建子進(jìn)程,子進(jìn)程被Linux內(nèi)核調(diào)入CPU執(zhí)行的過(guò)程可用跨職能流程圖來(lái)反映,如后圖所示。15.1.1進(jìn)程狀態(tài)和狀態(tài)轉(zhuǎn)換最初,父進(jìn)程通過(guò)fork系統(tǒng)調(diào)用創(chuàng)建子進(jìn)程,子進(jìn)程被創(chuàng)建后,處于創(chuàng)建狀態(tài)。Linux內(nèi)核為子進(jìn)程配置數(shù)據(jù)結(jié)構(gòu),如果內(nèi)存空間足夠,子進(jìn)程在內(nèi)核中就緒,否則在Swap分區(qū)就緒。這時(shí)子進(jìn)程處于就緒狀態(tài),等待Linux內(nèi)核調(diào)度。Linux內(nèi)核會(huì)為子進(jìn)程分配CPU時(shí)鐘周期,在合適的時(shí)間將子進(jìn)程調(diào)度上CPU運(yùn)行,這時(shí)子進(jìn)程處于內(nèi)核狀態(tài),子進(jìn)程開(kāi)始運(yùn)行。被分配的CPU時(shí)鐘周期結(jié)束時(shí),Linux內(nèi)核再次調(diào)度子進(jìn)程,將子進(jìn)程調(diào)出CPU,子進(jìn)程進(jìn)入用戶(hù)狀態(tài)。待子進(jìn)程被分配的下一個(gè)CPU時(shí)鐘周期到來(lái)時(shí),Linux內(nèi)核又將子進(jìn)程調(diào)度到CPU運(yùn)行,使子進(jìn)程進(jìn)入內(nèi)核狀態(tài)。如果有其它的進(jìn)程獲得更高優(yōu)先級(jí),子進(jìn)程的時(shí)鐘周期可能會(huì)被搶占,這時(shí)又會(huì)回到用戶(hù)狀態(tài)。15.1.1進(jìn)程狀態(tài)和狀態(tài)轉(zhuǎn)換2.子進(jìn)程進(jìn)入睡眠狀態(tài)子進(jìn)程在運(yùn)行時(shí),如果請(qǐng)求的資源得不到滿(mǎn)足將進(jìn)入睡眠狀態(tài),睡眠狀態(tài)的子進(jìn)程被從內(nèi)存調(diào)換到Swap分區(qū)。被請(qǐng)求的資源可能是一個(gè)文件,也可能是打印機(jī)等硬件設(shè)備。如果該資源被釋放,子進(jìn)程將被調(diào)入內(nèi)存,繼續(xù)以系統(tǒng)狀態(tài)執(zhí)行,如圖所示。15.1.1進(jìn)程狀態(tài)和狀態(tài)轉(zhuǎn)換3.子進(jìn)程結(jié)束子進(jìn)程可以通過(guò)exit系統(tǒng)調(diào)用結(jié)束,這時(shí)子進(jìn)程將進(jìn)入到僵死狀態(tài),生命周期結(jié)束,如圖所示。子進(jìn)程在內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)又被稱(chēng)為上下文。上下文包括3個(gè)部分,用戶(hù)級(jí)上下文是子進(jìn)程用戶(hù)空間的內(nèi)容,寄存器上下文是子進(jìn)程運(yùn)行時(shí)裝入CPU寄存器的內(nèi)容,系統(tǒng)級(jí)上下文是子進(jìn)程在Linux內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)。15.1.1進(jìn)程狀態(tài)和狀態(tài)轉(zhuǎn)換子進(jìn)程切換時(shí),CPU收到一個(gè)軟中斷,這時(shí)上下文將被保存起來(lái),稱(chēng)之為保存現(xiàn)場(chǎng)。子進(jìn)程再次運(yùn)行時(shí),上下文被還原到相關(guān)位置,稱(chēng)之為還原現(xiàn)場(chǎng)。整個(gè)過(guò)程稱(chēng)為上下文切換,保存上下文的數(shù)據(jù)空間稱(chēng)為u區(qū),是Linux內(nèi)核為進(jìn)程分配的存儲(chǔ)空間。內(nèi)核在以下情況會(huì)進(jìn)行上下文切換操作:子進(jìn)程進(jìn)入睡眠狀態(tài)時(shí)。子進(jìn)程時(shí)鐘周期結(jié)束,被轉(zhuǎn)為用戶(hù)狀態(tài)時(shí)。子進(jìn)程再次被調(diào)度上CPU運(yùn)行,轉(zhuǎn)為系統(tǒng)狀態(tài)時(shí)。子進(jìn)程僵死時(shí)。15.1.2進(jìn)程控制?在Linux系統(tǒng)中,用戶(hù)創(chuàng)建子進(jìn)程的唯一方法就是使用fork系統(tǒng)調(diào)用。fork系統(tǒng)調(diào)用的流程如圖所示。15.1.2進(jìn)程控制首先,Linux內(nèi)核在進(jìn)程表中為子進(jìn)程分配一個(gè)表項(xiàng),然后分配PID。子進(jìn)程表項(xiàng)的內(nèi)容來(lái)自父進(jìn)程,fork系統(tǒng)調(diào)用會(huì)將父進(jìn)程的進(jìn)程表項(xiàng)復(fù)制為副本,并分配給子進(jìn)程。然后,Linux內(nèi)核使父進(jìn)程的文件表和索引表的節(jié)點(diǎn)自增1,創(chuàng)建用戶(hù)級(jí)上下文。最后,將父進(jìn)程上下文復(fù)制到子進(jìn)程上下文空間中。fork系統(tǒng)調(diào)用結(jié)束后,子進(jìn)程的PID被返回給父進(jìn)程,而子進(jìn)程獲得的值為0。最簡(jiǎn)單的進(jìn)程控制為結(jié)束進(jìn)程,通過(guò)exit系統(tǒng)調(diào)用實(shí)現(xiàn)。進(jìn)程執(zhí)行exit系統(tǒng)調(diào)用后,Linux內(nèi)核將刪除進(jìn)程的上下文,但保留進(jìn)程表項(xiàng),進(jìn)程處于僵死狀態(tài)。待合適的時(shí)候,再刪除進(jìn)程表項(xiàng)中的內(nèi)容,釋放進(jìn)程PID。父進(jìn)程與子進(jìn)程的同步是通過(guò)wait系統(tǒng)調(diào)用實(shí)現(xiàn)的。父進(jìn)程調(diào)用wait()函數(shù)后,父進(jìn)程的執(zhí)行被阻斷,直到子進(jìn)程進(jìn)入僵死狀態(tài)。這時(shí),子進(jìn)程的退出參數(shù)可通過(guò)wait()函數(shù)返回給父進(jìn)程。wait系統(tǒng)調(diào)用常被用來(lái)判斷子進(jìn)程是否已結(jié)束。除此以外,進(jìn)程可使用exec系統(tǒng)調(diào)用運(yùn)行一個(gè)可執(zhí)行文件。該exec和fork系統(tǒng)調(diào)用的區(qū)別是,exec系統(tǒng)調(diào)用會(huì)結(jié)束原有進(jìn)程,使用更新上下文的內(nèi)容,并從頭開(kāi)始執(zhí)行一個(gè)新的進(jìn)程。兩個(gè)進(jìn)程之間并無(wú)父子關(guān)系。15.1.3進(jìn)程調(diào)度Linux系統(tǒng)是分時(shí)操作系統(tǒng),Linux內(nèi)核可同時(shí)執(zhí)行多個(gè)進(jìn)程,并為每個(gè)進(jìn)程分配CPU時(shí)鐘周期。當(dāng)一個(gè)進(jìn)程的時(shí)鐘周期結(jié)束后,Linux內(nèi)核會(huì)調(diào)度另一個(gè)進(jìn)程上CPU執(zhí)行,如此往復(fù)。這種調(diào)度方法屬于多級(jí)反饋循環(huán),Linux內(nèi)核會(huì)為每個(gè)進(jìn)程設(shè)定優(yōu)先級(jí)。如果有進(jìn)程處于較高的優(yōu)先級(jí),那么它能夠搶占較低優(yōu)先級(jí)進(jìn)程的CPU時(shí)鐘周期。Linux系統(tǒng)進(jìn)程調(diào)度包括兩個(gè)概念,分別是調(diào)度時(shí)機(jī)和調(diào)度算法。調(diào)度時(shí)機(jī)指進(jìn)程何時(shí)被調(diào)度上CPU執(zhí)行。例如,轉(zhuǎn)變?yōu)樗郀顟B(tài)的進(jìn)程將獲得較高的優(yōu)先級(jí),一旦所需要的資源被釋放,該進(jìn)程可以立即被調(diào)度上CPU執(zhí)行。被搶占的進(jìn)程也將獲得一個(gè)較高的優(yōu)先級(jí),搶占其CPU時(shí)鐘周期的進(jìn)程一旦轉(zhuǎn)為用戶(hù)狀態(tài),被搶占的進(jìn)程立即轉(zhuǎn)為內(nèi)核狀態(tài)。調(diào)度算法所關(guān)心的內(nèi)容就是如何為進(jìn)程分配優(yōu)先級(jí)。為L(zhǎng)inux設(shè)計(jì)程序時(shí),通常不需要人為地設(shè)置進(jìn)程的優(yōu)先級(jí),Linux系統(tǒng)進(jìn)程調(diào)度機(jī)制可保證所有進(jìn)程都能獲得足夠的運(yùn)行時(shí)間。15.2進(jìn)程基本操作本節(jié)將通過(guò)介紹關(guān)于進(jìn)程操作的系統(tǒng)調(diào)用函數(shù)來(lái)講解進(jìn)程的基本操作方法,其中包括fork調(diào)用、exec調(diào)用、exit調(diào)用、wait調(diào)用和sleep調(diào)用,相關(guān)函數(shù)被定義在系統(tǒng)調(diào)用庫(kù)unistd.h中。通過(guò)本節(jié),我們將了解如何產(chǎn)生子進(jìn)程,進(jìn)程如何改變它的執(zhí)行映像,父子進(jìn)程的同步等操作。由此也了解到一些并行程序的基本概念與如何設(shè)計(jì)簡(jiǎn)單的并行程序。15.2.1fork系統(tǒng)調(diào)用fork系統(tǒng)調(diào)用有兩個(gè)函數(shù),分別是fork()函數(shù)和vfork()函數(shù)。fork系統(tǒng)調(diào)用可創(chuàng)建一個(gè)子進(jìn)程,該調(diào)用的一般形式是:pid_tfork(void);pid_tvfork(void);其中pid_t是用來(lái)保存進(jìn)程PID信息的結(jié)構(gòu)體。當(dāng)調(diào)用執(zhí)行成功時(shí),該調(diào)用對(duì)父進(jìn)程返回子進(jìn)程的PID,對(duì)子進(jìn)程返回0。調(diào)用失敗時(shí)返回–1,子進(jìn)程沒(méi)有創(chuàng)建。vfork()函數(shù)與fork()函數(shù)形式相同,它們之間的區(qū)別是vfork()函數(shù)創(chuàng)建子進(jìn)程時(shí),不復(fù)制父進(jìn)程的上下文。(15_2_1.c)該程序的運(yùn)行結(jié)果為:子進(jìn)程正在工作:子進(jìn)程PID是11718父進(jìn)程PID是11713父進(jìn)程正在工作:父進(jìn)程PID是11713子進(jìn)程PID是11718由結(jié)果可知,父進(jìn)程調(diào)用子進(jìn)程后,父進(jìn)程由內(nèi)核狀態(tài)轉(zhuǎn)為用戶(hù)狀態(tài),子進(jìn)程開(kāi)始執(zhí)行并輸出信息。然后子進(jìn)程調(diào)用exit()函數(shù)進(jìn)入僵死狀態(tài)。父進(jìn)程由用戶(hù)狀態(tài)重新回到內(nèi)核狀態(tài),并輸出信息。最后父進(jìn)程等待子進(jìn)程結(jié)束,父進(jìn)程結(jié)束。15.2.2exec系統(tǒng)調(diào)用系統(tǒng)調(diào)用exec以新進(jìn)程替代原有進(jìn)程,但是PID保持不變。因此可以認(rèn)為,exec系統(tǒng)調(diào)用實(shí)際上沒(méi)有創(chuàng)建新進(jìn)程,只是替換了原有進(jìn)程上下文的內(nèi)容。它共有6個(gè)函數(shù),代碼如下:intexecl(constchar*path,constchar*arg,...);intexeclp(constchar*file,constchar*arg,...);intexecle(constchar*path,constchar*arg,...,char*
constenvp[]);intexecv(constchar*path,char*constargv[]);intexecve(constchar*path,char*constargv[],char*constenvp[]);intexecvp(constchar*file,char*constargv[]);15.2.2exec系統(tǒng)調(diào)用在使用這些函數(shù)前,必須在程序中定義全局變量:externchar**environ;該變量是預(yù)定義用來(lái)指向Linux系統(tǒng)全局變量的指針,這樣就能在當(dāng)前工作目錄執(zhí)行系統(tǒng)程序,正如在shell中可不輸入路徑直接運(yùn)行VI、GCC等程序。exec系統(tǒng)調(diào)用的函數(shù)中,execve()函數(shù)是另外5個(gè)函數(shù)的基礎(chǔ)。這些函數(shù)的區(qū)別可以總結(jié)成以下3條:(1)待執(zhí)行程序文件是由文件名還是由路徑名指定。第一個(gè)參數(shù)為*file的是文件名,為*path的即路徑名。(2)新程序的參數(shù)是一一列出還是由一個(gè)指針數(shù)組來(lái)引用。execl()函數(shù)和execlp()函數(shù)是將參數(shù)一一列出;execle()函數(shù)將參數(shù)一一列出,但可以用指針數(shù)組引用環(huán)境變量;execv()函數(shù)和execvp()函數(shù)的參數(shù)由一個(gè)指針數(shù)組來(lái)引用;execve()函數(shù)的參數(shù)用一個(gè)指針數(shù)組來(lái)引用,還用另一個(gè)指針數(shù)組引用環(huán)境變量。(3)把調(diào)用進(jìn)程的環(huán)境傳遞給新程序還是給新程序指定新的環(huán)境。execle()函數(shù)和execve()函數(shù)為新程序指定新的環(huán)境。所有這6個(gè)函數(shù)的執(zhí)行效果是一樣的,在執(zhí)行成功時(shí),函數(shù)的返回值為0,否則返回–1。(15_2_2_a.c)(15_2_2_b.c)15.2.2exec系統(tǒng)調(diào)用該例是由兩個(gè)程序所組成,必須分開(kāi)編譯。第一個(gè)程序名為beexec,用于將第二個(gè)程序傳遞給它的參數(shù)和環(huán)境變量輸出。執(zhí)行第二個(gè)程序,puts()函數(shù)向緩沖區(qū)輸入了一條信息后使用execve()系統(tǒng)調(diào)用使beexec替換原進(jìn)程的執(zhí)行映像。例如,輸入的命令為:./doexectest1結(jié)果為(可能因系統(tǒng)環(huán)境不同而有差異):輸出執(zhí)行參數(shù):參數(shù)0是:/home/Shizhe/workspace/book_f22/Debug/doexec參數(shù)1是:test1參數(shù)2是:(null)輸出環(huán)境變量:HOSTNAME=localhost.localdomainSHELL=/bin/bash…通過(guò)結(jié)果會(huì)發(fā)現(xiàn),doexec.c程序在調(diào)用execve()函數(shù)前的一條輸出語(yǔ)句沒(méi)能輸出到終端,原因是doexec.c程序的輸出語(yǔ)句可能還存在于緩沖區(qū)中。當(dāng)調(diào)用beexec.c程序時(shí),緩沖區(qū)被后者清空。如果不希望這樣的情況發(fā)生,可使用“fflush(stdout);”語(yǔ)句將標(biāo)準(zhǔn)輸出的緩沖區(qū)內(nèi)數(shù)據(jù)強(qiáng)制輸出。15.2.3exit系統(tǒng)調(diào)用系統(tǒng)調(diào)用exit的功能是終止發(fā)出調(diào)用的進(jìn)程,它包含兩個(gè)函數(shù),分別是_exit()函數(shù)和exit()函數(shù)。它們的一般形式如下:void_exit(intstatus);voidexit(intstatus);系統(tǒng)調(diào)用_exit()立即終止發(fā)出調(diào)用的進(jìn)程。所有屬于該進(jìn)程的文件描述符都關(guān)閉。如果該進(jìn)程擁有子進(jìn)程,那么父子進(jìn)程關(guān)系被轉(zhuǎn)到init進(jìn)程上。被結(jié)束的進(jìn)程將收到來(lái)自子進(jìn)程的僵死信號(hào)SIGCHLD。如果被結(jié)束的進(jìn)程在控制臺(tái)或終端上運(yùn)行,shell程序?qū)⑹盏絊IGHUP信號(hào)。函數(shù)中的參數(shù)status是返回給父進(jìn)程的狀態(tài)值,父進(jìn)程可通過(guò)wait系統(tǒng)調(diào)用獲得。status只有最低1個(gè)字節(jié)能被父進(jìn)程讀取,由此可知,實(shí)際值域范圍為0至255。系統(tǒng)調(diào)用_exit()沒(méi)有返回值,被終止進(jìn)程不會(huì)知道該調(diào)用是否成功。另外,該調(diào)用不會(huì)刷新輸入輸出緩沖區(qū),因此進(jìn)程結(jié)束前必須自己刷新緩沖區(qū),或者改用exit()系統(tǒng)調(diào)用。exit()系統(tǒng)調(diào)用將進(jìn)行一些上下文清理工作,例如釋放所有占用的資源、清空緩沖區(qū)等。15.2.4wait系統(tǒng)調(diào)用系統(tǒng)調(diào)用wait用于父進(jìn)程與子進(jìn)程同步。父進(jìn)程調(diào)用后,將進(jìn)入睡眠狀態(tài),直到子進(jìn)程結(jié)束或者父進(jìn)程再被其它進(jìn)程終止。使用wait系統(tǒng)調(diào)用需要包含頭文件sys/types.h和sys/wait.h。該調(diào)用有兩個(gè)函數(shù),分別是wait()和waitpid(),一般形式如下:pid_twait(int*status);pid_twaitpid(pid_tpid,int*status,intoptions);發(fā)出wait系統(tǒng)調(diào)用的進(jìn)程進(jìn)入睡眠狀態(tài),直到它收到一個(gè)子進(jìn)程的僵死信號(hào),或者是收到其它重要的信號(hào)。如果父進(jìn)程在wait系統(tǒng)調(diào)用的同時(shí),子進(jìn)程進(jìn)入僵死狀態(tài),wait系統(tǒng)調(diào)用會(huì)立即結(jié)束。參數(shù)*status用來(lái)獲得子進(jìn)程exit系統(tǒng)調(diào)用的參數(shù)值,只有最低1個(gè)字節(jié)能被讀取。調(diào)用waitpid()函數(shù)與調(diào)用wait()函數(shù)的區(qū)別是,wait()函數(shù)等待所有子進(jìn)程的僵死狀態(tài),而waitpid()函數(shù)等待PID與參數(shù)pid相關(guān)的子進(jìn)程僵死狀態(tài)。其中參數(shù)pid的含義與取值方法如下:(1)當(dāng)參數(shù)pid小于–1,且退出的子進(jìn)程的進(jìn)程組ID等于絕對(duì)值的pid時(shí)結(jié)束等待。(2)當(dāng)參數(shù)pid等于0時(shí),且該子進(jìn)程的進(jìn)程組ID等于發(fā)出調(diào)用進(jìn)程的組ID時(shí)子進(jìn)程退出。(3)當(dāng)參數(shù)pid大于0時(shí),等待進(jìn)程ID等于參數(shù)pid時(shí)子進(jìn)程退出。(4)當(dāng)參數(shù)pid等于–1時(shí),等待任何子進(jìn)程退出,相當(dāng)于調(diào)用wait()。waitpid()函數(shù)中的參數(shù)options的取值范圍及意義如下:(1)WNOHANG,該選項(xiàng)要求如果沒(méi)有子進(jìn)程退出就立即返回;(2)WUNTRACED,如果發(fā)現(xiàn)已經(jīng)僵死,但未報(bào)告狀態(tài)的子進(jìn)程,父進(jìn)程不進(jìn)入睡眠狀態(tài),立即返回子進(jìn)程的終止信息。如果status參數(shù)不為NULL,可通過(guò)該參數(shù)獲得子進(jìn)程的信息。下列宏能用來(lái)檢查子進(jìn)程的返回狀態(tài),如后表所示。15.2.4wait系統(tǒng)調(diào)用宏
名說(shuō)
明WIFEXITED(status)如果進(jìn)程通過(guò)系統(tǒng)調(diào)用_exit()或exit()正常退出,該宏的值為非0WIFSIGNALED(status)如果子進(jìn)程是因?yàn)榈玫降男盘?hào)沒(méi)有被捕捉而導(dǎo)致退出時(shí),該宏的值為非0WIFSTOPPED(status)如果子進(jìn)程沒(méi)有終止,但停止了,并可以重新執(zhí)行時(shí),該宏返回值為非0。這種情況僅出現(xiàn)在waitpid()調(diào)用中使用了WUNTRACED選項(xiàng)WEXITSTATUS(status)如果WIFEXITED(status)返回值為非0,該宏返回由子進(jìn)程調(diào)用_exit(status)或exit(status)時(shí)設(shè)置的調(diào)用參數(shù)status值WTERMSIG(status)如果WIFSIGNALED(status)返回為非0,該宏返回導(dǎo)致子進(jìn)程退出的信號(hào)的值WSTOPSIG(status)如果WIFSTOPPED(status)返回非0,該宏返回導(dǎo)致子進(jìn)程停止的信號(hào)15.2.5sleep函數(shù)調(diào)用系統(tǒng)調(diào)用sleep用來(lái)使進(jìn)程主動(dòng)進(jìn)入睡眠狀態(tài),該函數(shù)的一般形式是:sleep(秒數(shù));執(zhí)行該系統(tǒng)調(diào)用后,進(jìn)程將進(jìn)入睡眠狀態(tài),直到指定的秒數(shù)已到。正常情況下,該調(diào)用的返回值為0,若是因?yàn)楸恍盘?hào)所喚醒,則返回值為原始秒數(shù)減去已睡眠秒數(shù)的差。15.3進(jìn)程的特殊操作15.2節(jié)介紹了有關(guān)進(jìn)程的一些基本操作,如進(jìn)程的產(chǎn)生、進(jìn)程的終止、進(jìn)程執(zhí)行映像的改變、等待子進(jìn)程終止等。本節(jié)要介紹一些有關(guān)進(jìn)程的特殊操作。有了這些操作,就使得進(jìn)程的編程更加完善,能編制更為實(shí)用的程序。主要的內(nèi)容有得到關(guān)于進(jìn)程的各種ID、對(duì)進(jìn)程設(shè)置用戶(hù)ID、改變進(jìn)程的工作目錄、根交換和改變進(jìn)程的優(yōu)先級(jí)等操作。15.3.1獲得進(jìn)程ID進(jìn)程ID除PID外,還有UID、EUID、GID、EGID和PGID這5個(gè)數(shù)值。其中,UID等于創(chuàng)建進(jìn)程的用戶(hù)信息。EUID是創(chuàng)建進(jìn)程的用戶(hù)對(duì)進(jìn)程所屬可執(zhí)行文件的操作權(quán)限信息,另外還包括是否有使用kill系統(tǒng)調(diào)用發(fā)送軟中斷信號(hào)到Linux內(nèi)核結(jié)束進(jìn)程的權(quán)限。GID是創(chuàng)建進(jìn)程的用戶(hù)所屬群組的信息。EGID用于標(biāo)識(shí)進(jìn)程目前所屬用戶(hù)組,它與GID并不一定相同,因?yàn)檫M(jìn)程執(zhí)行時(shí)所屬用戶(hù)組可能改變。PGID用于標(biāo)識(shí)進(jìn)程組信息。15.3.1獲得進(jìn)程ID獲得運(yùn)行進(jìn)程的GID可使用getgid()函數(shù),獲得運(yùn)行進(jìn)程的EGID可使用getegid()函數(shù)。標(biāo)識(shí)GID與EGID的不同是由于執(zhí)行文件設(shè)置set-gid位引起的。這兩個(gè)調(diào)用的一般形式如下:gid_tgetgid(void);gid_tgetegid(void);如果要獲得進(jìn)程的PID可使用getpid()函數(shù),要獲得父進(jìn)程的PID可使用getppid()調(diào)用。這兩個(gè)調(diào)用的一般形式如下:pid_tgetpid(void);pid_tgetppid(void);如果要獲得進(jìn)程的PGID可使用getpgrp()函數(shù),若要獲得指定進(jìn)程的PGID可使用getpgid()函數(shù)。這兩個(gè)調(diào)用的一般形式如下:pid_tgetpgrp(void);pid_tgetpgid(pid_tpid);15.3.2setuid和setgid系統(tǒng)調(diào)用設(shè)置進(jìn)程的UID可使用setuid()函數(shù),設(shè)置進(jìn)程的GID可使用setgid()函數(shù)。這兩個(gè)調(diào)用的一般形式如下:intsetuid(uid_tuid);intsetgid(gid_tgid);setuid()函數(shù)可修改發(fā)出調(diào)用進(jìn)程的UID,參數(shù)uid為創(chuàng)建進(jìn)程的用戶(hù)信息。如果以普通用戶(hù)的UID作為參數(shù)執(zhí)行該調(diào)用,Linux內(nèi)核將直接設(shè)置進(jìn)程UID為參數(shù)uid信息。如果以根用戶(hù)的UID作為參數(shù),為了保障系統(tǒng)的安全性,Linux內(nèi)核將以進(jìn)程表和u區(qū)中用戶(hù)真實(shí)的標(biāo)識(shí)號(hào)來(lái)設(shè)置進(jìn)程UID。setuid()函數(shù)執(zhí)行成功時(shí),返回值為0,否則返回–1。setgid()函數(shù)可修改發(fā)出調(diào)用進(jìn)程的GID,與前者不同,該調(diào)用不會(huì)檢驗(yàn)用戶(hù)的真實(shí)身份。參數(shù)gid為進(jìn)程的新GID信息。執(zhí)行成功時(shí),返回值為0,否則返回–1。15.3.3setpgrp和setpgid系統(tǒng)調(diào)用系統(tǒng)調(diào)用setpgrp()和setpgid()都是用來(lái)設(shè)置進(jìn)程PGID,它們的一般形式為:intsetpgrp(void);intsetpgid(pid_tpid,pid_tpgid);其中,setpgrp()函數(shù)直接將進(jìn)程的PGID設(shè)為與PID相同的數(shù)值,setpgid()以其中參數(shù)修改PGID。參數(shù)pid為指定進(jìn)程的PID,值為0時(shí)修改發(fā)出調(diào)用進(jìn)程的PGID。參數(shù)pgid為指定的PGID信息,值為0時(shí),修改所有PID與參數(shù)pid相等的進(jìn)程,將這些進(jìn)程的PGID值設(shè)為參數(shù)pgid的值。若以普通用戶(hù)權(quán)限發(fā)出此調(diào)用,而PGID原本為根用戶(hù)組所有,那么只有在指定進(jìn)程與調(diào)用進(jìn)程的EU
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合作協(xié)議甲方乙方
- 高中語(yǔ)文 第5課 蘇軾詞兩首教學(xué)實(shí)錄2 新人教版必修4
- 第四單元《乘車(chē)》(教學(xué)設(shè)計(jì))- 2024-2025學(xué)年一年級(jí)上冊(cè)數(shù)學(xué)北師大版
- 二年級(jí)數(shù)學(xué)計(jì)算題專(zhuān)項(xiàng)練習(xí)1000題匯編集錦
- 第六章金屬資源綜合利用大單元教學(xué)設(shè)計(jì)-2024-2025學(xué)年九年級(jí)化學(xué)滬教版(2024)上冊(cè)
- 參購(gòu)合同范本
- 倉(cāng)儲(chǔ)合同范例
- 第13課 西歐經(jīng)濟(jì)和社會(huì)發(fā)展 教學(xué)設(shè)計(jì)
- 四年級(jí)英語(yǔ)下冊(cè) Unit 2 What time is it Part A第一課時(shí)教學(xué)實(shí)錄2 人教PEP
- 山東省惠州市惠東縣梁化中學(xué)九年級(jí)化學(xué)上冊(cè) 2.2 氧氣的性質(zhì)和用途教學(xué)實(shí)錄 新人教版
- 燃?xì)夤艿拦こ淌┕そM織設(shè)計(jì)方案
- 課題申報(bào)書(shū):“大思政”視域下大學(xué)生思政教育融入就業(yè)教育路徑研究
- 2025年度新股東增資擴(kuò)股股權(quán)激勵(lì)與員工持股計(jì)劃協(xié)議3篇
- 《特種設(shè)備安全管理員》考試通關(guān)題庫(kù)(600題 含參考答案)
- 2025年山東核電有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年宜賓人才限公司招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 施工安全情況日常巡查表(完整版)
- 2025年醫(yī)院科教工作計(jì)劃
- 《亞洲概況及東亞》課件
- 河北交投物流有限公司所屬公司招聘筆試沖刺題2025
- 第二節(jié) 物業(yè)管理服務(wù)機(jī)構(gòu)設(shè)置及運(yùn)作流程
評(píng)論
0/150
提交評(píng)論