操作系統(tǒng)實驗4-進(jìn)程管理及控制_第1頁
操作系統(tǒng)實驗4-進(jìn)程管理及控制_第2頁
操作系統(tǒng)實驗4-進(jìn)程管理及控制_第3頁
操作系統(tǒng)實驗4-進(jìn)程管理及控制_第4頁
操作系統(tǒng)實驗4-進(jìn)程管理及控制_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第3章 進(jìn)程管理與控制一、 Linux進(jìn)程管理1、fork( ) 創(chuàng)建一個新的子進(jìn)程。其子進(jìn)程會復(fù)制父進(jìn)程的數(shù)據(jù)與堆??臻g,并繼承父進(jìn)程的用戶代碼、組代碼、環(huán)境變量、已打開的文件代碼、工作目錄和資源限制。系統(tǒng)調(diào)用格式: int fork() 如果Fork成功則在父進(jìn)程會返回新建立的子進(jìn)程代碼(PID),而在新建立的子進(jìn)程中則返回0。如果fork失敗則直接返回-1。2、wait( ) 等待子進(jìn)程運(yùn)行結(jié)束。如果子進(jìn)程沒有完成,父進(jìn)程一直等待。wait( )將調(diào)用進(jìn)程掛起,直至其子進(jìn)程因暫?;蚪K止而發(fā)來軟中斷信號為止。如果在wait( )前已有子進(jìn)程暫?;蚪K止,則調(diào)用進(jìn)程做適當(dāng)處理后便返回。系統(tǒng)調(diào)用

2、格式:int wait(int *status) 其中,status是用戶空間的地址。它的低8位反應(yīng)子進(jìn)程狀態(tài),為0表示子進(jìn)程正常結(jié)束,非0則表示出現(xiàn)了各種各樣的問題;高8位則帶回了exit( )的返回值。exit( )返回值由系統(tǒng)給出。核心對wait( )作以下處理:(1)首先查找調(diào)用進(jìn)程是否有子進(jìn)程,若無,則返回出錯碼;(2)若找到一處于“僵死狀態(tài)”的子進(jìn)程,則將子進(jìn)程的執(zhí)行時間加到父進(jìn)程的執(zhí)行時間上,并釋放子進(jìn)程的進(jìn)程表項;(3)若未找到處于“僵死狀態(tài)”的子進(jìn)程,則調(diào)用進(jìn)程便在可被中斷的優(yōu)先級上睡眠,等待其子進(jìn)程發(fā)來軟中斷信號時被喚醒。3、exit( )終止進(jìn)程的執(zhí)行。系統(tǒng)調(diào)用格式: v

3、oid exit(int status) 其中,status是返回給父進(jìn)程的一個整數(shù),以備查考。為了及時回收進(jìn)程所占用的資源并減少父進(jìn)程的干預(yù),UNIX/LINUX利用exit( )來實現(xiàn)進(jìn)程的自我終止,通常父進(jìn)程在創(chuàng)建子進(jìn)程時,應(yīng)在進(jìn)程的末尾安排一條exit( ),使子進(jìn)程自我終止。exit(0)表示進(jìn)程正常終止,exit(1)表示進(jìn)程運(yùn)行有錯,異常終止。 如果調(diào)用進(jìn)程在執(zhí)行exit( )時,其父進(jìn)程正在等待它的終止,則父進(jìn)程可立即得到其返回的整數(shù)。核心須為exit( )完成以下操作:(1)關(guān)閉軟中斷(2)回收資源(3)寫記帳信息(4)置進(jìn)程為“僵死狀態(tài)”4、exec()函數(shù)族fork( )

4、只是將父進(jìn)程的用戶級上下文拷貝到新進(jìn)程中,而exec( )系列可以將一個可執(zhí)行的二進(jìn)制文件覆蓋在新進(jìn)程的用戶級上下文的存儲空間上,以更改新進(jìn)程的用戶級上下文。exec( )系列中的系統(tǒng)調(diào)用都完成相同的功能,它們把一個新程序裝入內(nèi)存,來改變調(diào)用進(jìn)程的執(zhí)行代碼,從而形成新進(jìn)程。如果exec( )調(diào)用成功,調(diào)用進(jìn)程將被覆蓋,然后從新程序的入口開始執(zhí)行,這樣就產(chǎn)生了一個新進(jìn)程,新進(jìn)程的進(jìn)程標(biāo)識符id 與調(diào)用進(jìn)程相同。exec( )沒有建立一個與調(diào)用進(jìn)程并發(fā)的子進(jìn)程,而是用新進(jìn)程取代了原來進(jìn)程。所以exec( )調(diào)用成功后,沒有任何數(shù)據(jù)返回。exec( )系列系統(tǒng)調(diào)用在UNIX系統(tǒng)庫unistd.h中,

5、共有execl、execlp、execle、execv、execvp五個,其基本功能相同,只是以不同的方式來給出參數(shù)。(1) execl( )int execl(char *path, char * arg0, char * arg1,. char *argn,0);種是直接給出參數(shù)的指針(2) execv( )int execv(char *path, char *argv);給出指向參數(shù)表的指針(3) execlp( )int execlp(const char * file,const char * arg,.,(char *)0);execlp()會從PATH 環(huán)境變量所指的目錄中查找

6、符合參數(shù)file的文件名,找到后便執(zhí)行該文件,然后將第二個以后的參數(shù)當(dāng)做該文件的argv0、argv1,最后一個參數(shù)必須用空指針(NULL)作結(jié)束。二、 Linux信號機(jī)制(一) 信號的基本概念 每個信號都對應(yīng)一個正整數(shù)常量(稱為signal number,即信號編號。定義在系統(tǒng)頭文件<signal.h>中),代表同一用戶的諸進(jìn)程之間傳送事先約定的信息的類型,用于通知某進(jìn)程發(fā)生了某異常事件。每個進(jìn)程在運(yùn)行時,都要通過信號機(jī)制來檢查是否有信號到達(dá)。若有,便中斷正在執(zhí)行的程序,轉(zhuǎn)向與該信號相對應(yīng)的處理程序,以完成對該事件的處理;處理結(jié)束后再返回到原來的斷點(diǎn)繼續(xù)執(zhí)行。實質(zhì)上,信號機(jī)制是對

7、中斷機(jī)制的一種模擬,故在早期的UNIX版本中又把它稱為軟中斷。 信號與中斷的相似點(diǎn):采用了相同的異步通信方式;當(dāng)檢測出有信號或中斷請求時,都暫停正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序;都在處理完畢后返回到原來的斷點(diǎn);對信號或中斷都可進(jìn)行屏蔽。 信號與中斷的區(qū)別:中斷有優(yōu)先級,而信號沒有優(yōu)先級,所有的信號都是平等的;信號處理程序是在用戶態(tài)下運(yùn)行的,而中斷處理程序是在核心態(tài)下運(yùn)行;中斷響應(yīng)是及時的,而信號響應(yīng)通常都有較大的時間延遲。 信號機(jī)制具有以下三方面的功能:發(fā)送信號。發(fā)送信號的程序用系統(tǒng)調(diào)用kill( )實現(xiàn);預(yù)置對信號的處理方式。接收信號的程序用signal( )來實現(xiàn)對處理方式的預(yù)置;收

8、受信號的進(jìn)程按事先的規(guī)定完成對相應(yīng)事件的處理。2、信號的發(fā)送 信號的發(fā)送,是指由發(fā)送進(jìn)程把信號送到指定進(jìn)程的信號域的某一位上。如果目標(biāo)進(jìn)程正在一個可被中斷的優(yōu)先級上睡眠,核心便將它喚醒,發(fā)送進(jìn)程就此結(jié)束。一個進(jìn)程可能在其信號域中有多個位被置位,代表有多種類型的信號到達(dá),但對于一類信號,進(jìn)程卻只能記住其中的某一個。進(jìn)程用kill( )向一個進(jìn)程或一組進(jìn)程發(fā)送一個信號。3、對信號的處理 當(dāng)一個進(jìn)程要進(jìn)入或退出一個低優(yōu)先級睡眠狀態(tài)時,或一個進(jìn)程即將從核心態(tài)返回用戶態(tài)時,核心都要檢查該進(jìn)程是否已收到軟中斷。當(dāng)進(jìn)程處于核心態(tài)時,即使收到軟中斷也不予理睬;只有當(dāng)它返回到用戶態(tài)后,才處理軟中斷信號。對軟中斷

9、信號的處理分三種情況進(jìn)行:如果進(jìn)程收到的軟中斷是一個已決定要忽略的信號(function=1),進(jìn)程不做任何處理便立即返回;進(jìn)程收到軟中斷后便退出(function=0);執(zhí)行用戶設(shè)置的軟中斷處理程序。(二)所涉及的中斷調(diào)用1、kill( )系統(tǒng)調(diào)用格式int kill(pid,sig)參數(shù)定義int pid,sig; 其中,pid是一個或一組進(jìn)程的標(biāo)識符,參數(shù)sig是要發(fā)送的軟中斷信號。(1)pid>0時,核心將信號發(fā)送給進(jìn)程pid。(2)pid=0時,核心將信號發(fā)送給與發(fā)送進(jìn)程同組的所有進(jìn)程。(3)pid=-1時,核心將信號發(fā)送給所有用戶標(biāo)識符真正等于發(fā)送進(jìn)程的有效用戶標(biāo)識號的進(jìn)程。

10、2、signal( )預(yù)置對信號的處理方式,允許調(diào)用進(jìn)程控制軟中斷信號。系統(tǒng)調(diào)用格式:signal(int sig, void (*function) ( )頭文件為: #include <signal.h>參數(shù)定義sig:用于指定信號的類型,sig為0則表示沒有收到任何信號,余者如下表:信號值信號名信號意義缺省處理01SIGHUP進(jìn)程的控制終端和控制進(jìn)程已結(jié)束終止進(jìn)程02SIGINT用戶鍵入了Ctrl-C鍵終止進(jìn)程03SIGQUIT從鍵盤來的終止(Quit)信號終止進(jìn)程、Core轉(zhuǎn)儲04SIGILL進(jìn)程執(zhí)行了非法指令和企圖執(zhí)行數(shù)據(jù)段終止進(jìn)程、Core轉(zhuǎn)儲05SIGTRAP跟蹤陷阱

11、(trace trap),執(zhí)行Trap執(zhí)行跟蹤代碼的執(zhí)行終止進(jìn)程、Core轉(zhuǎn)儲06SIGIOT進(jìn)程發(fā)生錯誤并調(diào)用abort終止進(jìn)程、Core轉(zhuǎn)儲07SIGEMT進(jìn)程訪問非法地址、地址對齊出錯等終止進(jìn)程、Core轉(zhuǎn)儲08SIGFPE浮點(diǎn)運(yùn)算錯誤、溢出、除數(shù)為0等終止進(jìn)程、Core轉(zhuǎn)儲09SIGKILL強(qiáng)制進(jìn)程終止(此信號不能屏蔽) 終止進(jìn)程(不能忽視)10SIGUSR1保留給用戶自行定義終止進(jìn)程11SIGSEGV進(jìn)程訪問內(nèi)存越界,和無權(quán)限訪問終止進(jìn)程、Core轉(zhuǎn)儲12SIGUSR2保留給用戶自行定義信號終止進(jìn)程13SIGPIPE進(jìn)程向無讀者的管道進(jìn)行寫操作終止進(jìn)程14SIGALRM時鐘定時信號。

12、當(dāng)某進(jìn)程希望在某時間后接收信號時發(fā)此信號終止進(jìn)程15SIGTERM進(jìn)程結(jié)束信號,由kill命令產(chǎn)生終止進(jìn)程16SIGSTKFLT進(jìn)程發(fā)現(xiàn)堆棧溢出錯誤終止進(jìn)程、Core轉(zhuǎn)儲17SIGCHLD子進(jìn)程終止信號忽視18SIGCONT讓暫停的進(jìn)程繼續(xù)執(zhí)行進(jìn)程暫停時繼續(xù)運(yùn)行19SIGSTOP暫停(Stop)進(jìn)程的執(zhí)行暫停進(jìn)程20SIGTSTP用戶鍵入暫停(Ctrl-Z)暫停進(jìn)程21SIGTTIN后臺作業(yè)要從用戶終端(stdin)讀數(shù)據(jù)暫停進(jìn)程22SIGTTOU后臺作業(yè)要寫用戶終端暫停進(jìn)程23SIGURG套接字(socket)有“緊急”數(shù)據(jù)到達(dá)忽視24SIGXCPU進(jìn)程使用CPU超時終止進(jìn)程、Core轉(zhuǎn)儲2

13、5SIGXFSZ進(jìn)程處理文件超長終止進(jìn)程、Core轉(zhuǎn)儲26SIGVALRM虛擬時鐘信號(計算進(jìn)程占用CPU時間)終止進(jìn)程27SIGPROF類似SIGALRM/SIGVALRM(計算進(jìn)程占用CPU世界以及系統(tǒng)調(diào)用的時間)終止進(jìn)程28SIGWINCH窗口大小已改變忽視29SIGIOI/O準(zhǔn)備就緒,可以進(jìn)行輸入輸出操作忽視30SIGPWR系統(tǒng)電源失效終止進(jìn)程31SIGUNUSED終止進(jìn)程function:在該進(jìn)程中的一個函數(shù)地址,在核心返回用戶態(tài)時,它以軟中斷信號的序號作為參數(shù)調(diào)用該函數(shù),對除了信號SIGKILL,SIGTRAP和SIGPWR以外的信號,核心自動地重新設(shè)置軟中斷信號處理程序的值為SI

14、G_DFL,一個進(jìn)程不能捕獲SIGKILL信號。function 的解釋如下:(1)function=1時,進(jìn)程對sig類信號不予理睬,亦即屏蔽了該類信號;(2)function=0時,缺省值,進(jìn)程在收到sig信號后應(yīng)終止自己;(3)function為非0,非1類整數(shù)時,function的值即作為信號處理程序的指針。三、 Pthread線程管理與控制API (1) 線程創(chuàng)建和啟動函數(shù)函數(shù)說明:#include <pthread.h>int pthread_create(pthread_t *thread, pthread_attr *attr, void *(*start_rout

15、ine)(void *), void *arg);功能:創(chuàng)建線程和啟動線程,與進(jìn)程管理函數(shù)fork()的功能相似參數(shù)說明:thread:創(chuàng)建線程成功時,在該指針致祥的變量中寫入新線程的線程標(biāo)識符;attr: 線程屬性參數(shù)指針,可以為NULL;start_routine:一個函數(shù)的地址指針,線程創(chuàng)建成功后,新線程執(zhí)行該函數(shù)指針?biāo)赶虻暮瘮?shù)的代碼;arg:傳遞給線程啟動函數(shù)的參數(shù)。返回值:0表示成功;非0表示失敗。(2) 線程退出函數(shù)函數(shù)說明:void pthread_exit(void *retval);參數(shù)說明:retval將傳給執(zhí)行pthread_join的線程的thread_return參

16、數(shù)。(3) 線程歸并函數(shù)等待線程結(jié)束,讀取線程的計算結(jié)果。函數(shù)說明:int pthread_join(pthread_t th, void *thread_return);參數(shù)說明:th:線程標(biāo)識符,由執(zhí)行pthread_create函數(shù)返回到參數(shù)thread中的值;thread_return:其它線程執(zhí)行pthread_exit時在retval參數(shù)中指明的值被置于該變量指針指向的變量中。返回值:0表示成功;非0表示失敗。 實驗3-3 Linux多進(jìn)程并發(fā)程序設(shè)計(必做)【實驗?zāi)康摹?、掌握進(jìn)程的概念,明確進(jìn)程和程序的區(qū)別。2、認(rèn)識和了解并發(fā)執(zhí)行的實質(zhì)。3、分析進(jìn)程爭用資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程

17、互斥的方法?!緦嶒瀮?nèi)容】1、Linux進(jìn)程創(chuàng)建與進(jìn)程并發(fā)性(必做題) 編寫一段程序,使用系統(tǒng)調(diào)用fork( )創(chuàng)建兩個子進(jìn)程,在系統(tǒng)中有一個父進(jìn)程和兩個子進(jìn)程活動。讓每個進(jìn)程在屏幕上顯示一個字符;父進(jìn)程顯示字符“a”,子進(jìn)程分別顯示字符“b” 和“c”。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。 3-3-1.c #include<stdio.h> void main() int p1, p2; while(p1=fork()= -1); if(p1=0) putchar('b'); else while(p2=fork()=-1); if(p2=0) putchar(

18、'c'); else putchar( 'a'); 分析:由fork()函數(shù)創(chuàng)建了兩個子進(jìn)程,然后父進(jìn)程和兩個子進(jìn)程并發(fā)執(zhí)行,所以最后三個進(jìn)程都進(jìn)行了打印,結(jié)果為:“bca”。2、 Linux進(jìn)程獨(dú)立地址空間特性(資源擁有者特性)修改已編寫的程序,三個進(jìn)程將不同字符串(進(jìn)程名)賦給同名字符數(shù)組str,并顯示出來,觀察程序執(zhí)行時屏幕上出現(xiàn)的現(xiàn)象,并分析其原因。(必做題)3-3-2.c#include<stdio.h>#include<string.h>void main() int p1, p2, i; char str20; while(

19、p1=fork()=-1); if(p1=0) strcpy(str,"son"); for(i=0;i<500;i+) printf("%s %dn",str,i); else while(p2=fork()=-1); if(p2=0) strcpy(str,"daughter"); for(i=0;i<500;i+) printf("%s %dn",str,i); else strcpy(str,"father"); for(i=0;i<500;i+) printf(&qu

20、ot;%s %dn",str,i); 3. 用exec系統(tǒng)調(diào)用改變Linux進(jìn)程映像設(shè)計一個程序,此程序從終端讀入命令并執(zhí)行之,執(zhí)行完成后,父進(jìn)程繼續(xù)等待從終端讀入命令。3-3-3.c:#include <errno.h>#include <stdio.h>#include <string.h>#include <stdlib.h>char command256;void main() int rtn; /*子進(jìn)程的返回數(shù)值*/ while(1) /* 從終端讀取要執(zhí)行的命令 */ printf( ">" );

21、 fgets( command, 256, stdin ); commandstrlen(command)-1 = 0; if ( fork() = 0 ) /* 子進(jìn)程執(zhí)行此命令 */ execlp( command, NULL ); /* 如果exec函數(shù)返回,表明沒有正常執(zhí)行命令,打印錯誤信息*/ perror( command ); exit( errno ); else /* 父進(jìn)程, 等待子進(jìn)程結(jié)束,并打印子進(jìn)程的返回值 */ wait ( &rtn ); printf( " child process return %dn", rtn ); 4、編寫程

22、序創(chuàng)建進(jìn)程樹如圖1和圖2所示,在每個進(jìn)程中顯示當(dāng)前進(jìn)程識別碼和父進(jìn)程識別碼。(必做題)a父進(jìn)程子進(jìn)程圖1 進(jìn)程樹bcdadbce圖2 進(jìn)程樹圖一的實現(xiàn)源碼:#include<stdio.h>main()int p1,p2,p3;while(p1=fork()=-1);if(p1=0)while(p2=fork()=-1); if(p2=0)while(p3=fork()=-1);if(p3=0)printf("Process ID=%d,%cn",getpid(), 'd');elseprintf("Process ID=%d,chil

23、dProcess ID=%d,%cn",getpid(),p3, 'c');elseprintf("ProcessID=%d,childProcessID=%d,%cn",getpid(),p2,'b');elseprintf("ProcessID=%d,childProcessID=%d,%cn",getpid(),p1,'a');【思考題】1、 系統(tǒng)是怎樣創(chuàng)建進(jìn)程的?答:一旦操作系統(tǒng)發(fā)現(xiàn)了要求創(chuàng)建新進(jìn)程的事件后,便調(diào)用進(jìn)程創(chuàng)建原語Creat()按下述步驟創(chuàng)建一個新進(jìn)程。 (1)

24、60;申請空白PCB。為新進(jìn)程申請獲得唯一的數(shù)字標(biāo)識符,并從PCB集合中索取一個空白PCB (2) 為新進(jìn)程分配資源。為新進(jìn)程的程序和數(shù)據(jù)以及用戶棧分配必要的內(nèi)存空間。 (3)  初始化進(jìn)程控制塊。包括:初始化標(biāo)識信息,處理機(jī)狀態(tài)信息,處理機(jī)狀態(tài)控制信息。 (4)  將新進(jìn)程插入就緒隊列,如果進(jìn)程就緒隊列能夠接納新進(jìn)程,便將新進(jìn)程插入到就緒隊列中。2、 當(dāng)首次調(diào)用新創(chuàng)建進(jìn)程時,其入口在哪里?答:fork系統(tǒng)調(diào)用創(chuàng)建的子進(jìn)程繼承了原進(jìn)程的context,也就是說fork調(diào)用成功后,子進(jìn)程與父進(jìn)程并發(fā)執(zhí)行相同的代碼。但由于子進(jìn)程也繼承了父

25、進(jìn)程的程序指針,所以子進(jìn)程是從fork()后的語句開始執(zhí)行(也就是新進(jìn)程調(diào)用的入口)。另外fork在子進(jìn)程和父進(jìn)程中的返回值是不同的。在父進(jìn)程中返回子進(jìn)程的PID,而在子進(jìn)程中返回0。所以可以在程序中檢查PID的值,使父進(jìn)程和子進(jìn)程執(zhí)行不同的分支。3、 當(dāng)前運(yùn)行的程序(主進(jìn)程)的父進(jìn)程是什么?答:init【實驗報告】1、列出調(diào)試通過程序的清單,分析運(yùn)行結(jié)果。2、給出必要的程序設(shè)計思路和方法(或列出流程圖)。3、回答思考題。4、總結(jié)上機(jī)調(diào)試過程中所遇到的問題和解決方法及感想。實驗3-4 Linux信號機(jī)制(必做) UNIX/LINUX系統(tǒng)的進(jìn)程間通信機(jī)構(gòu)(IPC)允許在任意進(jìn)程間大批量地交換數(shù)據(jù)

26、。本實驗的目的是了解和熟悉LINUX支持的信號量機(jī)制、管道機(jī)制、消息通信機(jī)制及共享存儲區(qū)機(jī)制。【實驗?zāi)康摹?、了解什么是信號。2、熟悉LINUX系統(tǒng)中進(jìn)程之間軟中斷通信的基本原理?!緦嶒瀮?nèi)容】1、信號機(jī)制任務(wù)一編寫一段程序,使用系統(tǒng)調(diào)用fork( )創(chuàng)建兩個子進(jìn)程,再用系統(tǒng)調(diào)用signal( )讓父進(jìn)程捕捉鍵盤上來的中斷信號(即按ctrl+c鍵),當(dāng)捕捉到中斷信號后,父進(jìn)程用系統(tǒng)調(diào)用kill( )向兩個子進(jìn)程發(fā)出信號,子進(jìn)程捕捉到信號后,分別輸出下列信息后終止: Child process 1 is killed by parent!Child process 2 is killed by p

27、arent!父進(jìn)程等待兩個子進(jìn)程終止后,輸出以下信息后終止: Parent process is killed!3-4-1.c:#include<stdio.h>#include<signal.h>#include<unistd.h>#include<sys/types.h>#include<sys/wait.h>int wait_mark;void waiting(),stop();void main()int p1, p2;signal(SIGINT,stop);while(p1=fork()=-1);if(p1>0)/*在

28、父進(jìn)程中*/while(p2=fork()=-1); if(p2>0)/*在父進(jìn)程中*/ wait_mark=1; waiting(0); kill(p1,10); kill(p2,12); wait(NULL);wait( NULL); printf("parent process is killed!n"); exit(0); else/*在子進(jìn)程2中*/ wait_mark=1;signal(12,stop);waiting();lockf(1,1,0);printf("child process 2 is killed by parent!n&quo

29、t;);lockf(1,0,0);exit(0); else/*在子進(jìn)程1中*/ wait_mark=1; signal(10,stop); waiting(); lockf(1,1,0); printf("child process 1 is killed by parent!n"); lockf(1,0,0); exit(0);void waiting() while(wait_mark!=0);void stop() wait_mark=0;實驗要求:、運(yùn)行程序并分析結(jié)果。、如果把signal(SIGINT,stop)放在號和號位置,結(jié)果會怎樣并分析原因。答:如果把s

30、ignal(SIGINT,stop)放在(1)號和(2)號位置后,結(jié)果先輸出child process 2 is killed by parent!然后輸出parent process is killed!而不會輸出child process 1 is killed by parent!因為在fork子進(jìn)程1后,子進(jìn)程1中沒有設(shè)置對SIGINT信號的處理,當(dāng)按下CTRL+C后,進(jìn)程1默認(rèn)為終止,所以沒有輸出.、該程序段前面部分用了兩個wait(NULL),為什么?答:設(shè)置了兩個wait(),是為了等待兩個子進(jìn)程結(jié)束標(biāo)志.、該程序段中每個進(jìn)程退出時都用了語句exit(0),為什么?答:每個進(jìn)程退

31、出時都用了語句exit(0),一方面要結(jié)束進(jìn)程,另外向父進(jìn)程返回結(jié)束標(biāo)志02、信號機(jī)制任務(wù)二運(yùn)行程序并分析結(jié)果,給出程序中5個問題的答案,并給出解釋說明。3-4-2.c:#include<stdio.h>#include<signal.h>#include<unistd.h>#include<sys/types.h>#include<sys/wait.h>int flag=1; void func () flag = flag + 5; main ( )int status;pid_t pid;void func ( );flag =

32、 flag + 15; / 問題1: flag=?signal (SIGUSR1,func);if (pid=fork () ) /父進(jìn)程 flag =flag +5; /問題2:flag=? kill (pid, SIGUSR1); /* 發(fā)送信號 */wait (&status); /* 等待子進(jìn)程停止 */ /問題5:status=?else /子進(jìn)程 flag = flag + 50; /問題3:flag = ? sleep (100); /* 等待接受信號 */ printf ("flag=%dn",flag);/問題4:flag=? exit (80);

33、 【實驗報告】1、列出調(diào)試通過程序的清單,分析運(yùn)行結(jié)果。2、給出必要的程序設(shè)計思路和方法(或列出流程圖)。3、總結(jié)上機(jī)調(diào)試過程中所遇到的問題和解決方法及感想。實驗3-5 Linux多進(jìn)程程序設(shè)計(必做)【實驗?zāi)康摹?. 加深對線程概念的理解;2. 掌握在使用POSIX線程機(jī)制進(jìn)行多線程應(yīng)用程序的編程方法?!緦嶒瀮?nèi)容】1. 編寫程序,創(chuàng)建2個線程,循環(huán)輸出不同信息,編譯執(zhí)行該程序,分析程序輸出結(jié)果,并做出解釋。3-5-1.c:    #include <stdio.h>#include <pthread.h>void *myThread1(v

34、oid)  int i;   for (i=0; i<100; i+)        printf("This is the 1st pthread,created by zieckey.n");     sleep(1);     void *myThread2(void)  int i;  for (i=0; i<100; i+)     

35、printf("This is the 2st pthread,created by zieckey.n");    sleep(1);  int main()    int i=0, ret=0;    pthread_t id1,id2;       ret = pthread_create(&id2, NULL, (void*)myThread1, NULL);  

36、0; if (ret)            printf("Create pthread error!n");        return 1;           ret = pthread_create(&id2, NULL, (void*)myThread2, NULL);    i

37、f (ret)            printf("Create pthread error!n");        return 1;           pthread_join(id1, NULL);/*等待線程結(jié)束*/    pthread_join(id2, NULL); /*等待線程結(jié)

38、束*/       return 0;編譯執(zhí)行命令:$ gcc 3-5-1.c -lpthread o 3-5-1$ ./3-5-12. 多線程合作完成共同任務(wù) 兩個線程對共享數(shù)組a10000進(jìn)行求和匯總,主線程main對數(shù)組進(jìn)行初始化ai=i,并完成前5000項求和保存到變量sum1,新線程完成后5000項求和存入變量sum2,最后主線程main將sum1與sum2相加保存到sum,并輸出顯示。3-5-2.c:#include <stdio.h>#include <pthread.h>#include <unistd.h>static int a10000;static sum1,sum2,sum;void *thread1(void *arg) int i;sum2=0;for (i=5000;i<10000; i+) sum2=sum2+ai;pthread_exit(void*) sum2);int main(int argc,char* argv) pthread_t tidp; int error,i;int thread_result; for(i=0;i<10000; i+) ai=i; error = pthread_create(&tidp,N

溫馨提示

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

評論

0/150

提交評論