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

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上操作系統(tǒng)實驗報告 學(xué) 號: 姓 名: 指導(dǎo)老師: 完成日期: 目錄實驗一1實驗二2實驗三7實驗四10實驗五15實驗六18實驗七22專心-專注-專業(yè)實驗一 UNIX/LINUX入門一、實驗?zāi)康牧私?UNIX/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 編寫

2、一個簡單的顯示“Hello,World!”c 語言程序,用gcc 編譯并觀察編譯后的結(jié)果,然后運行它。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗程序#include <stdio.h> #include <stdlib.h> int main() printf ("Hello World!n"); return 0;五、實驗感想通過第一次室驗,我了解 UNIX/LINUX 運行環(huán)境,熟悉了UNIX/LINUX 的常用基本命令,熟悉和掌握了UNIX/LINUX 下c 語言程序的編寫、

3、編譯、調(diào)試和運行方法。實驗二 進程管理一、實驗?zāi)康募由顚M程概念的理解,明確進程與程序的區(qū)別;進一步認識并發(fā)執(zhí)行的實質(zhì)。二、實驗內(nèi)容(1)進程創(chuàng)建編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個子進程。當(dāng)此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示“a“;子進程分別顯示字符”b“和字符“c”。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。(2)進程控制修改已編寫的程序,將每一個進程輸出一個字符改為每一個進程輸出一句話,再觀察程序執(zhí)行時屏幕上出現(xiàn)的現(xiàn)象,并分析原因。(3)進程的管道通信編寫程序?qū)崿F(xiàn)進程的管道通信。使用系統(tǒng)調(diào)用pipe()建立一個管道,二

4、個子進程P1 和P2 分別向管道各寫一句話:Child 1 is sending a message!Child 2 is sending a message!父進程從管道中讀出二個來自子進程的信息并顯示(要求先接收P1,再接收P2)。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計 1、功能設(shè)計(1)進程創(chuàng)建使用fork()創(chuàng)建兩個子進程,父進程等待兩個子進程執(zhí)行完再運行。(2)進程控制使用fork()創(chuàng)建兩個子進程,父進程等待兩個子進程分別輸出一句話再運行。(3)進程的管道通信 先創(chuàng)建子進程1,向管道寫入一句話,子進程1結(jié)

5、束后創(chuàng)建子進程2,向管道寫入一句話,最后父進程從管道中讀出。 2、數(shù)據(jù)結(jié)構(gòu) 子進程和管道。 3、程序框圖 五、實驗程序(1)進程創(chuàng)建#include<stdio.h>#include<stdlib.h>int main() int pid1, pid2;pid1=fork();if (pid1<0) printf("Fork 1 failed!");if (pid1=0) printf("bn");exit(0); if (pid1>0) wait(NULL);pid2 = fork(); if (pid2<0)

6、 printf("Fork 2 failed!"); if (pid2=0) printf("cn");exit(0); if (pid2>0) wait(NULL);printf("an");exit(0); (2)進程控制#include<stdio.h>#include<stdlib.h>int main() int pid1, pid2;pid1=fork();if (pid1<0) printf("Fork 1 failed!");if (pid1=0) printf(

7、"This is child bn");exit(0); if (pid1>0) wait(NULL);pid2 = fork(); if (pid2<0) printf("Fork 2 failed!"); if (pid2=0) printf("This is child cn"); exit(0); if (pid2>0) wait(NULL); printf("This is father an"); exit(0); (3)進程的管道通信#include<stdio.h>#i

8、nclude<stdlib.h>#include<sys/types.h>#include<memory.h>int main() int pid1, pid2; int pfd2;char *msg1="Child 1 is sending a message!"char *msg2="Child 2 is sending a message!" char buf256; int r,w; if(pipe(pfd)<0) printf("pipe create error!n"); exit

9、(1);pid1 = fork();if (pid1<0) printf("Fork 1 failed!"); if (pid1=0) close(pfd0); /writesleep(3);if(w=write(pfd1,msg1,strlen(msg1)<0) printf("wirte error!n");exit(1);else printf("child 1 send msg to pipe!n"); exit(0);if(pid1>0) wait(NULL);pid2 = fork(); if(pid2&

10、lt;0) printf("Fork 2 failed!"); if(pid2>0) close(pfd1); /read sleep(3); if(r=read(pfd0,buf,256)<0) printf("read error!n");exit(1); else printf("parent read from pipe: %sn",buf); wait(NULL); close(pfd1); /read sleep(3); if(r=read(pfd0,buf,256)<0) printf("re

11、ad error!n");exit(1); else printf("parent read from pipe: %sn",buf); if(pid2=0) close(pfd0); /write sleep(6); if(w=write(pfd1,msg2,strlen(msg2)<0) printf("write error!n");exit(1); else printf("child 2 send msg to pipe!n"); exit(0); 六、實驗結(jié)果從圖中可以看出,分別輸出了,三個字母,三句話,實

12、現(xiàn)了子進程向管道寫數(shù)據(jù),父進程從管道中讀出。七、實驗感想通過本次實驗,我們對進程的概念加深了理解,熟悉了進程的創(chuàng)建方法與作用機制,明確了進程與程序的異同。同時,我們掌握了使用管道通信的機制,進一步認識了并發(fā)執(zhí)行的實質(zhì)。實驗三 一個進程啟動另一個程序的執(zhí)行一、實驗?zāi)康木帉?Linux 環(huán)境下,fork()與exec()的結(jié)合使用實現(xiàn)一個進程啟動另一個程序的執(zhí)行的基本方法,掌握exec()的幾種調(diào)用方法。二、實驗內(nèi)容父進程從終端讀取要執(zhí)行的命令,并交給子進程執(zhí)行。父進程等待子進程結(jié)束,并打印子進程的返回值。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫

13、出實驗報告。四、實驗設(shè)計1、功能設(shè)計根據(jù)實驗要求,父進程和子進程將被分配不同的任務(wù):父進程從終端讀取要執(zhí)行的命令交給子進程,然后等待子進程技術(shù)打印子進程的返回值;子進程執(zhí)行父進程讀取的命令并返回給父進程。因為子進程執(zhí)行命令需要打開其他文件,所以需要使用exec()類的函數(shù)實現(xiàn)在一個進程來啟動另一個程序,在這里應(yīng)使用execlp()函數(shù)從PATH環(huán)境變量中查找文件并執(zhí)行。對于父進程,可以調(diào)用fget()從終端讀取要執(zhí)行的命令,以字符串形式存儲然后交給子進程執(zhí)行,待子進程執(zhí)行完畢后接收子進程返回值并打印。由于要求帶參數(shù)的命令也可以執(zhí)行,那么需要在父進程中fets兩次,第一次gets得到命令給串co

14、mmand,然后gets參數(shù)給串command1,并且將這兩個參數(shù)分別傳到子進程的exec()函數(shù),其中前兩個都是command,第三個是command1。2、數(shù)據(jù)結(jié)構(gòu)用char*型全局變量command存放指令用char*型全局變量command1存放參數(shù)3、程序框圖五、實驗程序#include <stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>char command256;char command1256;int main()int rtn; /子進程的返回數(shù)值in

15、t errorno;while(1) printf( ">" ); /從終端讀取要執(zhí)行的命令fgets( command, 256, stdin );printf( "<" ); /從終端讀取要執(zhí)行命令的參數(shù)fgets( command1, 256, stdin );commandstrlen(command)-1 = '0'command1strlen(command1)-1 = '0'if ( fork() = 0 ) /子進程執(zhí)行此命令errorno=(command10=0)?:execlp(comma

16、nd, command, NULL, NULL), execlp(command, command, command1, NULL);/如果沒有參數(shù)則前者的execlp()函數(shù),如果有參數(shù)則執(zhí)行后者,有無參數(shù)只需看command10是否為0perror( command ); /如果exec函數(shù)返回,表明沒有正常執(zhí)行命令,打印錯誤信息exit(errorno);else /父進程, 等待子進程結(jié)束,并打印子進程的返回值wait ( &rtn );printf( " child process return %dn", rtn );return 0;六、實驗結(jié)果由圖可

17、知,執(zhí)行了ls命令,參數(shù)為-a,文件按字母順序顯示如上圖所示,輸入命令ls,輸入?yún)?shù)-a,輸出文件夾的內(nèi)容。七、實驗感想通過本次實驗,我學(xué)會了如何用execlp()函數(shù)達到一個進程啟動另外一個程序的目的。并且對execlp()的幾個參數(shù)的作用有了一定了解,別且對于fork()和exelp()聯(lián)合使用的方法和功能。同時,我們進一步熟悉了LINUX系統(tǒng)操作環(huán)境,學(xué)習(xí)了在LINUX環(huán)境下編譯和調(diào)試程序的技巧。實驗四 基于消息隊列和共享內(nèi)存的進程間通信一、實驗?zāi)康腖inux 系統(tǒng)的進程通信機構(gòu)(IPC)允許在任意進程間大批量地交換數(shù)據(jù)。本實驗的目的是了解和熟悉:1. Linux 支持的消息通信機制及其

18、使用方法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)進程之間消息的創(chuàng)建、發(fā)送和接收,首先應(yīng)定義兩個子進程,Server進

19、程負責(zé)發(fā)送,Client進程負責(zé)接收,父進程負責(zé)創(chuàng)建。其次需要用到msgget()、msgsnd()、msggrev()、msgctrl()等函數(shù)進行對消息的控制。題目要求消息長度為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。父進程獲得創(chuàng)建消息后,子進程Server先后發(fā)送編號為110的10條消息,子進程Client先后接收這10條消息,方能達到實驗?zāi)康?。?)數(shù)據(jù)結(jié)構(gòu)消息(mymsg):結(jié)構(gòu)體實現(xiàn),包含的成員變量有消息類型和消息

20、內(nèi)容,具體實現(xiàn)如下:struct mymsg/消息的結(jié)構(gòu)體聲明long int mymsgtype;/消息類型int text;/消息內(nèi)容(3)程序框圖2、共享存儲區(qū)的創(chuàng)建、附接和斷接(1)功能設(shè)計為了實現(xiàn)進程通過共享存儲區(qū)進行通信,需要創(chuàng)建兩個進程并且調(diào)用shmget()、shmat()、shmctl()函數(shù)實現(xiàn)共享存儲區(qū)的創(chuàng)建、附接和斷接。由于共享存儲區(qū)的寫入和讀取由兩個子進程完成,而共享存儲區(qū)在本程序中為所有進程共用的,因此共享存儲區(qū)的創(chuàng)建、附接和斷接均需要在父進程中完成。具體的實現(xiàn)方式是現(xiàn)在父進程中創(chuàng)建一塊共享存儲區(qū),然后用int類型指針list指向該存儲區(qū)的地址;接著創(chuàng)建兩個子進程,

21、第一個子進程通過list指針實現(xiàn)向共享存儲區(qū)寫入int類型的數(shù)據(jù),第二個子進程通過list指針實現(xiàn)從共享存儲區(qū)讀出int類型的數(shù)據(jù)。由于兩個子進程同時使用了list指針,所以需要控制兩個進程互斥,在讀進程序中添加了sleep(1)語句。(2)數(shù)據(jù)結(jié)構(gòu)通過shmid=shmget (key ,size ,flag)函數(shù)建立(獲得)共享存儲區(qū),返回該共享存儲區(qū)的描述符shmid。(3)程序框圖五、實驗程序1、消息的創(chuàng)建、發(fā)送和接收#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<

22、;sys/ipc.h>#include<sys/msg.h>#include<sys/shm.h>#define MAX 1024#define KEY 75struct mymsg/消息結(jié)構(gòu)體long int mymsgtype;/消息類型int text;/消息內(nèi)容msg;int main()pid_t pids; pid_t pidc; int msgid; int i=1;msgid=msgget(KEY,0666|IPC_CREAT);/獲得一個消息的描述符if(pids=fork()=0)/創(chuàng)建Server子進程while(i<11)msg.my

23、msgtype=11-i;msg.text=i;printf("the sended message is %d thn",i); i+; msgsnd(msgid,&msg,MAX,0); /向msgid指定的消息隊列發(fā)送消息,長度為1K exit(0); else i=10;if(pidc=fork()=0) /創(chuàng)建Client子進程while(i!=1)msgrcv(msgid,&msg,MAX,0,0); /從msgid指定的消息隊列接收消息printf("the message is %d thn",msg.text);i=ms

24、g.mymsgtype;exit(0);elsewait(0); wait(0); exit(0); 2、共享存儲區(qū)的創(chuàng)建、附接和斷接#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#define MAX 11#define KEY 75main()int i,child1,child2,running

25、=1;/定義子進程號int id; 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("error in fork an"); exit(1); if(child1=0) sleep(1); for(i=0;i<=10;i+)printf("your message is: %d n",listi);

26、exit(0); elseif(child2=fork()=-1)printf("error in fork an");exit(1); if(child2=0)i=0;while(1)listi=i; /向緩沖區(qū)里寫入數(shù)據(jù)printf("the message sent is : %dn",listi);if(listi=10) break; i+;exit(0);elsewait(0); wait(0); shmdt(list); /將共享存儲區(qū)與進城斷開shmctl(id,IPC_RMID,0);/ 將共享存儲區(qū)標志為被銷毀的exit(0); 六、

27、實驗結(jié)果(1)消息的創(chuàng)建、發(fā)送和接收 第一個子進程一次發(fā)了10條消息,第二個子進程一次接收了10條消息,消息隊列先進先出。(2)共享存儲區(qū)的創(chuàng)建、附接和斷接第一個子進程向共享存儲區(qū)寫入了11個數(shù)據(jù),第二個子進程從共享存儲區(qū)讀取,兩個進程之間是互斥執(zhí)行的。七、實驗感想通過本次實驗,我學(xué)會了如何用消息隊列和共享內(nèi)存的方式實現(xiàn)進程間的通信,掌握了Linux系統(tǒng)的消息通信機制和共享存儲區(qū)的原理,并在實踐過程中掌握了它們的使用方法。在編程和調(diào)試的過程中,我進一步熟悉了LINUX環(huán)境下的編譯過程和調(diào)試方法。實驗五 利用信號實現(xiàn)進程間通信一、實驗?zāi)康膶W(xué)習(xí) UNIX 類操作系統(tǒng)信號機制,編寫Linux 環(huán)境下

28、利用信號實現(xiàn)進程間通信的方法,掌握注冊信號處理程序及signal()調(diào)用方法。二、實驗內(nèi)容編寫一個程序,完成下列功能:實現(xiàn)一個SIGINT 信號的處理程序,注冊該信號處理程序,創(chuàng)建一個子進程,父子進程都進入等待。SIGINT 信號的處理程序完成的任務(wù)包括打印接受到的信號的編號和進程PID。編譯并運行該程序,然后在鍵盤上敲Ctrl + C,觀察出現(xiàn)的現(xiàn)象,并解釋。提示:參見“五、補充材料”中的signal()的基本用法。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計1、功能設(shè)計本實驗要求利用信號實現(xiàn)進程間通信。為了實現(xiàn)實驗?zāi)康?/p>

29、,需要實現(xiàn)一個SIGINT信號的處理函數(shù)func()并注冊該信號處理函數(shù)。信號處理函數(shù)需要完成的任務(wù)應(yīng)包括打印接受到的信號的編號和進程的PID,所以func()函數(shù)應(yīng)能實現(xiàn)打印當(dāng)前進程的pid以及根據(jù)接收到的信號的編號打印出該信號名稱的功能。父進程和子進程分別接收兩個不同的信號,因此兩個進程調(diào)用signal()函數(shù)時應(yīng)為不同的信號注冊信號處理函數(shù)。本次實驗采用了SIGINT和SIGUSR1兩個信號。為了讓父子進程都能夠接收到信號,在注冊信號處理函數(shù)后應(yīng)讓兩個進程進入等待,并且為了方便驗證試驗結(jié)果,讓父進程接收SIGINT信號,子進程接收SIGUSR1信號。2、數(shù)據(jù)結(jié)構(gòu)信號(SIGNAL):UN

30、IX系統(tǒng)含有20種信號??梢允褂胹ignal()函數(shù)為每個信號注冊信號處理函數(shù)。3、程序框圖五、實驗程序#include<stdio.h>#include<stdlib.h>#include<signal.h>#include<unistd.h>void func(int i);int pid;int main()if(pid=fork()=0)/創(chuàng)建子進程printf("sonpid:%dn",pid);/ 打印子進程號signal(SIGUSR1,func);/ 注冊SIGUSR1的信號處理程序for ( ; ; )/子進

31、程進入等待pause();elseprintf("fatherpid:%dn",pid);/ 打印父進程號signal(SIGINT,func);/注冊SIGINT的信號處理程序for ( ; ; )/父進程進入等待pause();void func(int i)/ 信號處理函數(shù)printf("pid:%dn",pid);if (i = SIGUSR1)printf("received SIGUSR1n");else if (i = SIGUSR2)printf("received SIGUSR2n");else

32、if(i = SIGINT)printf("received SIGINT %dn", i);exit(1);exit(0);六、實驗結(jié)果如圖所示,第一次執(zhí)行后打印父進程和子進程pid,按ctrl+c后,父進程接收信號,信號處理程序輸出父進程號2472和信號名稱。第二次使用./shiyan5&后臺運行此程序,使用kill USR1 2472時,子進程接收信號,信號處理程序輸出子進程號0,并輸出信號名稱。七、實驗心得通過本次實驗,我掌握了注冊信號處理程序及signal()調(diào)用方法,并且了解了如何讓程序在后臺運行的方法。我也進一步了解了LINUX系統(tǒng)中進程同步與通信的原

33、理。 實驗六 線程的創(chuàng)建一、實驗?zāi)康木帉?Linux 環(huán)境下的多線程程序,了解多線程的程序設(shè)計方法,掌握最常用的三個函數(shù)pthread_create,pthread_join 和pthread_exit 的用法。二、實驗內(nèi)容1、主程序創(chuàng)建兩個線程 myThread1 和myThread2 ,每個線程打印一句話。使用pthread_create(&id,NULL,(void *) thread,NULL)完成。2、創(chuàng)建兩個線程,分別向線程傳遞如下兩種類型的參數(shù)傳遞整型值傳遞字符三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗

34、設(shè)計1、創(chuàng)建兩個進程每個進程打印一句話(1)功能設(shè)計題目要求創(chuàng)建兩個線程,每個線程打印一句話,可以認為兩個線程的功能是相同的,故只需要寫一個線程的運行函數(shù)thread(),在這個函數(shù)里有一個printf輸出一句話即可。然后在main函數(shù)里分別創(chuàng)建兩個線程,然后等待兩個線程結(jié)束。(2)數(shù)據(jù)結(jié)構(gòu)線程:使用pthread_create()創(chuàng)建。每個線程有相應(yīng)的線程標示符,也有各自的屬性。線程可以和線程運行函數(shù)綁定,并可以在創(chuàng)建線程時確定該線程運行函數(shù)的參數(shù)。(3)程序框圖2、創(chuàng)建兩個進程每個進程打印一句話分別向線程傳遞如下兩種類型的參數(shù) :整型值、字符(1)功能設(shè)計題目要求創(chuàng)建兩個線程,兩個線程分別

35、傳遞int型和char型數(shù)據(jù)給線程運行函數(shù)。所以要編寫兩個不同的線程運行函數(shù)分別接收int型和char型的數(shù)據(jù)。相應(yīng)的pthread_create()函數(shù)中要給第四個參數(shù),作為形參傳進線程運行函數(shù)。(2)數(shù)據(jù)結(jié)構(gòu)線程:同1,使用pthread_create()創(chuàng)建。每個線程有相應(yīng)的線程標示符,也有各自的屬性。線程可以和線程運行函數(shù)綁定,并可以在創(chuàng)建線程時確定該線程運行函數(shù)的參數(shù)。(3)程序框圖五、實驗程序1、創(chuàng)建兩個進程每個進程打印一句話#include <stdio.h>#include<stdlib.h>#include <pthread.h>void

36、thread()/線程運行函數(shù)printf("This is a pthread.n");/輸出一句話int main()pthread_t id1,id2;/定義兩個線程標識符int i,ret; ret=pthread_create(&id1,NULL,(void *) thread,NULL);/創(chuàng)建線程標識為id1 if(ret!=0)/線程創(chuàng)建失敗 printf ("Create pthread error!n");exit (1); ret=pthread_create(&id2,NULL,(void *) thread,NU

37、LL); /創(chuàng)建線程標識為id2 if(ret!=0) /線程創(chuàng)建失敗printf ("Create pthread error!n");exit (1);printf("This is the main process.n");pthread_join(id1,NULL);/等待第一個線程結(jié)束pthread_join(id2,NULL);/等待第二個線程結(jié)束return (0);2、創(chuàng)建兩個進程每個進程打印一句話分別向線程傳遞如下兩種類型的參數(shù) :整型值、字符#include <pthread.h>#include <stdio.h&

38、gt;#include <stdlib.h>#include <unistd.h>void threadchar(char * c)/接收字符的線程運行函數(shù) printf("receive a char:%cn",c);void threadint(int * i)/接收整數(shù)的線程運行函數(shù)printf("receive a int:%dn",i);int main(void) pthread_t id1,id2; int ret; char c='t' char *a=c;/定義char*指針變量傳參數(shù)用 ret=

39、pthread_create(&id1,NULL,(void *) threadchar,a);/創(chuàng)建線程1,第四個參數(shù)為char*型變量用來傳遞字符 if(ret!=0)/線程創(chuàng)建失敗 printf ("Create pthread error!n"); exit (1); int i=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 (&q

40、uot;Create pthread error!n"); exit (1); printf("This is the main process.n"); pthread_join(id1,NULL); /等待線程1結(jié)束 pthread_join(id2,NULL); /等待線程2結(jié)束 return (0);六、實驗結(jié)果由圖可知兩個線程主程序創(chuàng)建了兩個進程這兩個進程分別輸出了一句話。主程序分別創(chuàng)建了兩個線程并向線程1傳遞了t向線程2傳遞了99,線程運行函數(shù)分別輸出告知接收了這兩個參數(shù)。七、實驗感想通過本次實驗,我學(xué)會了如何使用LINUX下的線程創(chuàng)建函數(shù)pthrea

41、d_create()來創(chuàng)建線程,并且向線程傳遞參數(shù)。同時更加熟練的使用LINUX。實驗七 利用信號量實現(xiàn)進程的控制一、實驗?zāi)康膶W(xué)習(xí) UNIX 類操作系統(tǒng)信號量機制,編寫Linux 環(huán)境下利用信號量實現(xiàn)進程控制的方法,掌握相關(guān)系統(tǒng)調(diào)用的使用方法。二、實驗內(nèi)容創(chuàng)建4 個線程,其中兩個線程負責(zé)從文件讀取數(shù)據(jù)到公共的緩沖區(qū),另兩個線程從緩沖區(qū)讀取數(shù)據(jù)作不同的處理(加和乘運算)。使用信號量控制這些線程的執(zhí)行。三、實驗要求按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結(jié)果,并寫出實驗報告。四、實驗設(shè)計1、功能設(shè)計題目要求創(chuàng)建4個線程,其中兩個負責(zé)從文件讀數(shù)據(jù)到緩沖區(qū),另兩個負責(zé)從緩

42、沖區(qū)讀數(shù)據(jù)進行加和乘的運算。我對這4個線程進行如下安排,線程1讀后線程2才可以讀,線程2讀了后線程3才可以進行加的運算,線程3加完了后線程4才能進行乘的運算,線程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)(stackNUM2)。數(shù)組中的兩列分別存儲兩個文件中的數(shù)據(jù)。該2維數(shù)組還有一個索引:size,指向2維數(shù)組的頂部。讀線程每

溫馨提示

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

評論

0/150

提交評論