Linux進程管理編程(進程的創(chuàng)建)_第1頁
Linux進程管理編程(進程的創(chuàng)建)_第2頁
Linux進程管理編程(進程的創(chuàng)建)_第3頁
Linux進程管理編程(進程的創(chuàng)建)_第4頁
Linux進程管理編程(進程的創(chuàng)建)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實訓(xùn)1 Linux進程管理命令的使用實訓(xùn)目標:(1) 掌握Linux中ps命令使用方法。(2) 掌握Linux中top命令使用方法。實訓(xùn)內(nèi)容:(1) 使用ps命令查看進程。(2) 使用top命令查看進程。實訓(xùn)步驟:(1) 使用ps命令查看進程。a. 不帶參數(shù)的ps命令:# psb. 帶參數(shù)的ps命令:# ps aux(2) 使用top命令查看進程。 a. 監(jiān)視特定用戶:$ top:輸入此命令,按【Enter】鍵,查看執(zhí)行結(jié)果。 u: 然后輸入“u”按【Enter】鍵,再輸入用戶名,即可。b. 終止指定的進程:$ top:輸入此命令,按【Enter】鍵,查看執(zhí)行結(jié)果。 k: 然后輸入“k”按【E

2、nter】鍵,再輸入要結(jié)束的進 程ID號。實訓(xùn)2 Linux進程管理編程(進程的創(chuàng)建)實訓(xùn)目標:掌握fork()系統(tǒng)調(diào)用的使用。 實訓(xùn)內(nèi)容:寫出如下程序的執(zhí)行結(jié)果,并畫出該進程家族樹。/*fork()*/#includemain()fork(); /*父進程1創(chuàng)建子進程2*/ fork();/*父進程返回后分別再創(chuàng)建各自的子進程3、4*/ fork(); /*父進程1、2、3、4返回后分別再創(chuàng)建各自的子進程5、6、7、8*/putchar(A);/*每個進程都要輸出A*/putchar(n); /*輸出A后按【Enter】鍵換行*/實訓(xùn)步驟:(1) 新建并編輯fork3.c.(2) 編譯for

3、k3.c。 cathyastu 桌面 $ gcc -o fork3 fork3.c(3) 執(zhí)行fork3,結(jié)果如下。 cathyastu 桌面 $ ./fork3 A A A A A A A A cathyastu 桌面 $(4) 查看該進程執(zhí)行結(jié)果為八個“A”,說明有八個進程產(chǎn)生。其進程關(guān)系如圖38所示。12354678圖38 調(diào)用三次fork()的進程家族樹步驟24的執(zhí)行結(jié)果實訓(xùn)3 Linux進程管理編程(父子進程的同步)實訓(xùn)目標:掌握fork()系統(tǒng)調(diào)用的使用。實訓(xùn)內(nèi)容:實現(xiàn)子進程先輸出“B”然后父進程再輸出“A”,源程序命名為synl.c。實訓(xùn)步驟:(1) 編寫源文件synl.c為以下

4、內(nèi)容(執(zhí)行內(nèi)容如圖1): #include main() int p1; while(p1=fork()=-1); if (p10) wait(0); /父進程等待子進程終止 putchar(A); Putchar(n); else putchar(B); putchar(n); exit(0); /子進程向父進程發(fā)終止信號0 (2) 編譯(如圖2)。(3) 執(zhí)行(如圖2): cathyastu 桌面 $ ./synl B A cathyastu 桌面 $ 源程序編譯連接并多次運行后的結(jié)果都是子進程先輸出“B”父進程后輸出“A”,說明父進程等待子進程的同步關(guān)系成立。圖1圖2實訓(xùn)4 Linux進

5、程管理編程(生產(chǎn)者消費者問題)實訓(xùn)目標:掌握Linux關(guān)于同步、互斥信號量的使用。實訓(xùn)內(nèi)容: 設(shè)父進程創(chuàng)建一個子進程作為生產(chǎn)者,創(chuàng)建兩個子進程作為消費者,這三個子進程使用一個共享內(nèi)存,如圖39所示,該共享內(nèi)存定義為具有五個變量的數(shù)組,每個變量表示一個緩沖區(qū),緩沖區(qū)號為04.生產(chǎn)者進程依次往緩沖區(qū)04中寫十個數(shù)據(jù)110,兩個讀進程依次從緩沖區(qū)04中輪流取出這10個數(shù)據(jù)。使用信號量實現(xiàn)進程讀寫緩沖區(qū)的同步和互斥。 分析: (1)需要創(chuàng)建三個子進程:生產(chǎn)者、消費者A、消費者B; (2)需要使用三個信號量:empty、full、mutex,分別表示緩沖區(qū)是否有空、是否有 數(shù)和互斥信號量,其初值分別為:

6、5,0,1; (3)需要兩個共享內(nèi)存:array和get,分別表示多緩沖區(qū)數(shù)組變量array04和消費 者讀緩沖區(qū)號的計數(shù)get,get計數(shù)由兩個消費者進程共享,由于生產(chǎn)者只有一個, 所以寫緩沖區(qū)的計數(shù)set不需要使用共享內(nèi)存。實訓(xùn)步驟:(1) 新建并編輯編寫源文件為以下內(nèi)容:#include#include#include#include#include#include#include#define MAXSHM 5 /定義緩沖區(qū)數(shù)組的下標變量個數(shù)/*定義信號量的內(nèi)部標識*/int fullid;int emptyid;int mutexid;int main() /*定義共享內(nèi)存的ID *

7、/ int arrayid; int getid; /*定義共享內(nèi)存虛擬地址*/ int *array; int *get; /*創(chuàng)建共享內(nèi)存*/arrayid=shmget(IPC_PRIVATE,sizeof(int)*MAXSHN,IPC_CREAT|0666); getid=shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666); /*初始化共享內(nèi)存*/ array=(int *) shmat(arrayid,0,0); get=(int *) shmat(getid,0,0); *get=0; /* 定義信號量數(shù)據(jù)結(jié)構(gòu) */ struct sem

8、buf P,V; union semun arg; /* 創(chuàng)建信號量 */ fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666); emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666); mutexid=semget(IPC_PRIVATE,1,IPC_CREAT|0666); /*初始化信號量 */ arg.val=0; /初始時緩沖區(qū)中無數(shù)據(jù) if(semctl(fullid,0,SETVAL,arg)=-1) perror(semctl setval error); arg.val=MAXSHM; /初始時緩沖區(qū)中有5

9、個空閑的數(shù)組元素 if(semctl(emptyid,0,SETVAL,arg)=-1) perror(semctl setval error); arg.val=1; /初始時互斥信號為1,允許一個進程進入 if(semctl(mutexid,0,SETVAL,arg)=-1) perror(semctl setval error); /* 初始化 P V操作 */ P.sem_num=0; P.sem_op=-1; P.sem_flg=SEM_UNDO; V.sem_num=0; V.sem_op=1; V.sem_flg=SEM_UNDO; /* 生產(chǎn)者進程 */ if(fork()=0

10、) int i=0; int set=0; while(i10) semop(emptyid,&P,1); /對 emptyid執(zhí)行P操作 semop(mutexid,&P,1); /對 mutexid執(zhí)行 P操作 arrayset%MAXSHM=i+1; printf(Producer put number %d to No.%dn,arrayset%MAXSHM,set%MAXSHM); set+; /寫計數(shù)加1 semop(mutexid,&V,1); /對mutexid執(zhí)行 V 操作 semop(fullid,&V,1); /對fullid執(zhí)行 V 操作 i+; sleep(3); /

11、等待消費者進程執(zhí)行完畢 printf(Poducer if overn); exit(0); else /* 消費者A進程 */ if(fork()=0) while(1) if(*get=10) break; semop(fullid,&P,1); /對fullid執(zhí)行 P 操作 semop(mutexid,&P,1); /對mutexid執(zhí)行 P 操作 printf(The ConsumerA get number from No.%dn,(*get)%MAXSHM); (*get)+; /讀計數(shù)加1 semop(mutexid,&V,1); /對mutexid執(zhí)行 V 操作 semop(

12、emptyid,&V,1); /對fullid執(zhí)行 V 操作 sleep(1); printf(ConsunerA is overn); exit(0); else /*消費者B進程 */ if(fork()=0) while(1) if(*get=10) break; semop(fullid,&P,1); /對fullid執(zhí)行 P 操作 semop(mutexid,&P,1); /對mutexid執(zhí)行 P 操作 printf(The ConsumerA get number from No.%dn,(*get)%MAXSHM); (*get)+; /讀計數(shù)加1 semop(mutexid,

13、&V,1); /對mutexid執(zhí)行 V 操作 semop(emptyid,&V,1); /對emptyid執(zhí)行 V 操作 sleep(1); printf(ConsunerB is overn); exit(0); /* 父進程返回后回收3個子進程 */ wait(0); wait(0); wait(0); /* 斷開并撤消2個共享內(nèi)存 */ shmdt(array); shmctl(arrayid,IPC_RMID,0); shmctl(get); shmctl(getid,IPC_RMID,0); /* 撤消3個信號量集 */ semctl(emptyid,IPC_RMID,0); semctl(fulli

溫馨提示

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

評論

0/150

提交評論