版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《操作系統(tǒng)》實(shí)驗(yàn)報(bào)告目錄:一、實(shí)驗(yàn)一4 1.實(shí)驗(yàn)?zāi)康?2.實(shí)驗(yàn)內(nèi)容4 3.實(shí)驗(yàn)要求4 4.實(shí)驗(yàn)設(shè)計(jì)4 5.實(shí)驗(yàn)程序4 6.實(shí)驗(yàn)結(jié)果4 7.實(shí)驗(yàn)感想5二、實(shí)驗(yàn)二5 1.實(shí)驗(yàn)?zāi)康?2.實(shí)驗(yàn)內(nèi)容5 3.實(shí)驗(yàn)要求5 4.實(shí)驗(yàn)設(shè)計(jì)5 5.實(shí)驗(yàn)程序6 6.實(shí)驗(yàn)結(jié)果8 7.實(shí)驗(yàn)感想8三、實(shí)驗(yàn)三8 1.實(shí)驗(yàn)?zāi)康?2.實(shí)驗(yàn)內(nèi)容8 3.實(shí)驗(yàn)要求8 4.實(shí)驗(yàn)設(shè)計(jì)9 5.實(shí)驗(yàn)程序10 6.實(shí)驗(yàn)結(jié)果11 7.實(shí)驗(yàn)感想11四、實(shí)驗(yàn)四11 1.實(shí)驗(yàn)?zāi)康?12.實(shí)驗(yàn)內(nèi)容11 3.實(shí)驗(yàn)要求11 4.實(shí)驗(yàn)設(shè)計(jì)12 5.實(shí)驗(yàn)結(jié)果16 6.實(shí)驗(yàn)感想17五、實(shí)驗(yàn)五17 1.實(shí)驗(yàn)?zāi)康?72.實(shí)驗(yàn)內(nèi)容17 3.實(shí)驗(yàn)要求17 4.實(shí)驗(yàn)設(shè)計(jì)17 5.實(shí)驗(yàn)程序18 6.實(shí)驗(yàn)結(jié)果19 7.實(shí)驗(yàn)感想19六、實(shí)驗(yàn)六20 1.實(shí)驗(yàn)?zāi)康?02.實(shí)驗(yàn)內(nèi)容20 3.實(shí)驗(yàn)要求20 4.實(shí)驗(yàn)設(shè)計(jì)20 5.實(shí)驗(yàn)結(jié)果23 6.實(shí)驗(yàn)感想24七、實(shí)驗(yàn)七24 1.實(shí)驗(yàn)?zāi)康?42.實(shí)驗(yàn)內(nèi)容24 3.實(shí)驗(yàn)要求24 4.實(shí)驗(yàn)設(shè)計(jì)25 5.實(shí)驗(yàn)程序27 6.實(shí)驗(yàn)結(jié)果28 7.實(shí)驗(yàn)感想28 實(shí)驗(yàn)一UNIX/LINUX入門一、實(shí)驗(yàn)?zāi)康牧私釻NIX/LINUX運(yùn)行環(huán)境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下c語(yǔ)言程序的編寫、編譯、調(diào)試和運(yùn)行方法。二、實(shí)驗(yàn)內(nèi)容 熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。練習(xí)UNIX/LINUX的文本行編輯器vi的使用方法熟悉UNIX/LINUX下c語(yǔ)言編譯器cc/gcc的使用方法。用vi編寫一個(gè)簡(jiǎn)單的顯示“Hello,World!”c語(yǔ)言程序,用gcc編譯并觀察編譯后的結(jié)果,然后運(yùn)行它。三、實(shí)驗(yàn)要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實(shí)驗(yàn)報(bào)告。四、實(shí)驗(yàn)設(shè)計(jì)Linux系統(tǒng)常用命令格式:command[option][argument1][argument2]...五、實(shí)驗(yàn)程序#include<stdio.h>#include<stdlib.h>intmain(void){printf("HelloWorld!\n");system("pause");return0;}六、實(shí)驗(yàn)結(jié)果七、實(shí)驗(yàn)感想 通過(guò)第一次室驗(yàn),熟悉了LINUX系統(tǒng)的操作,終端的使用,GCC編譯c程序 實(shí)驗(yàn)二進(jìn)程管理一、實(shí)驗(yàn)?zāi)康募由顚?duì)進(jìn)程概念的理解,明確進(jìn)程與程序的區(qū)別;進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì)。二、實(shí)驗(yàn)內(nèi)容(1)進(jìn)程創(chuàng)建編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符:父進(jìn)程顯示“a“;子進(jìn)程分別顯示字符”b“和字符“c”。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。(2)進(jìn)程控制修改已編寫的程序,將每一個(gè)進(jìn)程輸出一個(gè)字符改為每一個(gè)進(jìn)程輸出一句話,再觀察程序執(zhí)行時(shí)屏幕上出現(xiàn)的現(xiàn)象,并分析原因。(3)進(jìn)程的管道通信編寫程序?qū)崿F(xiàn)進(jìn)程的管道通信。使用系統(tǒng)調(diào)用pipe()建立一個(gè)管道,二個(gè)子進(jìn)程P1和P2分別向管道各寫一句話:Child1issendingamessage!Child2issendingamessage!父進(jìn)程從管道中讀出二個(gè)來(lái)自子進(jìn)程的信息并顯示(要求先接收P1,再接收P2)。三、實(shí)驗(yàn)要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實(shí)驗(yàn)報(bào)告。四、實(shí)驗(yàn)設(shè)計(jì)1、功能設(shè)計(jì)實(shí)驗(yàn)要求建立一個(gè)管道實(shí)現(xiàn)父進(jìn)程和子進(jìn)程間的通信,子進(jìn)程有兩個(gè),子進(jìn)程向管道里寫數(shù)據(jù),父進(jìn)程從管道里讀出數(shù)據(jù)。管道的作用是將兩個(gè)緩沖區(qū)相關(guān)連起來(lái),使得一個(gè)緩沖區(qū)寫的東西可以從另一個(gè)緩沖區(qū)讀出來(lái),遵循先進(jìn)先出的順序。程序的順序是這樣的:先創(chuàng)建子進(jìn)程1,向管道寫入一句話,子進(jìn)程1結(jié)束后創(chuàng)建子進(jìn)程2,向管道寫入一句話,最后父進(jìn)程從管道中讀出。2、數(shù)據(jù)結(jié)構(gòu)子進(jìn)程:使用pid_tfork()函數(shù)創(chuàng)建,返回值為子進(jìn)程號(hào)。管道:使用intpipe(intfiledis[2])創(chuàng)建無(wú)名管道,filedis[2]為兩個(gè)文件描述符。子進(jìn)程1子進(jìn)程1開始開始開始定義子進(jìn)程號(hào)和文字描述符定義子進(jìn)程號(hào)和文字描述符向管道中寫入數(shù)據(jù)子進(jìn)程1子進(jìn)程1結(jié)束創(chuàng)建子進(jìn)程1向管道中寫入數(shù)據(jù)子進(jìn)程2開始子進(jìn)程向管道中寫入數(shù)據(jù)子進(jìn)程2開始子進(jìn)程2結(jié)束創(chuàng)建子進(jìn)程創(chuàng)建子進(jìn)程2父進(jìn)程接收管道中數(shù)據(jù)父進(jìn)程接收管道中數(shù)據(jù)結(jié)束結(jié)束五、實(shí)驗(yàn)程序#include<stdio.h>#include<string.h>#include<unistd.h>intpipe(intfiledis[2]);#defineINPUT0#defineOUTPUT1intmain(){intfile_descriptors[2];pid_tpid1,pid2; //定義子進(jìn)程charbuf[256]; intreturned_count;pipe(file_descriptors);//創(chuàng)建無(wú)名管道if((pid1=fork())==-1)//創(chuàng)建子進(jìn)程1{printf("Erroronfork\n");exit(1);}if(pid1==0) {printf("inthespawned(child1)process\n");close(file_descriptors[INPUT]);//關(guān)閉通道的讀端write(file_descriptors[OUTPUT],"child1issendingmessage",strlen("child1issendingmessage"));//向管道中寫一句話exit(0);}else{if((pid2=fork())==-1)//創(chuàng)建子進(jìn)程2{printf("Erroronfork\n");exit(1);}if(pid2==0){printf("inthespawned(child2)process\n");close(file_descriptors[INPUT]);//關(guān)閉通道的讀端write(file_descriptors[OUTPUT],"child2issendingmessage",strlen("child1issendingmessage"));//向管道中寫一句話exit(0);}else{ //父進(jìn)程printf("intheparentprocess\n");close(file_descriptors[OUTPUT]);//關(guān)閉管道的寫端returned_count=read(file_descriptors[INPUT],buf,sizeof(buf));printf("%dbytesofdatareceivedfromspawnedprocess:%s\n",returned_count,buf);//父進(jìn)程從管道中讀出數(shù)據(jù)}}return0;}六、實(shí)驗(yàn)結(jié)果 由圖可知,父進(jìn)程先后接受了子進(jìn)程向管道寫入的兩句話,并成功地打印出來(lái)。兩個(gè)子進(jìn)程分別向管道寫入了25個(gè)字符,并且是子進(jìn)程1先寫的,子進(jìn)程2后寫的,故輸出的順序也是如此。七、實(shí)驗(yàn)感想通過(guò)本次實(shí)驗(yàn),我們對(duì)進(jìn)程的概念加深了理解,熟悉了進(jìn)程的創(chuàng)建方法與作用機(jī)制,明確了進(jìn)程與程序的異同。同時(shí),我們掌握了使用管道通信的機(jī)制,進(jìn)一步認(rèn)識(shí)了并發(fā)執(zhí)行的實(shí)質(zhì)。 實(shí)驗(yàn)三一個(gè)進(jìn)程啟動(dòng)另一個(gè)程序的執(zhí)行一、實(shí)驗(yàn)?zāi)康木帉慙inux環(huán)境下,fork()與exec()的結(jié)合使用實(shí)現(xiàn)一個(gè)進(jìn)程啟動(dòng)另一個(gè)程序的執(zhí)行的基本方法,掌握exec()的幾種調(diào)用方法。二、實(shí)驗(yàn)內(nèi)容父進(jìn)程從終端讀取要執(zhí)行的命令,并交給子進(jìn)程執(zhí)行。父進(jìn)程等待子進(jìn)程結(jié)束,并打印子進(jìn)程的返回值。提示:從終端讀取要執(zhí)行的命令可用fgets()實(shí)現(xiàn)。三、實(shí)驗(yàn)要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實(shí)驗(yàn)報(bào)告。四、實(shí)驗(yàn)設(shè)計(jì)1、功能設(shè)計(jì)根據(jù)實(shí)驗(yàn)要求,父進(jìn)程和子進(jìn)程將被分配不同的任務(wù):父進(jìn)程從終端讀取要執(zhí)行的命令交給子進(jìn)程,然后等待子進(jìn)程技術(shù)打印子進(jìn)程的返回值;子進(jìn)程執(zhí)行父進(jìn)程讀取的命令并返回給父進(jìn)程。因?yàn)樽舆M(jìn)程執(zhí)行命令需要打開其他文件,所以需要使用exec()類的函數(shù)實(shí)現(xiàn)在一個(gè)進(jìn)程來(lái)啟動(dòng)另一個(gè)程序,在這里應(yīng)使用execlp()函數(shù)從PATH環(huán)境變量中查找文件并執(zhí)行。對(duì)于父進(jìn)程,可以調(diào)用fget()從終端讀取要執(zhí)行的命令,以字符串形式存儲(chǔ)然后交給子進(jìn)程執(zhí)行,待子進(jìn)程執(zhí)行完畢后接收子進(jìn)程返回值并打印。由于要求帶參數(shù)的命令也可以執(zhí)行,那么需要在父進(jìn)程中fets兩次,第一次gets得到命令給串command,然后gets參數(shù)給串command1,并且將這兩個(gè)參數(shù)分別傳到子進(jìn)程的exec()函數(shù),其中前兩個(gè)都是command,第三個(gè)是command1。2、數(shù)據(jù)結(jié)構(gòu)用char*型全局變量command存放指令用char*型全局變量command1存放參數(shù)3、程序框圖子進(jìn)程開始創(chuàng)建子進(jìn)程讀入?yún)?shù)讀入命令開始子進(jìn)程開始創(chuàng)建子進(jìn)程讀入?yún)?shù)讀入命令開始執(zhí)行父進(jìn)程接收的命令執(zhí)行父進(jìn)程接收的命令子進(jìn)程子進(jìn)程結(jié)束等待子進(jìn)程結(jié)束等待子進(jìn)程結(jié)束滿足結(jié)束條件?滿足結(jié)束條件?NY結(jié)束結(jié)束五、實(shí)驗(yàn)程序#include<stdio.h>charcommand[256];charcommand1[256];intmain(){intrtn; //子進(jìn)程的返回?cái)?shù)值interrorno;while(1){printf(">"); //從終端讀取要執(zhí)行的命令fgets(command,256,stdin);printf("<"); //從終端讀取要執(zhí)行命令的參數(shù)fgets(command1,256,stdin);command[strlen(command)-1]='\0';command1[strlen(command1)-1]='\0';if(fork()==0){ //子進(jìn)程執(zhí)行此命令errorno=(command1[0]==0)?execlp(command,command,NULL,NULL),execlp(command,command,command1,NULL);//如果沒(méi)有參數(shù)則前者的execlp()函數(shù),如果有參數(shù)則執(zhí)行后者,有無(wú)參數(shù)只需看command1[0]是否為0perror(command);//如果exec函數(shù)返回,表明沒(méi)有正常執(zhí)行命令,打印錯(cuò)誤信息exit(errorno);}else{//父進(jìn)程,等待子進(jìn)程結(jié)束,并打印子進(jìn)程的返回值wait(&rtn);printf("childprocessreturn%d\n",rtn);}}return0;}六、實(shí)驗(yàn)結(jié)果 由圖可知,執(zhí)行了ls命令,參數(shù)為-a,文件按字母順序顯示六、實(shí)驗(yàn)感想通過(guò)本次實(shí)驗(yàn),我學(xué)會(huì)了如何用execlp()函數(shù)達(dá)到一個(gè)進(jìn)程啟動(dòng)另外一個(gè)程序的目的。并且對(duì)execlp()的幾個(gè)參數(shù)的作用有了一定了解,別且對(duì)于fork()和exelp()聯(lián)合使用的方法和功能。同時(shí),我們進(jìn)一步熟悉了LINUX系統(tǒng)操作環(huán)境,學(xué)習(xí)了在LINUX環(huán)境下編譯和調(diào)試程序的技巧。 實(shí)驗(yàn)四基于消息隊(duì)列和共享內(nèi)存的進(jìn)程間通信一、實(shí)驗(yàn)?zāi)康腖inux系統(tǒng)的進(jìn)程通信機(jī)構(gòu)(IPC)允許在任意進(jìn)程間大批量地交換數(shù)據(jù)。本實(shí)驗(yàn)的目的是了解和熟悉:1.Linux支持的消息通信機(jī)制及其使用方法2.Linux系統(tǒng)的共享存儲(chǔ)區(qū)的原理及使用方法。二、實(shí)驗(yàn)內(nèi)容1.消息的創(chuàng)建、發(fā)送和接收使用消息調(diào)用msgget()、msgsnd()、msggrev()、msgctrl()編制長(zhǎng)度為1K的消息的發(fā)送和接收程序。2.共享存儲(chǔ)取得創(chuàng)建、附接和斷接使用系統(tǒng)調(diào)用shmget()、shmat()、shmctl()、shmctl(),編制一個(gè)與上述功能相同的程序。三、實(shí)驗(yàn)要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實(shí)驗(yàn)報(bào)告。四、實(shí)驗(yàn)設(shè)計(jì)1、消息的創(chuàng)建、發(fā)送和接收(1)功能設(shè)計(jì)為了實(shí)現(xiàn)進(jìn)程之間消息的創(chuàng)建、發(fā)送和接收,首先應(yīng)定義兩個(gè)子進(jìn)程,Server進(jìn)程負(fù)責(zé)發(fā)送,Client進(jìn)程負(fù)責(zé)接收,父進(jìn)程負(fù)責(zé)創(chuàng)建。其次需要用到msgget()、msgsnd()、msggrev()、msgctrl()等函數(shù)進(jìn)行對(duì)消息的控制。題目要求消息長(zhǎng)度為1K,那么msgsnd(id,msgp,size,flag)和msgrcv(id,msgp,size,type,flag)函數(shù)中參數(shù)size應(yīng)設(shè)為1024,msgget(key,flag)中的key應(yīng)為75。父進(jìn)程獲得創(chuàng)建消息后,子進(jìn)程Server先后發(fā)送編號(hào)為1~10的10條消息,子進(jìn)程Client先后接收這11條消息,方能達(dá)到實(shí)驗(yàn)?zāi)康?。?)數(shù)據(jù)結(jié)構(gòu)消息(mymsg):結(jié)構(gòu)體實(shí)現(xiàn),包含的成員變量有消息類型和消息內(nèi)容,具體實(shí)現(xiàn)如下:structmymsg{ //消息的結(jié)構(gòu)體聲明longintmymsgtype; //消息類型inttext; //消息內(nèi)容};(3)程序框圖子進(jìn)程Server開始開始子進(jìn)程Server開始開始結(jié)束定義子進(jìn)程號(hào)定義子進(jìn)程號(hào)向消息隊(duì)列中發(fā)送向消息隊(duì)列中發(fā)送10條消息獲得一個(gè)消息的描述符獲得一個(gè)消息的描述符子進(jìn)程子進(jìn)程Server結(jié)束創(chuàng)建創(chuàng)建Server子進(jìn)程向消息隊(duì)列中發(fā)送10條消息子進(jìn)程向消息隊(duì)列中發(fā)送10條消息子進(jìn)程Client開始創(chuàng)建創(chuàng)建Client子進(jìn)程子進(jìn)程子進(jìn)程Client結(jié)束(4)程序#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/shm.h>#defineMAX1024structmymsg{ //消息結(jié)構(gòu)體longintmymsgtype; //消息類型inttext; //消息內(nèi)容}msg;main(void){pid_tpids;//發(fā)送進(jìn)程pid_tpidc;//接收進(jìn)程intmsgid;//消息隊(duì)列號(hào)inti=1;msgid=msgget(KEY,0666|IPC_CREAT);//獲得一個(gè)消息的描述符if((pids=fork())==0){ //創(chuàng)建Server子進(jìn)程while(i<11){msg.mymsgtype=11-i;msg.text=i;printf("thesendedmessageis%dth\n",i);i++;msgsnd(msgid,&msg,MAX,0);//向msgid指定的消息隊(duì)列發(fā)送消息,長(zhǎng)度為1K}exit(0);}else{ i=10;if((pidc=fork())==0){//創(chuàng)建Client子進(jìn)程while(i!=1){msgrcv(msgid,&msg,MAX,0,0);//從msgid指定的消息隊(duì)列接收消息printf("themessageis%dth\n",msg.text);i=msg.mymsgtype;}exit(0);}else{wait(0);//等待子進(jìn)程結(jié)束wait(0);exit(0);}}}2、共享存儲(chǔ)區(qū)的創(chuàng)建、附接和斷接(1)功能設(shè)計(jì)為了實(shí)現(xiàn)進(jìn)程通過(guò)共享存儲(chǔ)區(qū)進(jìn)行通信,需要?jiǎng)?chuàng)建兩個(gè)進(jìn)程并且調(diào)用shmget()、shmat()、shmctl()函數(shù)實(shí)現(xiàn)共享存儲(chǔ)區(qū)的創(chuàng)建、附接和斷接。由于共享存儲(chǔ)區(qū)的寫入和讀取由兩個(gè)子進(jìn)程完成,而共享存儲(chǔ)區(qū)在本程序中為所有進(jìn)程共用的,因此共享存儲(chǔ)區(qū)的創(chuàng)建、附接和斷接均需要在父進(jìn)程中完成。具體的實(shí)現(xiàn)方式是現(xiàn)在父進(jìn)程中創(chuàng)建一塊共享存儲(chǔ)區(qū),然后用int類型指針list指向該存儲(chǔ)區(qū)的地址;接著創(chuàng)建兩個(gè)子進(jìn)程,第一個(gè)子進(jìn)程通過(guò)list指針實(shí)現(xiàn)向共享存儲(chǔ)區(qū)寫入int類型的數(shù)據(jù),第二個(gè)子進(jìn)程通過(guò)list指針實(shí)現(xiàn)從共享存儲(chǔ)區(qū)讀出int類型的數(shù)據(jù)。由于兩個(gè)子進(jìn)程同時(shí)使用了list指針,所以需要控制兩個(gè)進(jìn)程互斥,在讀進(jìn)程序中添加了sleep(1)語(yǔ)句。(2)數(shù)據(jù)結(jié)構(gòu)通過(guò)shmid=shmget(key,size,flag)函數(shù)建立(獲得)共享存儲(chǔ)區(qū),返回該共享存儲(chǔ)區(qū)的描述符shmid。(3)程序框圖子進(jìn)程1開始子進(jìn)程1結(jié)束結(jié)束斷開共享存儲(chǔ)區(qū)等待子進(jìn)程結(jié)束創(chuàng)建子進(jìn)程1子進(jìn)程2建立共享存儲(chǔ)區(qū)并連接定義子進(jìn)程號(hào)開始子進(jìn)程1開始子進(jìn)程1結(jié)束結(jié)束斷開共享存儲(chǔ)區(qū)等待子進(jìn)程結(jié)束創(chuàng)建子進(jìn)程1子進(jìn)程2建立共享存儲(chǔ)區(qū)并連接定義子進(jìn)程號(hào)開始向向共享存儲(chǔ)區(qū)中讀出數(shù)據(jù)向共享存儲(chǔ)區(qū)中寫入數(shù)據(jù)子進(jìn)程2開始向共享存儲(chǔ)區(qū)中寫入數(shù)據(jù)子進(jìn)程2開始子進(jìn)程2結(jié)束(4)程序#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#defineMAX11#defineKEY75main(){inti,child1,child2,running=1;//定義子進(jìn)程號(hào)intid; //共享存儲(chǔ)區(qū)描述符int*list; id=shmget(KEY,sizeof(int)*MAX,IPC_CREAT|0666);//建立一塊共享存儲(chǔ)區(qū),返回該共享存儲(chǔ)區(qū)的描述符idlist=(int*)shmat(id,0,0);//將list指針指向共享存儲(chǔ)區(qū)if((child1=fork())==-1){printf("errorinforka\n");exit(1);}if(child1==0){//創(chuàng)建子進(jìn)程child1sleep(1);//暫停一段時(shí)間,等待第一個(gè)子進(jìn)程結(jié)束for(i=0;i<=10;i++) printf("yourmessageis:%d\n",list[i]);//從緩沖區(qū)里讀出數(shù)據(jù)exit(0);}else{if((child2=fork())==-1){printf("errorinforka\n");exit(1);}if(child2==0){//創(chuàng)建子進(jìn)程child2i=0;while(1){list[i]=i;//向緩沖區(qū)里寫入數(shù)據(jù)printf("themessagesentis:%d\n",list[i]);if(list[i]==10)break;i++;}exit(0);}else{wait(0);wait(0);shmdt(list);//將共享存儲(chǔ)區(qū)與進(jìn)城斷開shmctl(id,IPC_RMID,0);//將共享存儲(chǔ)區(qū)標(biāo)志為被銷毀的exit(0);}}}五、實(shí)驗(yàn)結(jié)果(1)消息的創(chuàng)建、發(fā)送和接收第一個(gè)子進(jìn)程一次發(fā)了10條消息,第二個(gè)子進(jìn)程一次接收了10條消息,消息隊(duì)列先進(jìn)先出(2)共享存儲(chǔ)區(qū)的創(chuàng)建、附接和斷接第一個(gè)子進(jìn)程向共享存儲(chǔ)區(qū)寫入了11個(gè)數(shù)據(jù),第二個(gè)子進(jìn)程從共享存儲(chǔ)區(qū)讀取,兩個(gè)進(jìn)程之間是互斥執(zhí)行的。六、實(shí)驗(yàn)感想 通過(guò)本次實(shí)驗(yàn),我學(xué)會(huì)了如何用消息隊(duì)列和共享內(nèi)存的方式實(shí)現(xiàn)進(jìn)程間的通信,掌握了Linux系統(tǒng)的消息通信機(jī)制和共享存儲(chǔ)區(qū)的原理,并在實(shí)踐過(guò)程中掌握了它們的使用方法。在編程和調(diào)試的過(guò)程中,我進(jìn)一步熟悉了LINUX環(huán)境下的編譯過(guò)程和調(diào)試方法。實(shí)驗(yàn)五利用信號(hào)實(shí)現(xiàn)進(jìn)程間通信一、實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)UNIX類操作系統(tǒng)信號(hào)機(jī)制,編寫Linux環(huán)境下利用信號(hào)實(shí)現(xiàn)進(jìn)程間通信的方法,掌握注冊(cè)信號(hào)處理程序及signal()調(diào)用方法。二、實(shí)驗(yàn)內(nèi)容編寫一個(gè)程序,完成下列功能:實(shí)現(xiàn)一個(gè)SIGINT信號(hào)的處理程序,注冊(cè)該信號(hào)處理程序,創(chuàng)建一個(gè)子進(jìn)程,父子進(jìn)程都進(jìn)入等待。SIGINT信號(hào)的處理程序完成的任務(wù)包括打印接受到的信號(hào)的編號(hào)和進(jìn)程PID。編譯并運(yùn)行該程序,然后在鍵盤上敲Ctrl+C,觀察出現(xiàn)的現(xiàn)象,并解釋。提示:參見(jiàn)“五、補(bǔ)充材料”中的signal()的基本用法。三、實(shí)驗(yàn)要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實(shí)驗(yàn)報(bào)告。四、實(shí)驗(yàn)設(shè)計(jì)1、功能設(shè)計(jì)本實(shí)驗(yàn)要求利用信號(hào)實(shí)現(xiàn)進(jìn)程間通信。為了實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康?,需要?shí)現(xiàn)一個(gè)SIGINT信號(hào)的處理函數(shù)func()并注冊(cè)該信號(hào)處理函數(shù)。信號(hào)處理函數(shù)需要完成的任務(wù)應(yīng)包括打印接受到的信號(hào)的編號(hào)和進(jìn)程的PID,所以func()函數(shù)應(yīng)能實(shí)現(xiàn)打印當(dāng)前進(jìn)程的pid以及根據(jù)接收到的信號(hào)的編號(hào)打印出該信號(hào)名稱的功能。父進(jìn)程和子進(jìn)程分別接收兩個(gè)不同的信號(hào),因此兩個(gè)進(jìn)程調(diào)用signal()函數(shù)時(shí)應(yīng)為不同的信號(hào)注冊(cè)信號(hào)處理函數(shù)。本次實(shí)驗(yàn)采用了SIGINT和SIGUSR1兩個(gè)信號(hào)。為了讓父子進(jìn)程都能夠接收到信號(hào),在注冊(cè)信號(hào)處理函數(shù)后應(yīng)讓兩個(gè)進(jìn)程進(jìn)入等待,并且為了方便驗(yàn)證試驗(yàn)結(jié)果,讓父進(jìn)程接收SIGINT信號(hào),子進(jìn)程接收SIGUSR1信號(hào)。2、數(shù)據(jù)結(jié)構(gòu)信號(hào)(SIGNAL):UNIX系統(tǒng)含有20種信號(hào)??梢允褂胹ignal()函數(shù)為每個(gè)信號(hào)注冊(cè)信號(hào)處理函數(shù)。3、程序框圖創(chuàng)建子進(jìn)程開始創(chuàng)建子進(jìn)程開始注冊(cè)SINUSR1信號(hào)子進(jìn)程開始子進(jìn)程結(jié)束注冊(cè)SINUSR1信號(hào)子進(jìn)程開始子進(jìn)程結(jié)束注冊(cè)注冊(cè)SININT信號(hào)父進(jìn)程進(jìn)入等待父進(jìn)程進(jìn)入等待結(jié)束結(jié)束五、實(shí)驗(yàn)程序#include<stdio.h>#include<signal.h>#include<unistd.h>voidfunc(inti);intpid;main(){if((pid=fork())==0) //創(chuàng)建子進(jìn)程{printf("sonpid:%d\n",pid);//打印子進(jìn)程號(hào)signal(SIGUSR1,func);//注冊(cè)SIGUSR1的信號(hào)處理程序for(;;) //子進(jìn)程進(jìn)入等待pause();}else{printf("fatherpid:%d\n",pid);//打印父進(jìn)程號(hào)signal(SIGINT,func); //注冊(cè)SIGINT的信號(hào)處理程序for(;;) //父進(jìn)程進(jìn)入等待pause();}}voidfunc(inti) //信號(hào)處理函數(shù){printf("pid:%d\n",pid);if(i==SIGUSR1)printf("receivedSIGUSR1\n");elseif(i==SIGUSR2)printf("receivedSIGUSR2\n");elseif(i==SIGINT){printf("receivedSIGINT%d\n",i);exit(1);}exit(0);}六、實(shí)驗(yàn)結(jié)果如圖所示,第一次執(zhí)行后按ctrl+c后,父進(jìn)程接收信號(hào),信號(hào)處理程序輸出父進(jìn)程號(hào)4094和信號(hào)名稱。第二次使用./5&后臺(tái)運(yùn)行此程序,使用kill–USR14096時(shí),子進(jìn)程接收信號(hào),信號(hào)處理程序輸出子進(jìn)程號(hào)0,并輸出信號(hào)名稱。七、實(shí)驗(yàn)心得通過(guò)本次實(shí)驗(yàn),我掌握了注冊(cè)信號(hào)處理程序及signal()調(diào)用方法,并且了解了如何讓程序在后臺(tái)運(yùn)行的方法。我也進(jìn)一步了解了LINUX系統(tǒng)中進(jìn)程同步與通信的原理。實(shí)驗(yàn)六線程的創(chuàng)建一、實(shí)驗(yàn)?zāi)康木帉慙inux環(huán)境下的多線程程序,了解多線程的程序設(shè)計(jì)方法,掌握最常用的三個(gè)函數(shù)pthread_create,pthread_join和pthread_exit的用法。二、實(shí)驗(yàn)內(nèi)容1、主程序創(chuàng)建兩個(gè)線程myThread1和myThread2,每個(gè)線程打印一句話。使用pthread_create(&id,NULL,(void*)thread,NULL)完成。提示:先定義每個(gè)線程的執(zhí)行體,然后在main中()創(chuàng)建幾個(gè)線程,最后主線程等待子線程結(jié)束后再退出。2、創(chuàng)建兩個(gè)線程,分別向線程傳遞如下兩種類型的參數(shù)傳遞整型值傳遞字符三、實(shí)驗(yàn)要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實(shí)驗(yàn)報(bào)告。四、實(shí)驗(yàn)設(shè)計(jì)1、創(chuàng)建兩個(gè)進(jìn)程每個(gè)進(jìn)程打印一句話(1)功能設(shè)計(jì)題目要求創(chuàng)建兩個(gè)線程,每個(gè)線程打印一句話,可以認(rèn)為兩個(gè)線程的功能是相同的,故只需要寫一個(gè)線程的運(yùn)行函數(shù)thread(),在這個(gè)函數(shù)里有一個(gè)printf輸出一句話即可。然后在main函數(shù)里分別創(chuàng)建兩個(gè)線程,然后等待兩個(gè)線程結(jié)束。(2)數(shù)據(jù)結(jié)構(gòu)線程:使用pthread_create()創(chuàng)建。每個(gè)線程有相應(yīng)的線程標(biāo)示符,也有各自的屬性。線程可以和線程運(yùn)行函數(shù)綁定,并可以在創(chuàng)建線程時(shí)確定該線程運(yùn)行函數(shù)的參數(shù)。(3)程序框圖定義線程標(biāo)識(shí)符開始定義線程標(biāo)識(shí)符開始創(chuàng)建線程創(chuàng)建線程2并與thread()函數(shù)綁定等待線程結(jié)束等待線程結(jié)束創(chuàng)建線程1創(chuàng)建線程1并與thread()函數(shù)綁定結(jié)束結(jié)束(4)程序#include<stdio.h>#include<pthread.h>voidthread(void) //線程運(yùn)行函數(shù){printf("Thisisapthread.\n"); //輸出一句話}intmain(void){pthread_tid1,id2; //定義兩個(gè)線程標(biāo)識(shí)符inti,ret; ret=pthread_create(&id1,NULL,(void*)thread,NULL);//創(chuàng)建線程標(biāo)識(shí)為id1if(ret!=0){ //線程創(chuàng)建失敗printf("Createpthreaderror!\n");exit(1);}ret=pthread_create(&id2,NULL,(void*)thread,NULL);//創(chuàng)建線程標(biāo)識(shí)為id2if(ret!=0){ //線程創(chuàng)建失敗printf("Createpthreaderror!\n");exit(1);}printf("Thisisthemainprocess.\n");pthread_join(id1,NULL); //等待第一個(gè)線程結(jié)束pthread_join(id2,NULL); //等待第二個(gè)線程結(jié)束return(0);}2、創(chuàng)建兩個(gè)進(jìn)程每個(gè)進(jìn)程打印一句話分別向線程傳遞如下兩種類型的參數(shù):整型值、字符(1)功能設(shè)計(jì)題目要求創(chuàng)建兩個(gè)線程,兩個(gè)線程分別傳遞int型和char型數(shù)據(jù)給線程運(yùn)行函數(shù)。所以要編寫兩個(gè)不同的線程運(yùn)行函數(shù)分別接收int型和char型的數(shù)據(jù)。相應(yīng)的pthread_create()函數(shù)中要給第四個(gè)參數(shù),作為形參傳進(jìn)線程運(yùn)行函數(shù)。(2)數(shù)據(jù)結(jié)構(gòu)線程:同1,使用pthread_create()創(chuàng)建。每個(gè)線程有相應(yīng)的線程標(biāo)示符,也有各自的屬性。線程可以和線程運(yùn)行函數(shù)綁定,并可以在創(chuàng)建線程時(shí)確定該線程運(yùn)行函數(shù)的參數(shù)。(3)程序框圖等待線程結(jié)束結(jié)束定義線程標(biāo)識(shí)符開始等待線程結(jié)束結(jié)束定義線程標(biāo)識(shí)符開始創(chuàng)建線程創(chuàng)建線程1并與threadchar(char*c)函數(shù)綁定創(chuàng)建線程創(chuàng)建線程2并與threadint(int*n)函數(shù)綁定(4)程序#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>voidthreadchar(char*c) //接收字符的線程運(yùn)行函數(shù){printf("receiveachar:%c\n",c);}voidthreadint(int*i) //接收整數(shù)的線程運(yùn)行函數(shù){printf("receiveaint:%d\n",i);}intmain(void){pthread_tid1,id2; //定義兩個(gè)線程標(biāo)識(shí)符intret;charc='t'; char*a=c; //定義char*指針變量傳參數(shù)用ret=pthread_create(&id1,NULL,(void*)threadchar,a); //創(chuàng)建線程1,第四個(gè)參數(shù)為char*型變量用來(lái)傳遞字符if(ret!=0){ //線程創(chuàng)建失敗printf("Createpthreaderror!\n");exit(1);}inti=99;int*b=i; //定義int*指針變量傳參數(shù)用ret=pthread_create(&id2,NULL,(void*)threadint,b); //創(chuàng)建線程2,第四個(gè)參數(shù)為int*型變量用來(lái)傳遞字符if(ret!=0){//線程創(chuàng)建失敗printf("Createpthreaderror!\n");exit(1);}printf("Thisisthemainprocess.\n");pthread_join(id1,NULL);//等待線程1結(jié)束pthread_join(id2,NULL); //等待線程2結(jié)束return(0);}五、實(shí)驗(yàn)結(jié)果由圖可知兩個(gè)線程主程序創(chuàng)建了兩個(gè)進(jìn)程這兩個(gè)進(jìn)程分別輸出了一句話主程序分別創(chuàng)建了兩個(gè)線程并向線程1傳遞了‘t’向線程2傳遞了99,線程運(yùn)行函數(shù)分別輸出告知接收了這兩個(gè)參數(shù)。六、實(shí)驗(yàn)感想通過(guò)本次實(shí)驗(yàn),我學(xué)會(huì)了如何使用LINUX下的線程創(chuàng)建函數(shù)pthread_create()來(lái)創(chuàng)建線程,并且向線程傳遞參數(shù)。同時(shí)更加熟練的使用LINUX。實(shí)驗(yàn)七利用信號(hào)量實(shí)現(xiàn)進(jìn)程的控制一、實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)UNIX類操作系統(tǒng)信號(hào)量機(jī)制,編寫Linux環(huán)境下利用信號(hào)量實(shí)現(xiàn)進(jìn)程控制的方法,掌握相關(guān)系統(tǒng)調(diào)用的使用方法。二、實(shí)驗(yàn)內(nèi)容創(chuàng)建4個(gè)線程,其中兩個(gè)線程負(fù)責(zé)從文件讀取數(shù)據(jù)到公共的緩沖區(qū),另兩個(gè)線程從緩沖區(qū)讀取數(shù)據(jù)作不同的處理(加和乘運(yùn)算)。使用信號(hào)量控制這些線程的執(zhí)行。提示:參見(jiàn)“五、補(bǔ)充材料”中的相關(guān)系統(tǒng)調(diào)用的基本用法。三、實(shí)驗(yàn)要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實(shí)驗(yàn)報(bào)告。四、實(shí)驗(yàn)設(shè)計(jì)1、功能設(shè)計(jì)題目要求創(chuàng)建4個(gè)線程,其中兩個(gè)負(fù)責(zé)從文件讀數(shù)據(jù)到緩沖區(qū),另兩個(gè)負(fù)責(zé)從緩沖區(qū)讀數(shù)據(jù)進(jìn)行加和乘的運(yùn)算。我對(duì)這4個(gè)線程進(jìn)行如下安排,線程1讀后線程2才可以讀,線程2讀了后線程3才可以進(jìn)行加的運(yùn)算,線程3加完了后線程4才能進(jìn)行乘的運(yùn)算,線程4乘完后線程1才能繼續(xù)讀。故需4個(gè)信號(hào)量sem1,sem2,sem3,sem4。線程1消費(fèi)sem1生產(chǎn)sem2,線程2消費(fèi)sem2生產(chǎn)sem3,線程3消費(fèi)sem3生產(chǎn)sem4,線程4消費(fèi)sem4生產(chǎn)sem1,形成一個(gè)循環(huán),直到文件結(jié)束為止。2、數(shù)據(jù)結(jié)構(gòu)信號(hào)量(semaphore):數(shù)據(jù)類型為結(jié)構(gòu)sem_t,本質(zhì)上是一個(gè)長(zhǎng)整型的數(shù)。一共4個(gè)公共緩沖區(qū)(stack):采用2維數(shù)組的方式實(shí)現(xiàn)(stack[NUM][2])。數(shù)組中的兩列分別存儲(chǔ)兩個(gè)文件中的數(shù)據(jù)。該2維數(shù)組還有一個(gè)索引:size,指向2維數(shù)組的頂部。讀線程每次從文件讀出兩個(gè)數(shù)放到stack[NUM][0]和stack[NUM][1]3、程序框圖線程A開始創(chuàng)建4個(gè)線程并分別與相應(yīng)函數(shù)綁定結(jié)束初始化信號(hào)量開始等待線程結(jié)束 線程A開始創(chuàng)建4個(gè)線程并分別與相應(yīng)函數(shù)綁定結(jié)束初始化信號(hào)量開始等待線程結(jié)束定義線程標(biāo)識(shí)符,緩沖區(qū)和信號(hào)量定義線程標(biāo)識(shí)符,緩沖區(qū)和信號(hào)量到文件尾?Y到文件尾?NNP(sem1)P(sem1)從文件讀出兩個(gè)數(shù)據(jù)到緩沖區(qū)從文件讀出兩個(gè)數(shù)據(jù)到緩沖區(qū)P(sem2)P(sem2)線程線程A結(jié)束線程B線程B開始到文件尾?Y到文件尾?NNP(sem2) P(sem2)從文件讀出兩個(gè)數(shù)據(jù)到緩沖區(qū)從文件讀出兩個(gè)數(shù)據(jù)到緩沖區(qū)P(sem3)P(sem3)線程B線程B結(jié)束線程線程D開始線程C線程C開始到文件尾?到文件尾?線程D結(jié)束線程D結(jié)束NN到文件尾?到文件尾?PP(sem4)NN線程C線程C結(jié)束從緩沖區(qū)取兩個(gè)數(shù)相乘PP(sem3)從緩沖區(qū)取兩個(gè)數(shù)相加從緩沖區(qū)取兩個(gè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 26711-2024微孔筆頭墨水筆
- 保證合同的變更與解除
- 合同轉(zhuǎn)讓標(biāo)準(zhǔn)協(xié)議書范本2024年
- 2024年股權(quán)代持協(xié)議書編寫要點(diǎn)
- 個(gè)人部分股權(quán)轉(zhuǎn)讓協(xié)議書2024年
- 2024年經(jīng)營(yíng)權(quán)轉(zhuǎn)讓合同范文
- 房屋買賣合同違約金糾紛的法律解決途徑
- 售樓部售房合同協(xié)議書
- 新股申購(gòu)流程與協(xié)議書
- 施工合同價(jià)款組成解析
- 霧化吸入療法的用藥指南2024課件
- 人音版六年級(jí)上冊(cè)全冊(cè)音樂(lè)教案(新教材)
- 2024-2030年中國(guó)青霉素行業(yè)深度調(diào)研及投資前景預(yù)測(cè)研究報(bào)告
- GB/T 42455.2-2024智慧城市建筑及居住區(qū)第2部分:智慧社區(qū)評(píng)價(jià)
- 地 理期中測(cè)試卷(一) 2024-2025學(xué)年地理湘教版七年級(jí)上冊(cè)
- 《公共管理學(xué)》第五章-政府作用課件
- 2024年山東濟(jì)南軌道交通集團(tuán)限公司招聘95人歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 2024年認(rèn)證行業(yè)法律法規(guī)及認(rèn)證基礎(chǔ)知識(shí)
- 2024年臨時(shí)用工管理制度(五篇)
- 《跆拳道》教學(xué)大綱
- 大學(xué)美育 課件 王樹青 第三篇 文藝之美
評(píng)論
0/150
提交評(píng)論