版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
《操作系統(tǒng)》實驗報告目錄:一、實驗一4 1.實驗?zāi)康?2.實驗內(nèi)容4 3.實驗要求4 4.實驗設(shè)計4 5.實驗程序4 6.實驗結(jié)果4 7.實驗感想5二、實驗二5 1.實驗?zāi)康?2.實驗內(nèi)容5 3.實驗要求5 4.實驗設(shè)計5 5.實驗程序6 6.實驗結(jié)果8 7.實驗感想8三、實驗三8 1.實驗?zāi)康?2.實驗內(nèi)容8 3.實驗要求8 4.實驗設(shè)計9 5.實驗程序10 6.實驗結(jié)果11 7.實驗感想11四、實驗四11 1.實驗?zāi)康?12.實驗內(nèi)容11 3.實驗要求11 4.實驗設(shè)計12 5.實驗結(jié)果16 6.實驗感想17五、實驗五17 1.實驗?zāi)康?72.實驗內(nèi)容17 3.實驗要求17 4.實驗設(shè)計17 5.實驗程序18 6.實驗結(jié)果19 7.實驗感想19六、實驗六20 1.實驗?zāi)康?02.實驗內(nèi)容20 3.實驗要求20 4.實驗設(shè)計20 5.實驗結(jié)果23 6.實驗感想24七、實驗七24 1.實驗?zāi)康?42.實驗內(nèi)容24 3.實驗要求24 4.實驗設(shè)計25 5.實驗程序27 6.實驗結(jié)果28 7.實驗感想28 實驗一UNIX/LINUX入門一、實驗?zāi)康牧私釻NIX/LINUX運行環(huán)境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下c語言程序的編寫、編譯、調(diào)試和運行方法。二、實驗內(nèi)容 熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。練習(xí)UNIX/LINUX的文本行編輯器vi的使用方法熟悉UNIX/LINUX下c語言編譯器cc/gcc的使用方法。用vi編寫一個簡單的顯示“Hello,World!”c語言程序,用gcc編譯并觀察編譯后的結(jié)果,然后運行它。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計Linux系統(tǒng)常用命令格式:command[option][argument1][argument2]...五、實驗程序#include<stdio.h>#include<stdlib.h>intmain(void){printf("HelloWorld!\n");system("pause");return0;}六、實驗結(jié)果七、實驗感想 通過第一次室驗,熟悉了LINUX系統(tǒng)的操作,終端的使用,GCC編譯c程序 實驗二進(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)用fork()創(chuàng)建兩個子進(jìn)程。當(dāng)此程序運行時,在系統(tǒng)中有一個父進(jìn)程和兩個子進(jìn)程活動。讓每一個進(jìn)程在屏幕上顯示一個字符:父進(jìn)程顯示“a“;子進(jìn)程分別顯示字符”b“和字符“c”。試觀察記錄屏幕上的顯示結(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)用pipe()建立一個管道,二個子進(jìn)程P1和P2分別向管道各寫一句話:Child1issendingamessage!Child2issendingamessage!父進(jìn)程從管道中讀出二個來自子進(jìn)程的信息并顯示(要求先接收P1,再接收P2)。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計1、功能設(shè)計實驗要求建立一個管道實現(xiàn)父進(jìn)程和子進(jìn)程間的通信,子進(jìn)程有兩個,子進(jìn)程向管道里寫數(shù)據(jù),父進(jìn)程從管道里讀出數(shù)據(jù)。管道的作用是將兩個緩沖區(qū)相關(guān)連起來,使得一個緩沖區(qū)寫的東西可以從另一個緩沖區(qū)讀出來,遵循先進(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)程號。管道:使用intpipe(intfiledis[2])創(chuàng)建無名管道,filedis[2]為兩個文件描述符。子進(jìn)程1子進(jìn)程1開始開始開始定義子進(jìn)程號和文字描述符定義子進(jìn)程號和文字描述符向管道中寫入數(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é)束五、實驗程序#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)建無名管道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;}六、實驗結(jié)果 由圖可知,父進(jìn)程先后接受了子進(jìn)程向管道寫入的兩句話,并成功地打印出來。兩個子進(jìn)程分別向管道寫入了25個字符,并且是子進(jìn)程1先寫的,子進(jìn)程2后寫的,故輸出的順序也是如此。七、實驗感想通過本次實驗,我們對進(jìn)程的概念加深了理解,熟悉了進(jìn)程的創(chuàng)建方法與作用機制,明確了進(jìn)程與程序的異同。同時,我們掌握了使用管道通信的機制,進(jìn)一步認(rèn)識了并發(fā)執(zhí)行的實質(zhì)。 實驗三一個進(jìn)程啟動另一個程序的執(zhí)行一、實驗?zāi)康木帉慙inux環(huán)境下,fork()與exec()的結(jié)合使用實現(xiàn)一個進(jìn)程啟動另一個程序的執(zhí)行的基本方法,掌握exec()的幾種調(diào)用方法。二、實驗內(nèi)容父進(jìn)程從終端讀取要執(zhí)行的命令,并交給子進(jìn)程執(zhí)行。父進(jìn)程等待子進(jìn)程結(jié)束,并打印子進(jìn)程的返回值。提示:從終端讀取要執(zhí)行的命令可用fgets()實現(xiàn)。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計1、功能設(shè)計根據(jù)實驗要求,父進(jìn)程和子進(jìn)程將被分配不同的任務(wù):父進(jìn)程從終端讀取要執(zhí)行的命令交給子進(jìn)程,然后等待子進(jìn)程技術(shù)打印子進(jìn)程的返回值;子進(jìn)程執(zhí)行父進(jìn)程讀取的命令并返回給父進(jìn)程。因為子進(jìn)程執(zhí)行命令需要打開其他文件,所以需要使用exec()類的函數(shù)實現(xiàn)在一個進(jìn)程來啟動另一個程序,在這里應(yīng)使用execlp()函數(shù)從PATH環(huán)境變量中查找文件并執(zhí)行。對于父進(jìn)程,可以調(diào)用fget()從終端讀取要執(zhí)行的命令,以字符串形式存儲然后交給子進(jìn)程執(zhí)行,待子進(jìn)程執(zhí)行完畢后接收子進(jìn)程返回值并打印。由于要求帶參數(shù)的命令也可以執(zhí)行,那么需要在父進(jìn)程中fets兩次,第一次gets得到命令給串command,然后gets參數(shù)給串command1,并且將這兩個參數(shù)分別傳到子進(jìn)程的exec()函數(shù),其中前兩個都是command,第三個是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é)束五、實驗程序#include<stdio.h>charcommand[256];charcommand1[256];intmain(){intrtn; //子進(jìn)程的返回數(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);//如果沒有參數(shù)則前者的execlp()函數(shù),如果有參數(shù)則執(zhí)行后者,有無參數(shù)只需看command1[0]是否為0perror(command);//如果exec函數(shù)返回,表明沒有正常執(zhí)行命令,打印錯誤信息exit(errorno);}else{//父進(jìn)程,等待子進(jìn)程結(jié)束,并打印子進(jìn)程的返回值wait(&rtn);printf("childprocessreturn%d\n",rtn);}}return0;}六、實驗結(jié)果 由圖可知,執(zhí)行了ls命令,參數(shù)為-a,文件按字母順序顯示六、實驗感想通過本次實驗,我學(xué)會了如何用execlp()函數(shù)達(dá)到一個進(jìn)程啟動另外一個程序的目的。并且對execlp()的幾個參數(shù)的作用有了一定了解,別且對于fork()和exelp()聯(lián)合使用的方法和功能。同時,我們進(jìn)一步熟悉了LINUX系統(tǒng)操作環(huán)境,學(xué)習(xí)了在LINUX環(huán)境下編譯和調(diào)試程序的技巧。 實驗四基于消息隊列和共享內(nèi)存的進(jìn)程間通信一、實驗?zāi)康腖inux系統(tǒng)的進(jìn)程通信機構(gòu)(IPC)允許在任意進(jìn)程間大批量地交換數(shù)據(jù)。本實驗的目的是了解和熟悉:1.Linux支持的消息通信機制及其使用方法2.Linux系統(tǒng)的共享存儲區(qū)的原理及使用方法。二、實驗內(nèi)容1.消息的創(chuàng)建、發(fā)送和接收使用消息調(diào)用msgget()、msgsnd()、msggrev()、msgctrl()編制長度為1K的消息的發(fā)送和接收程序。2.共享存儲取得創(chuàng)建、附接和斷接使用系統(tǒng)調(diào)用shmget()、shmat()、shmctl()、shmctl(),編制一個與上述功能相同的程序。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計1、消息的創(chuàng)建、發(fā)送和接收(1)功能設(shè)計為了實現(xiàn)進(jìn)程之間消息的創(chuàng)建、發(fā)送和接收,首先應(yīng)定義兩個子進(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)行對消息的控制。題目要求消息長度為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ā)送編號為1~10的10條消息,子進(jìn)程Client先后接收這11條消息,方能達(dá)到實驗?zāi)康?。?)數(shù)據(jù)結(jié)構(gòu)消息(mymsg):結(jié)構(gòu)體實現(xiàn),包含的成員變量有消息類型和消息內(nèi)容,具體實現(xiàn)如下:structmymsg{ //消息的結(jié)構(gòu)體聲明longintmymsgtype; //消息類型inttext; //消息內(nèi)容};(3)程序框圖子進(jìn)程Server開始開始子進(jìn)程Server開始開始結(jié)束定義子進(jìn)程號定義子進(jìn)程號向消息隊列中發(fā)送向消息隊列中發(fā)送10條消息獲得一個消息的描述符獲得一個消息的描述符子進(jìn)程子進(jìn)程Server結(jié)束創(chuàng)建創(chuàng)建Server子進(jìn)程向消息隊列中發(fā)送10條消息子進(jìn)程向消息隊列中發(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;//消息隊列號inti=1;msgid=msgget(KEY,0666|IPC_CREAT);//獲得一個消息的描述符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指定的消息隊列發(fā)送消息,長度為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指定的消息隊列接收消息printf("themessageis%dth\n",msg.text);i=msg.mymsgtype;}exit(0);}else{wait(0);//等待子進(jìn)程結(jié)束wait(0);exit(0);}}}2、共享存儲區(qū)的創(chuàng)建、附接和斷接(1)功能設(shè)計為了實現(xiàn)進(jìn)程通過共享存儲區(qū)進(jìn)行通信,需要創(chuàng)建兩個進(jìn)程并且調(diào)用shmget()、shmat()、shmctl()函數(shù)實現(xiàn)共享存儲區(qū)的創(chuàng)建、附接和斷接。由于共享存儲區(qū)的寫入和讀取由兩個子進(jìn)程完成,而共享存儲區(qū)在本程序中為所有進(jìn)程共用的,因此共享存儲區(qū)的創(chuàng)建、附接和斷接均需要在父進(jìn)程中完成。具體的實現(xiàn)方式是現(xiàn)在父進(jìn)程中創(chuàng)建一塊共享存儲區(qū),然后用int類型指針list指向該存儲區(qū)的地址;接著創(chuàng)建兩個子進(jìn)程,第一個子進(jìn)程通過list指針實現(xiàn)向共享存儲區(qū)寫入int類型的數(shù)據(jù),第二個子進(jìn)程通過list指針實現(xiàn)從共享存儲區(qū)讀出int類型的數(shù)據(jù)。由于兩個子進(jìn)程同時使用了list指針,所以需要控制兩個進(jìn)程互斥,在讀進(jìn)程序中添加了sleep(1)語句。(2)數(shù)據(jù)結(jié)構(gòu)通過shmid=shmget(key,size,flag)函數(shù)建立(獲得)共享存儲區(qū),返回該共享存儲區(qū)的描述符shmid。(3)程序框圖子進(jìn)程1開始子進(jìn)程1結(jié)束結(jié)束斷開共享存儲區(qū)等待子進(jìn)程結(jié)束創(chuàng)建子進(jìn)程1子進(jìn)程2建立共享存儲區(qū)并連接定義子進(jìn)程號開始子進(jìn)程1開始子進(jìn)程1結(jié)束結(jié)束斷開共享存儲區(qū)等待子進(jìn)程結(jié)束創(chuàng)建子進(jìn)程1子進(jìn)程2建立共享存儲區(qū)并連接定義子進(jìn)程號開始向向共享存儲區(qū)中讀出數(shù)據(jù)向共享存儲區(qū)中寫入數(shù)據(jù)子進(jìn)程2開始向共享存儲區(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)程號intid; //共享存儲區(qū)描述符int*list; id=shmget(KEY,sizeof(int)*MAX,IPC_CREAT|0666);//建立一塊共享存儲區(qū),返回該共享存儲區(qū)的描述符idlist=(int*)shmat(id,0,0);//將list指針指向共享存儲區(qū)if((child1=fork())==-1){printf("errorinforka\n");exit(1);}if(child1==0){//創(chuàng)建子進(jìn)程child1sleep(1);//暫停一段時間,等待第一個子進(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);//將共享存儲區(qū)與進(jìn)城斷開shmctl(id,IPC_RMID,0);//將共享存儲區(qū)標(biāo)志為被銷毀的exit(0);}}}五、實驗結(jié)果(1)消息的創(chuàng)建、發(fā)送和接收第一個子進(jìn)程一次發(fā)了10條消息,第二個子進(jìn)程一次接收了10條消息,消息隊列先進(jìn)先出(2)共享存儲區(qū)的創(chuàng)建、附接和斷接第一個子進(jìn)程向共享存儲區(qū)寫入了11個數(shù)據(jù),第二個子進(jìn)程從共享存儲區(qū)讀取,兩個進(jìn)程之間是互斥執(zhí)行的。六、實驗感想 通過本次實驗,我學(xué)會了如何用消息隊列和共享內(nèi)存的方式實現(xiàn)進(jìn)程間的通信,掌握了Linux系統(tǒng)的消息通信機制和共享存儲區(qū)的原理,并在實踐過程中掌握了它們的使用方法。在編程和調(diào)試的過程中,我進(jìn)一步熟悉了LINUX環(huán)境下的編譯過程和調(diào)試方法。實驗五利用信號實現(xiàn)進(jìn)程間通信一、實驗?zāi)康膶W(xué)習(xí)UNIX類操作系統(tǒng)信號機制,編寫Linux環(huán)境下利用信號實現(xiàn)進(jìn)程間通信的方法,掌握注冊信號處理程序及signal()調(diào)用方法。二、實驗內(nèi)容編寫一個程序,完成下列功能:實現(xiàn)一個SIGINT信號的處理程序,注冊該信號處理程序,創(chuàng)建一個子進(jìn)程,父子進(jìn)程都進(jìn)入等待。SIGINT信號的處理程序完成的任務(wù)包括打印接受到的信號的編號和進(jìn)程PID。編譯并運行該程序,然后在鍵盤上敲Ctrl+C,觀察出現(xiàn)的現(xiàn)象,并解釋。提示:參見“五、補充材料”中的signal()的基本用法。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計1、功能設(shè)計本實驗要求利用信號實現(xiàn)進(jìn)程間通信。為了實現(xiàn)實驗?zāi)康?,需要實現(xiàn)一個SIGINT信號的處理函數(shù)func()并注冊該信號處理函數(shù)。信號處理函數(shù)需要完成的任務(wù)應(yīng)包括打印接受到的信號的編號和進(jìn)程的PID,所以func()函數(shù)應(yīng)能實現(xiàn)打印當(dāng)前進(jìn)程的pid以及根據(jù)接收到的信號的編號打印出該信號名稱的功能。父進(jìn)程和子進(jìn)程分別接收兩個不同的信號,因此兩個進(jìn)程調(diào)用signal()函數(shù)時應(yīng)為不同的信號注冊信號處理函數(shù)。本次實驗采用了SIGINT和SIGUSR1兩個信號。為了讓父子進(jìn)程都能夠接收到信號,在注冊信號處理函數(shù)后應(yīng)讓兩個進(jìn)程進(jìn)入等待,并且為了方便驗證試驗結(jié)果,讓父進(jìn)程接收SIGINT信號,子進(jìn)程接收SIGUSR1信號。2、數(shù)據(jù)結(jié)構(gòu)信號(SIGNAL):UNIX系統(tǒng)含有20種信號。可以使用signal()函數(shù)為每個信號注冊信號處理函數(shù)。3、程序框圖創(chuàng)建子進(jìn)程開始創(chuàng)建子進(jìn)程開始注冊SINUSR1信號子進(jìn)程開始子進(jìn)程結(jié)束注冊SINUSR1信號子進(jìn)程開始子進(jìn)程結(jié)束注冊注冊SININT信號父進(jìn)程進(jìn)入等待父進(jìn)程進(jìn)入等待結(jié)束結(jié)束五、實驗程序#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)程號signal(SIGUSR1,func);//注冊SIGUSR1的信號處理程序for(;;) //子進(jìn)程進(jìn)入等待pause();}else{printf("fatherpid:%d\n",pid);//打印父進(jìn)程號signal(SIGINT,func); //注冊SIGINT的信號處理程序for(;;) //父進(jìn)程進(jìn)入等待pause();}}voidfunc(inti) //信號處理函數(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);}六、實驗結(jié)果如圖所示,第一次執(zhí)行后按ctrl+c后,父進(jìn)程接收信號,信號處理程序輸出父進(jìn)程號4094和信號名稱。第二次使用./5&后臺運行此程序,使用kill–USR14096時,子進(jìn)程接收信號,信號處理程序輸出子進(jìn)程號0,并輸出信號名稱。七、實驗心得通過本次實驗,我掌握了注冊信號處理程序及signal()調(diào)用方法,并且了解了如何讓程序在后臺運行的方法。我也進(jìn)一步了解了LINUX系統(tǒng)中進(jìn)程同步與通信的原理。實驗六線程的創(chuàng)建一、實驗?zāi)康木帉慙inux環(huán)境下的多線程程序,了解多線程的程序設(shè)計方法,掌握最常用的三個函數(shù)pthread_create,pthread_join和pthread_exit的用法。二、實驗內(nèi)容1、主程序創(chuàng)建兩個線程myThread1和myThread2,每個線程打印一句話。使用pthread_create(&id,NULL,(void*)thread,NULL)完成。提示:先定義每個線程的執(zhí)行體,然后在main中()創(chuàng)建幾個線程,最后主線程等待子線程結(jié)束后再退出。2、創(chuàng)建兩個線程,分別向線程傳遞如下兩種類型的參數(shù)傳遞整型值傳遞字符三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計1、創(chuàng)建兩個進(jìn)程每個進(jìn)程打印一句話(1)功能設(shè)計題目要求創(chuàng)建兩個線程,每個線程打印一句話,可以認(rèn)為兩個線程的功能是相同的,故只需要寫一個線程的運行函數(shù)thread(),在這個函數(shù)里有一個printf輸出一句話即可。然后在main函數(shù)里分別創(chuàng)建兩個線程,然后等待兩個線程結(jié)束。(2)數(shù)據(jù)結(jié)構(gòu)線程:使用pthread_create()創(chuàng)建。每個線程有相應(yīng)的線程標(biāo)示符,也有各自的屬性。線程可以和線程運行函數(shù)綁定,并可以在創(chuàng)建線程時確定該線程運行函數(shù)的參數(shù)。(3)程序框圖定義線程標(biāo)識符開始定義線程標(biāo)識符開始創(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) //線程運行函數(shù){printf("Thisisapthread.\n"); //輸出一句話}intmain(void){pthread_tid1,id2; //定義兩個線程標(biāo)識符inti,ret; ret=pthread_create(&id1,NULL,(void*)thread,NULL);//創(chuàng)建線程標(biāo)識為id1if(ret!=0){ //線程創(chuàng)建失敗printf("Createpthreaderror!\n");exit(1);}ret=pthread_create(&id2,NULL,(void*)thread,NULL);//創(chuàng)建線程標(biāo)識為id2if(ret!=0){ //線程創(chuàng)建失敗printf("Createpthreaderror!\n");exit(1);}printf("Thisisthemainprocess.\n");pthread_join(id1,NULL); //等待第一個線程結(jié)束pthread_join(id2,NULL); //等待第二個線程結(jié)束return(0);}2、創(chuàng)建兩個進(jìn)程每個進(jìn)程打印一句話分別向線程傳遞如下兩種類型的參數(shù):整型值、字符(1)功能設(shè)計題目要求創(chuàng)建兩個線程,兩個線程分別傳遞int型和char型數(shù)據(jù)給線程運行函數(shù)。所以要編寫兩個不同的線程運行函數(shù)分別接收int型和char型的數(shù)據(jù)。相應(yīng)的pthread_create()函數(shù)中要給第四個參數(shù),作為形參傳進(jìn)線程運行函數(shù)。(2)數(shù)據(jù)結(jié)構(gòu)線程:同1,使用pthread_create()創(chuàng)建。每個線程有相應(yīng)的線程標(biāo)示符,也有各自的屬性。線程可以和線程運行函數(shù)綁定,并可以在創(chuàng)建線程時確定該線程運行函數(shù)的參數(shù)。(3)程序框圖等待線程結(jié)束結(jié)束定義線程標(biāo)識符開始等待線程結(jié)束結(jié)束定義線程標(biāo)識符開始創(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) //接收字符的線程運行函數(shù){printf("receiveachar:%c\n",c);}voidthreadint(int*i) //接收整數(shù)的線程運行函數(shù){printf("receiveaint:%d\n",i);}intmain(void){pthread_tid1,id2; //定義兩個線程標(biāo)識符intret;charc='t'; char*a=c; //定義char*指針變量傳參數(shù)用ret=pthread_create(&id1,NULL,(void*)threadchar,a); //創(chuàng)建線程1,第四個參數(shù)為char*型變量用來傳遞字符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,第四個參數(shù)為int*型變量用來傳遞字符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);}五、實驗結(jié)果由圖可知兩個線程主程序創(chuàng)建了兩個進(jìn)程這兩個進(jìn)程分別輸出了一句話主程序分別創(chuàng)建了兩個線程并向線程1傳遞了‘t’向線程2傳遞了99,線程運行函數(shù)分別輸出告知接收了這兩個參數(shù)。六、實驗感想通過本次實驗,我學(xué)會了如何使用LINUX下的線程創(chuàng)建函數(shù)pthread_create()來創(chuàng)建線程,并且向線程傳遞參數(shù)。同時更加熟練的使用LINUX。實驗七利用信號量實現(xiàn)進(jìn)程的控制一、實驗?zāi)康膶W(xué)習(xí)UNIX類操作系統(tǒng)信號量機制,編寫Linux環(huán)境下利用信號量實現(xiàn)進(jìn)程控制的方法,掌握相關(guān)系統(tǒng)調(diào)用的使用方法。二、實驗內(nèi)容創(chuàng)建4個線程,其中兩個線程負(fù)責(zé)從文件讀取數(shù)據(jù)到公共的緩沖區(qū),另兩個線程從緩沖區(qū)讀取數(shù)據(jù)作不同的處理(加和乘運算)。使用信號量控制這些線程的執(zhí)行。提示:參見“五、補充材料”中的相關(guān)系統(tǒng)調(diào)用的基本用法。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計1、功能設(shè)計題目要求創(chuàng)建4個線程,其中兩個負(fù)責(zé)從文件讀數(shù)據(jù)到緩沖區(qū),另兩個負(fù)責(zé)從緩沖區(qū)讀數(shù)據(jù)進(jìn)行加和乘的運算。我對這4個線程進(jìn)行如下安排,線程1讀后線程2才可以讀,線程2讀了后線程3才可以進(jìn)行加的運算,線程3加完了后線程4才能進(jìn)行乘的運算,線程4乘完后線程1才能繼續(xù)讀。故需4個信號量sem1,sem2,sem3,sem4。線程1消費sem1生產(chǎn)sem2,線程2消費sem2生產(chǎn)sem3,線程3消費sem3生產(chǎn)sem4,線程4消費sem4生產(chǎn)sem1,形成一個循環(huán),直到文件結(jié)束為止。2、數(shù)據(jù)結(jié)構(gòu)信號量(semaphore):數(shù)據(jù)類型為結(jié)構(gòu)sem_t,本質(zhì)上是一個長整型的數(shù)。一共4個公共緩沖區(qū)(stack):采用2維數(shù)組的方式實現(xiàn)(stack[NUM][2])。數(shù)組中的兩列分別存儲兩個文件中的數(shù)據(jù)。該2維數(shù)組還有一個索引:size,指向2維數(shù)組的頂部。讀線程每次從文件讀出兩個數(shù)放到stack[NUM][0]和stack[NUM][1]3、程序框圖線程A開始創(chuàng)建4個線程并分別與相應(yīng)函數(shù)綁定結(jié)束初始化信號量開始等待線程結(jié)束 線程A開始創(chuàng)建4個線程并分別與相應(yīng)函數(shù)綁定結(jié)束初始化信號量開始等待線程結(jié)束定義線程標(biāo)識符,緩沖區(qū)和信號量定義線程標(biāo)識符,緩沖區(qū)和信號量到文件尾?Y到文件尾?NNP(sem1)P(sem1)從文件讀出兩個數(shù)據(jù)到緩沖區(qū)從文件讀出兩個數(shù)據(jù)到緩沖區(qū)P(sem2)P(sem2)線程線程A結(jié)束線程B線程B開始到文件尾?Y到文件尾?NNP(sem2) P(sem2)從文件讀出兩個數(shù)據(jù)到緩沖區(qū)從文件讀出兩個數(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ū)取兩個數(shù)相乘PP(sem3)從緩沖區(qū)取兩個數(shù)相加從緩沖區(qū)取兩個
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專項幕墻安裝2024協(xié)議范本版
- 組織行為分析與應(yīng)用
- 專業(yè)舞臺燈光購銷協(xié)議一
- 專業(yè)維修服務(wù)協(xié)議樣本2024版B版
- 2025年度場監(jiān)督管理局委托執(zhí)法事項責(zé)任書4篇
- 2025年度廠房設(shè)備租賃及維護(hù)管理合同范本4篇
- 2024版小區(qū)公共服務(wù)設(shè)施施工協(xié)議樣本一
- 2024版特定企業(yè)融資咨詢與服務(wù)協(xié)議版
- 2025年度戶外廣告場地租賃終止協(xié)議書4篇
- 專用肥料國內(nèi)運輸合同標(biāo)準(zhǔn)文本2024版版
- 2024年08月云南省農(nóng)村信用社秋季校園招考750名工作人員筆試歷年參考題庫附帶答案詳解
- 防詐騙安全知識培訓(xùn)課件
- 心肺復(fù)蘇課件2024
- 2024年股東股權(quán)繼承轉(zhuǎn)讓協(xié)議3篇
- 2024-2025學(xué)年江蘇省南京市高二上冊期末數(shù)學(xué)檢測試卷(含解析)
- 四川省名校2025屆高三第二次模擬考試英語試卷含解析
- 《城鎮(zhèn)燃?xì)忸I(lǐng)域重大隱患判定指導(dǎo)手冊》專題培訓(xùn)
- 湖南財政經(jīng)濟學(xué)院專升本管理學(xué)真題
- 考研有機化學(xué)重點
- 全國身份證前六位、區(qū)號、郵編-編碼大全
- 《GPU體系結(jié)構(gòu)》課件2
評論
0/150
提交評論