




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、操作系統(tǒng)實驗報告姓名: 學號: 完成時間:2012年11月22日1 / 28目錄:實驗一:UNIX/LINUIX入門.1 實驗二:進程管理.3實驗三:線程的管理.10實驗四:利用信號實現(xiàn)進程間通信.15實驗五:基于消息隊列和共享內(nèi)存的進程間通信.18實驗六:一個進程啟動另一個程序的執(zhí)行.23實驗一 UNIX/LINUIX入門一、實驗?zāi)康?了解UNIX/LINUX運行環(huán)境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下c語言程序的編寫、編譯、調(diào)試和運行方法。二、實驗內(nèi)容1、熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。2、練習UNIX/LINUX
2、的文本行編輯器vi的使用方法3、熟悉UNIX/LINUX下c語言編譯器cc/gcc的使用方法。用vi編寫一個簡單的顯示“Hello,World!”c語言程序,用gcc編譯并觀察編譯后的結(jié)果,然后運行它。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計代碼如下:#includevoid main()printf(hello world);五、運行結(jié)果1六、收獲及機會此次實驗讓我熟悉了Liunx下的文本行編輯器vi和c語言編譯器cc/gcc的使用方法。七、參考資料實驗指導書2實驗二 進程管理一、實驗?zāi)康?加深對進程概念的理解,明確
3、進程與程序的區(qū)別;進一步認識并發(fā)執(zhí)行的實質(zhì)二、實驗內(nèi)容(1)進程創(chuàng)建編寫一段程序,使用系統(tǒng)調(diào)用 fork()創(chuàng)建兩個子進程。當此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示“a“;子進程分別顯示字符”b“和字符“c”。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。(2)進程控制修改已編寫的程序,將每一個進程輸出一個字符改為每一個進程輸出一句話,再觀察程序執(zhí)行時屏幕上出現(xiàn)的現(xiàn)象,并分析原因。(3)進程的管道通信編寫程序?qū)崿F(xiàn)進程的管道通信。使用系統(tǒng)調(diào)用pipe()建立一個管道,二個子進程P1 和P2 分別向管道各寫一句話:Child 1 is sendi
4、ng a message!Child 2 is sending a message!父進程從管道中讀出二個來自子進程的信息并顯示(要求先接收P1,再接收P2)。三、實驗要求 按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計(1)進程創(chuàng)建使用fork()創(chuàng)建兩個子進程,父進程等待兩個子進程執(zhí)行完在運行。(2)進程控制使用fork()創(chuàng)建兩個子進程,父進程等待兩個子進程分別輸出一句話在運行。(3)進程的管道通信建立一個管道。在程序中先建立一個子進程,然后向管道中輸入數(shù)據(jù),然后從子進程中退出到父進程,讀出管道數(shù)據(jù),然后再建立一個子進程,寫入數(shù)據(jù)
5、,再讀出,即可。代碼如下:(1) 進程創(chuàng)建:#include #include #include #include #include #include #define INPUT 0#define OUTPUT 13void main() pid_t pid2; /定義兩個子進程pid0=fork(); /創(chuàng)建第一個子進程if(pid00) /判斷是否創(chuàng)建成功 printf(Fork Failed); exit(-1);else if(pid0 = 0)printf(bn);elsepid1=fork(); /創(chuàng)建另一子進程if(pid10) printf(Fork Failed);exit(
6、-1);else if(pid1 = 0)printf(cn);elsewait(NULL);printf(an); /父進程執(zhí)行exit(0);(2) 進程控制:#include #include #include #include #include #include 4#define INPUT 0#define OUTPUT 1void main() pid_t pid2;pid0=fork();if(pid00) printf(Fork Failed); exit(-1);else if(pid0 = 0)printf(this is bn);elsepid1=fork();if(pi
7、d10) printf(Fork Failed);exit(-1);else if(pid1 = 0)printf(this is cn);elsewait(NULL);printf(this is an);exit(0);(3) 進程的管道通信5#include #include #include #include #includevoid main()int rw2;/*定義子進程號*/pid_t pid2;int count,count2;/*創(chuàng)建無名管道*/ pipe(rw);char *msg1=child 1 process is sending message!n; 字符串msg
8、1char *msg2=child 2 process is sending message!n; 字符串msg2char buf50,s50;int result;result=pipe(rw);if(result=-1)printf(failed in calling pipe);/*創(chuàng)建子進程*/if(pid0 = fork() = -1) printf(Error in forkn);exit(1);if(pid0 = 0) /printf(child 1 process is sending message!n);/*子進程向父進程寫數(shù)據(jù),關(guān)閉管道的讀端*/close(rw0);wr
9、ite(rw1,msg1, 1+strlen(msg1);close(rw1);exit(0); else if(pid1 = fork() = -1) printf(Error in forkn);exit(1);if(pid1 = 0) /printf(child 2 process is sending message!n);/*子進程向父進程寫數(shù)據(jù),關(guān)閉管道的讀端*/6close(rw0);write(rw1, msg2, 1+strlen(msg2);close(rw1);exit(0); else/*執(zhí)行父進程*/printf(in the spawning (parent) pr
10、ocess.n);/*父進程從管道讀取子進程寫的數(shù)據(jù),關(guān)閉管道的寫端*/close(rw1);count=read(rw0,buf,sizeof(buf);count2=read(rw0,s,sizeof(s);close(rw0);printf(%d %sn,count,buf);printf(%d %sn,count2,s); 五、運行結(jié)果 (1)進程創(chuàng)建7 (2)進程控制8(3)進程的管道通信六、收獲及機會此次實驗讓我對進程和管道有了進一步的理解,用fork()創(chuàng)建完子進程后,要用exit()返回父進程,當需要創(chuàng)建兩個子進程的時候,不能直接在第一個子進程中直接fork(),要返回到父進程
11、再用fork()再次創(chuàng)建子進程,否則將無法控制。創(chuàng)建完管道后,在向管道中寫入數(shù)據(jù)和從管道中讀出數(shù)據(jù)的時候,要控制好管道的讀寫控制,不適當?shù)年P(guān)閉和開啟管道端口,將不能使得數(shù)據(jù)得到正確的讀寫。這些是我此次實驗最大的收獲,還需要在今后的時候發(fā)現(xiàn)更多的問題,有更深的理解。七、參考資料實驗指導書9實驗三 線程的管理一、實驗?zāi)康?編寫 Linux 環(huán)境下的多線程程序,了解多線程的程序設(shè)計方法,掌握最常用的三個函數(shù)pthread_create,pthread_join 和pthread_exit 的用法二、實驗內(nèi)容 1、主 程 序 創(chuàng) 建 兩 個 線 程 myThread1 和myThread2 , 每個線
12、程打印一句話。使用pthread_create(&id,NULL,(void *) thread,NULL)完成。提示:先定義每個線程的執(zhí)行體,然后在 main 中()創(chuàng)建幾個線程,最后主線程等待子線程結(jié)束后再退出。2、創(chuàng)建兩個線程,分別向線程傳遞如下兩種類型的參數(shù) 傳遞整型值 傳遞字符三、實驗要求 按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計 先定義2個線程的帶有參數(shù)的函數(shù),參數(shù)分別為整型(int)和字符型(char),每個函數(shù)中打印出相對應(yīng)線程的話。在main函數(shù)中,利用pthread_create函數(shù)創(chuàng)建該兩個線程,在函數(shù)參數(shù)中
13、的第四位,寫入想要傳進各進程的參數(shù)。最有利用pthread_join等待第二個結(jié)束后退出。代碼如下:1、主程序創(chuàng)建兩個線程 myThread1 和myThread2, 每個線程打印一句話。#include#include#include#includevoid myThread1(void) /線程1printf(this is phread1!n);void myThread2(void) /線程2printf(this is phread2!n);int main(void)10pthread_t id2; int ret;ret=pthread_create(&id0,NULL,(voi
14、d *)myThread1,NULL);if(ret!=0)printf(Create pthread error!n);exit(1);ret=pthread_create(&id1,NULL,(void *)myThread2,NULL);if(ret!=0)printf(Create pthread error!n);exit(1);pthread_join(id0,NULL);pthread_join(id1,NULL);printf(This is the main process.n);return(0);2、創(chuàng)建兩個線程,分別向線程傳遞如下兩種類型的參數(shù)#include#incl
15、ude#include#includevoid myThread1(void *a)int *num;num=(int*)a;printf(create integer is %dn,*num);11void myThread2( void *b)char *x;x=(char*)b;printf(create char is %cn,*x);int main(void)pthread_t id2;int ret;char c=L;char *a=&c;int test=23;int *attr=&test;ret=pthread_create(&id0,NULL,(void *)myThre
16、ad1,(void*)attr);if(ret!=0)printf(Create pthread error!n);exit(1);pthread_join(id0,NULL);ret=pthread_create(&id1,NULL,(void *)myThread2,(void*)a);if(ret!=0)printf(Create pthread error!n);exit(1);pthread_join(id1,NULL);printf(This is the main process.n);return(0);12五、運行結(jié)果1、主程序創(chuàng)建兩個線程 myThread1 和myThre
17、ad2, 每個線程打印一句話。2、創(chuàng)建兩個線程,分別向線程傳遞如下兩種類型的參數(shù)13六、收獲及體會此次實驗讓我對線程的創(chuàng)建有了進一步的理解,在熟練掌握pthread_create和pthread_join兩個函數(shù)的應(yīng)用上,進一步明白了如何向進程中傳入?yún)?shù)。七、參考資料實驗指導書14實驗四 利用信號實現(xiàn)進程間通信一、實驗?zāi)康?學習 UNIX 類操作系統(tǒng)信號機制,編寫Linux 環(huán)境下利用信號實現(xiàn)進程間通信的方法,掌握注冊信號處理程序及signal()調(diào)用方法。二、實驗內(nèi)容編寫一個程序,完成下列功能:實現(xiàn)一個SIGINT 信號的處理程序,注冊該信號處理程序,創(chuàng)建一個子進程,父子進程都進入等待。SI
18、GINT 信號的處理程序完成的任務(wù)包括打印接受到的信號的編號和進程PID。編譯并運行該程序,然后在鍵盤上敲Ctrl + C,觀察出現(xiàn)的現(xiàn)象,并解釋。三、實驗要求 按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計創(chuàng)建一個進程,在父子進程中都注冊一個用戶敲中斷鍵即Ctrl+C的信號處理程序,在子進程中注冊一個用戶定義信號1,在父進程中注冊一個用戶定義信號2,然后外部接收信號,最后在main函數(shù)中打印出信號的編號和進程PID。在運行時,當用戶鍵入Ctrl+C時,會自動打印出父子進程pid值,但信號的編號始終是父進程中注冊的用戶定義信號。代碼如下
19、:#include#include#include#include#define MAXSTACK 20int stackMAXSTACK;int a=0;int b=0;sem_t sem,sem1;void ReadData1(void)FILE *fp=fopen(1.dat,r);sem_wait(&sem1);int i;for(i=0;i10;i+)fscanf(fp,%d,&stacka+);sem_post(&sem1);sem_post(&sem);fclose(fp);void ReadData2(void)15FILE *fp=fopen(2.dat,r);sem_wai
20、t(&sem1);int i;for(i=0;i8;i+)fscanf(fp,%d,&stacka+);sem_post(&sem1);sem_post(&sem);fclose(fp);void HandleData1(void)int i;sem_wait(&sem);for(i=0;i4;i+)int m=stackb+;int n=stackb+;printf(Plus:%d+%d=%dn,m,n,m+n);void HandleData2(void)int i;sem_wait(&sem);for(i=0;i4;i+)int m=stackb+;int n=stackb+;print
21、f(mul:%d*%d=%dn,m,n,m*n);int main(void)pthread_t t1,t2,t3,t4;sem_init(&sem,0,0);sem_init(&sem1,0,1);pthread_create(&t1,NULL,(void *)HandleData1,NULL);pthread_create(&t2,NULL,(void *)HandleData2,NULL);pthread_create(&t3,NULL,(void *)ReadData1,NULL);pthread_create(&t4,NULL,(void *)ReadData2,NULL);pthr
22、ead_join(t1,NULL);16五、運行結(jié)果六、收獲及體會此次實驗讓我學會了在Linux 環(huán)境下利用信號實現(xiàn)進程間通信的方法,掌握注冊信號處理程序及signal()調(diào)用方法,也掌握了接收信號的寫法。并在試驗中,可通過用戶自己輸入信號來產(chǎn)生信號的編號,但是通過注冊SIGINT信號處理程序打印出的信號編號只是父進程中創(chuàng)建的用戶定義信號2,這點還是需要進一步討論。但總的來說,對利用信號實現(xiàn)進程間的通信,有了更深入的一個了解,收獲很大。七、參考資料實驗指導書17實驗五 基于消息隊列和共享內(nèi)存的進程間通信一、實驗?zāi)康?Linux系統(tǒng)的進程通信機構(gòu)(IPC)允許在任意進程間大批量地交換數(shù)據(jù)。本實驗
23、的目的是了解和熟悉:1. Linux支持的消息通信機制及其使用方法2. Linux系統(tǒng)的共享存儲區(qū)的原理及使用方法。二、實驗內(nèi)容 1.消息的創(chuàng)建、發(fā)送和接收 使用消息調(diào)用msgget()、msgsnd()、msggrev()、msgctrl()編制長度為1K的消息的發(fā)送和接收程序。2.共享存儲區(qū)的創(chuàng)建、附接和斷接使用系統(tǒng)調(diào)用shmget()、shmat()、shmctl(),編制一個與上述功能相同的程序。三、實驗要求 按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計1.消息隊列:先定義一個消息結(jié)構(gòu),包含消息類型和文本長度。在SERVER函
24、數(shù)中,首先獲得一個KEY為75的消息的描述符,然后利用do while循環(huán)來判斷當消息類型為1的時候打印輸出。在CLIENT函數(shù)中,先獲得消息隊列,然后利用for循環(huán)將消息類型從10賦值到1,發(fā)送隊列,并打印輸出。最后在main函數(shù)中調(diào)用這兩個函數(shù)。#include #include #include #include #define MSGKEY 75 struct msgform /*消息結(jié)構(gòu)*/long mtype; /*消息類型*/char mtexe1030; /*文本長度*/ msg;int msgqid,i;void CLIENT( )int i;msgqid=msgget(MS
25、GKEY,0777); /*獲得消息的描述符msgqid*/for(i=10;i=1;i-) /*將消息類型由10到1發(fā)送*/msg.mtype=i;18printf(client)sentn);msgsnd(msgqid,&msg,1024,0); /*發(fā)送消息msg入msgid消息隊列*/exit(0);void SERVER( ) msgqid=msgget(MSGKEY,0777|IPC_CREAT); do msgrcv(msgqid,&msg,1030,0,0); /*從隊列msgid接受消息msg*/ printf(server)receiven); while(msg.mtyp
26、e!=1); /*消息類型為1時,釋放隊列*/ msgctl(msgqid, IPC_RMID,0); exit(0);main() if(fork() SERVER();else CLIENT( );wait(0);wait(0);2.共享存儲區(qū):先獲取共享區(qū),KEY為75,并獲得描述符,然后將該共享存儲區(qū)附接到addr這個虛擬地址上,如消息隊列類似,利用while循環(huán)從10到1打印輸出,并將i值賦給addr。在SERVER中,創(chuàng)建共享存儲區(qū),并將起始地址也設(shè)置為addr,服務(wù)進程共享存儲區(qū),所以直接用while循環(huán)輸出打印“receive”。代碼如下:#include#include#in
27、clude#define SHMKEY 75 /*定義共享區(qū)關(guān)鍵詞*/int shmid,i;int *addr;CLIENT()int i;19shmid=shmget(SHMKEY,1024,0777); /*獲取共享區(qū)*/addr=shmat(shmid,0,0); /*共享區(qū)起始地址為addr*/ for(i=9;i=0;i-)while(*addr!= -1); printf(client)sentn); *addr=i; exit(0);SERVER()shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); addr=shmat(shmid,0,0);
28、do*addr=-1; /*服務(wù)進程使用共享區(qū)*/while(*addr=-1);printf(server)receivedn); while(*addr);shmctl(shmid,IPC_RMID,0);exit(0);main()if(fork()SERVER();if(fork()CLIENT();wait(0);wait(0);20五、運行結(jié)果1消息隊列:2、共享存儲區(qū):21六、收獲及體會此次實驗讓我對消息隊列的獲取、傳送和共享存儲區(qū)有了更加深入的了解。理論上來說應(yīng)該是client和server交替出現(xiàn),實際上是client先發(fā)送了兩條,而且最后server接收了2條,但二者分別發(fā)
29、送和接收了10條信息,這個和設(shè)想是一樣的。通過實驗我了解到,message的傳送和控制并不保證完全同步,當一個程序不再激活狀態(tài)的時候,它完全可能繼續(xù)睡眠,造成上面現(xiàn)象,在多次send后才receive。共享存儲區(qū)的運行結(jié)構(gòu)和預想完全吻合,沒有疑問。七、參考資料實驗指導書22實驗六 一個進程啟動另一個程序的執(zhí)行一、實驗?zāi)康?編寫Linux環(huán)境下,fork()與exec()的結(jié)合使用實現(xiàn)一個進程啟動另一個程序的執(zhí)行的基本方法,掌握exec()的集中調(diào)用方法。二、實驗內(nèi)容父進程從終端讀取要執(zhí)行的命令,并交給子進程執(zhí)行。父進程等待子進程結(jié)束,并打印子進程的返回值。提示:從終端讀取要執(zhí)行的命令可用fgets()實現(xiàn)。三、實驗要求 按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度診所執(zhí)業(yè)醫(yī)師醫(yī)療質(zhì)量控制聘用合同
- 2025年度高端美容院股權(quán)合作框架協(xié)議
- 二零二五年度停車場租賃與停車場設(shè)施維護協(xié)議
- 2025年度酒店與慈善機構(gòu)住宿協(xié)議價合同
- 2025年度游泳館老年會員安全免責協(xié)議范本
- 二零二五年度汽車行業(yè)競業(yè)禁止協(xié)議
- 二零二五年度新能源汽車推廣保證金質(zhì)押擔保合同
- 2025年度跨境電商支付結(jié)算合作協(xié)議模板
- 二零二五年度眼鏡店店長入股合同
- 二零二五年度農(nóng)村土地承包經(jīng)營權(quán)流轉(zhuǎn)與農(nóng)業(yè)廢棄物資源化利用合作協(xié)議
- 血液透析護理質(zhì)控
- 人工智能訓練師理論知識考核要素細目表四級
- 《欣賞 中華人民共和國國歌(簡譜、五線譜)》課件
- 初三化學一輪復習計劃
- 關(guān)于進一步加強路基路面施工質(zhì)量的通知
- (正式版)YS∕T 5040-2024 有色金屬礦山工程項目可行性研究報告編制標準
- AQ/T 2080-2023 金屬非金屬地下礦山在用人員定位系統(tǒng)安全檢測檢驗規(guī)范(正式版)
- NB-T35020-2013水電水利工程液壓啟閉機設(shè)計規(guī)范
- JCT 841-2024《耐堿玻璃纖維網(wǎng)布》
- 醫(yī)學檢驗技術(shù)專業(yè)《跟崗實習》課程標準
- 2024年甘肅省天水市中考生物·地理試題卷(含答案)
評論
0/150
提交評論