操作系統(tǒng)報告_第1頁
操作系統(tǒng)報告_第2頁
操作系統(tǒng)報告_第3頁
操作系統(tǒng)報告_第4頁
操作系統(tǒng)報告_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

優(yōu)質(zhì)資料優(yōu)質(zhì)資料操作系統(tǒng)實驗報告學(xué)號:完成時間:2012年11月22日目錄:TOC\o"1-5"\h\z實驗一:UNIX/LINUIX入門 1\o"CurrentDocument"實驗二:進(jìn)程管理 3\o"CurrentDocument"實驗三:線程的管理 10\o"CurrentDocument"實驗四:利用信號實現(xiàn)進(jìn)程間通信 15\o"CurrentDocument"實驗五:基于消息隊列和共享內(nèi)存的進(jìn)程間通信 18\o"CurrentDocument"實驗六:一個進(jìn)程啟動另一個程序的執(zhí)行 23實驗一UNIX/LINUIX入門一、實驗?zāi)康牧私釻NIX/LINUX運(yùn)行環(huán)境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下c語言程序的編寫、編譯、調(diào)試和運(yùn)行方法。二、實驗內(nèi)容1、熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。2、練習(xí)UNIX/LINUX的文本行編輯器歷的使用方法3、熟悉UNIX/LINUX下c語言編譯器cc/gcc的使用方法。用vi編寫一個簡單的顯示“Hello,World!”c語言程序,用?;幾g并觀察編譯后的結(jié)果,然后運(yùn)行它。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計代碼如下:#include<stdio.h>voidmain(){printf("helloworld");}五、運(yùn)行結(jié)果Iv型jbunE;一lv@ubuntgcc-q1Ivgubyntu:'SJlhellowcirLdlv@ubuntu:||1六、收獲及機(jī)會此次實驗讓我熟悉了1山口*下的文本行編輯器vi和c語言編譯器箕/。箕的使用方法。七、參考資料《實驗指導(dǎo)書》2實驗二進(jìn)程管理一、實驗?zāi)康募由顚M(jìn)程概念的理解,明確進(jìn)程與程序的區(qū)別;進(jìn)一步認(rèn)識并發(fā)執(zhí)行的實質(zhì)二、實驗內(nèi)容(1)進(jìn)程創(chuàng)建編寫一段程序,使用系統(tǒng)調(diào)用£0水()創(chuàng)建兩個子進(jìn)程。當(dāng)此程序運(yùn)行時,在系統(tǒng)中有一個父進(jìn)程和兩個子進(jìn)程活動。讓每一個進(jìn)程在屏幕上顯示一個字符:父進(jìn)程顯示匕“;子進(jìn)程分別顯示字符'力"和字符氣”。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。(2)進(jìn)程控制修改已編寫的程序,將每一個進(jìn)程輸出一個字符改為每一個進(jìn)程輸出一句話,再觀察程序執(zhí)行時屏幕上出現(xiàn)的現(xiàn)象,并分析原因。(3)進(jìn)程的管道通信編寫程序?qū)崿F(xiàn)進(jìn)程的管道通信。使用系統(tǒng)調(diào)用口》口?()建立一個管道,二個子進(jìn)程P1和P2分別向管道各寫一句話:Child1issendingamessage!Child2issendingamessage!父進(jìn)程從管道中讀出二個來自子進(jìn)程的信息并顯示(要求先接收P1,再接收P2)。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計(1)進(jìn)程創(chuàng)建使用£0水()創(chuàng)建兩個子進(jìn)程,父進(jìn)程等待兩個子進(jìn)程執(zhí)行完在運(yùn)行。(2)進(jìn)程控制使用拓水()創(chuàng)建兩個子進(jìn)程,父進(jìn)程等待兩個子進(jìn)程分別輸出一句話在運(yùn)行。(3)進(jìn)程的管道通信建立一個管道。在程序中先建立一個子進(jìn)程,然后向管道中輸入數(shù)據(jù),然后從子進(jìn)程中退出到父進(jìn)程,讀出管道數(shù)據(jù),然后再建立一個子進(jìn)程,寫入數(shù)據(jù),再讀出,即可。代碼如下:進(jìn)程創(chuàng)建:#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>#include<string.h>#include<errno.h>#defineINPUT0#defineOUTPUT13voidmain(){pid_tpid[2];//定義兩個子進(jìn)程pid[0]=fork(); //創(chuàng)建第一個子進(jìn)程if(pid[0]<0){ //判斷是否創(chuàng)建成功printf("ForkFailed");exit(-1);}elseif(pid[0]==0){printf("b\n");}else{pid[1]=fork();//創(chuàng)建另一子進(jìn)程if(pid[1]<0){printf("ForkFailed");exit(-1);}elseif(pid[1]==0){printf("c\n");}else{wait(NULL);printf("a\n");//父進(jìn)程執(zhí)行exit(0);}}}進(jìn)程控制:#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>#include<string.h>#include<errno.h>4#defineINPUT0#defineOUTPUT1voidmain(){pid_tpid[2];pid[0]=fork();if(pid[0]<0){printf("ForkFailed");exit(-1);}elseif(pid[0]==0){printf("thisisb\n");}

else{pid[1]=fork();if(pid[1]<0){printf("ForkFailed");exit(-1);}elseif(pid[1]==0){printf("thisisc\n");}else{wait(NULL);printf("thisisa\n");exit(0);}}}進(jìn)程的管道通信5#include<stdio.h>#include<unistd.h>#include<signal.h>#include<stdlib.h>#include<sys/types.h>voidmain(){intrw[2];/*定義子進(jìn)程號*/pid_tpid[2];intcount,count2;/*創(chuàng)建無名管道*/字符串msgl字符串msgl字符串msg2char*msg1="child1processissendingmessage!\n";char*msg2="child2processissendingmessage!\n";charbuf[50],s[50];intresult;result=pipe(rw);if(result==-1){printf("failedincallingpipe");}/*創(chuàng)建子進(jìn)程*/if((pid[0]=fork())==-1){printf("Errorinfork\n");exit(1);}if(pid[0]==0){//printf("child1processissendingmessage!\n");/*子進(jìn)程向父進(jìn)程寫數(shù)據(jù),關(guān)閉管道的讀端*/close(rw[0]);write(rw[1],msg1,1+strlen(msg1));close(rw[1]);exit(0);}else{if((pid[1]=fork())==-1){printf("Errorinfork\n");exit(1);}if(pid[1]==0){//printf("child2processissendingmessage!\n");/*子進(jìn)程向父進(jìn)程寫數(shù)據(jù),關(guān)閉管道的讀端*/6close(rw[0]);write(rw[1],msg2,1+strlen(msg2));close(rw[1]);exit(0);}else{/*執(zhí)行父進(jìn)程*////printf("inthespawning(parent)process...\n");/*父進(jìn)程從管道讀取子進(jìn)程寫的數(shù)據(jù),關(guān)閉管道的寫端*/close(rw[1]);count=read(rw[0],buf,sizeof(buf));count2=read(rw[0],s,sizeof(s));close(rw[0]);printf("%d%s\n",count,buf);printf("%d%s\n",count2,s);優(yōu)質(zhì)資料優(yōu)質(zhì)資料}}}}優(yōu)質(zhì)資料優(yōu)質(zhì)資料五、運(yùn)行結(jié)果(1)進(jìn)程創(chuàng)建&l^ubuntu:"lvgubuntzut~Sgcc2.1.u-o2,1lvgubuntu:-SJN+lbcalv"@ubuntu:TI(2)進(jìn)程控制亭。eIvi^ubuntu;mlv@ubuntu:gcc2.之lv@ubuntu:-$./z.2thisisbthisiscthisisaIv^ubuntu:'$|(3)進(jìn)程的管道通信G。個Iv^ubuntu:Iv^ubuntu:gcc2-3Hc-o2.3z.3.e:在函數(shù)'前mtn’中:2.3jC:29:23i售告r隱式聲明與內(nèi)建函數(shù)飛什1加,不兼容[默認(rèn)啟用]23匕””:矍告:降式聲晅與內(nèi)建函藪FtrleV不兼容[默認(rèn)啟用]lv@ubun3;T./2337Chtld1pr6C?4ts4包hdlrig仇占白總!57child2processIssendingmessage]大Ivgubuhtu:7$|六、收獲及機(jī)會此次實驗讓我對進(jìn)程和管道有了進(jìn)一步的理解,用fork()創(chuàng)建完子進(jìn)程后,要用exit()返回父進(jìn)程,當(dāng)需要創(chuàng)建兩個子進(jìn)程的時候,不能直接在第一個子進(jìn)程中直接拓比(),要返回到父進(jìn)程再用£0比()再次創(chuàng)建子進(jìn)程,否則將無法控制。創(chuàng)建完管道后,在向管道中寫入數(shù)據(jù)和從管道中讀出數(shù)據(jù)的時候,要控制好管道的讀寫控制,不適當(dāng)?shù)年P(guān)閉和開啟管道端口,將不能使得數(shù)據(jù)得到正確的讀寫。這些是我此次實驗最大的收獲,還需要在今后的時候發(fā)現(xiàn)更多的問題,有更深的理解。七、參考資料《實驗指導(dǎo)書》9實驗三線程的管理一、實驗?zāi)康木帉慙inux環(huán)境下的多線程程序,了解多線程的程序設(shè)計方法,掌握最常用的三個函數(shù)pthread_create,pthread_join和pthread_exit的用法二、實驗內(nèi)容1、主程序創(chuàng)建兩個線程myThreadl和myThread2,每個線程打印一句話。使用pthread_create(&id,NULL,(void*)thread,NULL)完成。提示:先定義每個線程的執(zhí)行體,然后在團(tuán)2訪中()創(chuàng)建幾個線程,最后主線程等待子線程結(jié)束后再退出。2、創(chuàng)建兩個線程,分別向線程傳遞如下兩種類型的參數(shù),傳遞整型值?傳遞字符三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計先定義2個線程的帶有參數(shù)的函數(shù),參數(shù)分別為整型(質(zhì))和字符型(附才),每個函數(shù)中打印出相對應(yīng)線程的話。在main函數(shù)中,利用pthread_create函數(shù)創(chuàng)建該兩個線程,在函數(shù)參數(shù)中的第四位,寫人想要傳進(jìn)各進(jìn)程的參數(shù)。最有利用pthread_join等待第二個結(jié)束后退出。代碼如下:1、主程序創(chuàng)建兩個線程myThread1和myThread2,每個線程打印一句話。#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>voidmyThread1(void) //線程1{printf("thisisphread1!\n");}voidmyThread2(void)//線程2{printf("thisisphread2!\n");}intmain(void)10pthread_tid[2];intret;ret=pthread_create(&id[0],NULL,(void*)myThread1,NULL);if(ret!=0){printf("Createpthreaderror!\n");exit(1);}ret=pthread_create(&id[1],NULL,(void*)myThread2,NULL);if(ret!=0){printf("Createpthreaderror!\n");exit(1);}pthread_join(id[0],NULL);pthread_join(id[1],NULL);printf("Thisisthemainprocess.\n");return(0);}2、創(chuàng)建兩個線程,分別向線程傳遞如下兩種類型的參數(shù)#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>voidmyThread1(void*a){int*num;num=(int*)a;printf("createintegeris%d\n",*num);}11voidmyThread2(void*b)13優(yōu)質(zhì)資料13優(yōu)質(zhì)資料12優(yōu)質(zhì)資料12優(yōu)質(zhì)資料{char*x;x=(char*)b;printf("createcharis%c\n",*x);}intmain(void){pthread_tid[2];intret;charc='L';char*a=&c;inttest=23;int*attr=&test;ret=pthread_create(&id[0],NULL,(void*)myThread1,(void*)attr);if(ret!=0){printf("Createpthreaderror!\n");exit(1);}pthread_join(id[0],NULL);ret=pthread_create(&id[1],NULL,(void*)myThread2,(void*)a);if(ret!=0){printf("Createpthreaderror!\n");exit(1);}pthread_join(id[1],NULL);printf("Thisisthemainprocess.\n");return(0);}五、運(yùn)行結(jié)果1、主程序創(chuàng)建兩個線程myThreadl和myThread2,每個線程打印一句話。lv<ffiubuntu:mLv^ubuntu:gm3*1.匚-Lpthread-o3.1lv^uibiintu:-$./3.1thisphreadllthis-tsphreadzjThtsistheginprocess,Lv^ubuntu: |2、創(chuàng)建兩個線程,分別向線程傳遞如下兩種類型的參數(shù)優(yōu)質(zhì)資料優(yōu)質(zhì)資料◎?clv(O)ijbuntu:?Lv^ubuntu:gcc3.2.c-Ipthread-o3..2lv@ubuntu:-$./3.2createintegeris23bemtecharisLThisthen^Anp「o$w下5rLv0uibuntu:-$|六、收獲及體會此次實驗讓我對線程的創(chuàng)建有了進(jìn)一步的理解,在熟練掌握pthread_create和pthread_join兩個函數(shù)的應(yīng)用上,進(jìn)一步明白了如何向進(jìn)程中傳入?yún)?shù)。七、參考資料《實驗指導(dǎo)書》14實驗四利用信號實現(xiàn)進(jìn)程間通信一、實驗?zāi)康膶W(xué)習(xí)UNIX類操作系統(tǒng)信號機(jī)制,編寫Linux環(huán)境下利用信號實現(xiàn)進(jìn)程間通信的方法,掌握注冊信號處理程序及$???诙?調(diào)用方法。二、實驗內(nèi)容編寫一個程序,完成下列功能:實現(xiàn)一個52州丁信號的處理程序,注冊該信號處理程序,創(chuàng)建一個子進(jìn)程,父子進(jìn)程都進(jìn)入等待。52州丁信號的處理程序完成的任務(wù)包括打印接受到的信號的編號和進(jìn)程PID。編譯并運(yùn)行該程序,然后在鍵盤上敲比r1+C,觀察出現(xiàn)的現(xiàn)象,并解釋。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計創(chuàng)建一個進(jìn)程,在父子進(jìn)程中都注冊一個用戶敲中斷鍵即Ctrl+C的信號處理程序,在子進(jìn)程中注冊一個用戶定義信號1,在父進(jìn)程中注冊一個用戶定義信號2,然后外部接收信號,最后在main函數(shù)中打印出信號的編號和進(jìn)程PID。在運(yùn)行時,當(dāng)用戶鍵入Ctrl+C時,會自動打印出父子進(jìn)程pid值,但信號的編號始終是父進(jìn)程中注冊的用戶定義信號。代碼如下:#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<semaphore.h>#defineMAXSTACK20intstack[MAXSTACK];inta=0;intb=0;sem_tsem,sem1;voidReadData1(void){FILE*fp=fopen("1.dat","r");sem_wait(&sem1);inti;for(i=0;i<10;i++)fscanf(fp,"%d",&stack[a++]);sem_post(&sem1);sem_post(&sem);fclose(fp);}voidReadData2(void){15FILE*fp=fopen("2.dat","r");sem_wait(&sem1);inti;for(i=0;i<8;i++)fscanf(fp,"%d",&stack[a++]);sem_post(&sem1);sem_post(&sem);fclose(fp);}voidHandleData1(void){inti;sem_wait(&sem);for(i=0;i<4;i++){intm=stack[b++];intn=stack[b++];printf("Plus:%d+%d=%d\n",m,n,m+n);}}voidHandleData2(void){inti;sem_wait(&sem);for(i=0;i<4;i++){intm=stack[b++];intn=stack[b++];printf("mul:%d*%d=%d\n",m,n,m*n);}}intmain(void){pthread_tt1,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);pthread_join(t1,NULL);#優(yōu)質(zhì)資料優(yōu)質(zhì)資料實驗六一個進(jìn)程啟動另一個程序的執(zhí)行一、實驗?zāi)康木帉慙inux環(huán)境下,£0很()與0*?以)的結(jié)合使用實現(xiàn)一個進(jìn)程啟動另一個程序的執(zhí)行的基本方法,掌握6*6以)的集中調(diào)用方法。二、實驗內(nèi)容父進(jìn)程從終端讀取要執(zhí)行的命令,并交給子進(jìn)程執(zhí)行。父進(jìn)程等待子進(jìn)程結(jié)束,并打印子進(jìn)程的返回值。提示:從終端讀取要執(zhí)行的命令可用£。磯$()實現(xiàn)。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計定義一個字符數(shù)組來放置命令字符,并用£。磯$()來實現(xiàn)讀取用戶輸入的命令字符并存入字符優(yōu)質(zhì)資料優(yōu)質(zhì)資料數(shù)組。用》£來判斷當(dāng)用戶輸入因陋產(chǎn)時,退出當(dāng)時程序。子程序中調(diào)用6*6&口(),執(zhí)行成功的話不返回,失敗的話返回個-1,并將失敗原因打印出來。在父進(jìn)程中wait等到子進(jìn)程執(zhí)行完,然后打印出子進(jìn)程的返回值。代碼如下:#include<stdio.h>#include<string.h>#include<unistd.h>#include<stdlib.h>#include<errno.h>#include<sys/types.h>#include<sys/wait.h>charmand[256];intmain(){intrtn;interrorno;while(1){printf(">");fgets(mand,256,stdin);/*從終端讀取命令*/mand[strlen(mand)-1]=0;if(!strcmp(mand,"quit")){break;}/*當(dāng)輸出quit時退出程序*/if(fork()==0){/*子進(jìn)程執(zhí)行此命令*/errorno=execlp(mand,mand,NULL,NULL)

溫馨提示

  • 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

提交評論