北京工業(yè)大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告0122 (6000字) - 實(shí)驗(yàn)報(bào)告 - 書業(yè)網(wǎng).docx
《北京工業(yè)大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告0122 (6000字) - 實(shí)驗(yàn)報(bào)告 - 書業(yè)網(wǎng).docx》由會(huì)員分享,可在線閱讀,更多相關(guān)《北京工業(yè)大學(xué)操作系統(tǒng)實(shí)驗(yàn)報(bào)告0122 (6000字) - 實(shí)驗(yàn)報(bào)告 - 書業(yè)網(wǎng).docx(20頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、北京工業(yè)大學(xué)操作系統(tǒng)實(shí) 驗(yàn)報(bào)告0122 (6000字)- 實(shí)驗(yàn)報(bào)告-書業(yè)網(wǎng) 操作系統(tǒng)實(shí)驗(yàn)報(bào)告專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)年級(jí)本科三年級(jí)學(xué) 號(hào) 12070131姓名樊文舟 目錄: 一、實(shí)驗(yàn)1.實(shí)驗(yàn)?zāi)康?2.實(shí)驗(yàn)內(nèi)容33.實(shí)驗(yàn)要求34.實(shí)驗(yàn)設(shè)計(jì)35.實(shí)驗(yàn)程序36.實(shí)驗(yàn)結(jié)果47.實(shí)驗(yàn)感想 })return 0;)六、實(shí)驗(yàn)結(jié)果 由圖可知,父進(jìn)程先后接受了子進(jìn)程向管道寫入的 兩句話,并成功地打印出來。 兩個(gè)子進(jìn)程分別向管道寫入了 25個(gè)字符,并且是子進(jìn) 程1先寫的,子進(jìn)程2后寫的,故輸出的順序也是如此。 七、實(shí)驗(yàn)感想 通過本次實(shí)驗(yàn),我們對(duì)進(jìn)程的概念加深了理解,熟悉 了進(jìn)程的創(chuàng)立方法與作用機(jī)
2、制,明確了進(jìn)程與程序的異同。 同時(shí),我們掌握了使用管道通信的機(jī)制,進(jìn)一步認(rèn)識(shí)了并發(fā) 執(zhí)行的實(shí)質(zhì)。 實(shí)驗(yàn)三線程的管理一、實(shí)驗(yàn)?zāi)康? 編寫Linux環(huán)境下的多線程程序,了解多線程的程序 設(shè)計(jì)方法,掌握最常用的三個(gè)函數(shù)pthread_create , pthreadjoin 和 pthread_exit 的用法二、實(shí)驗(yàn)內(nèi)容1、主程序創(chuàng)立兩個(gè)線程myThreadl和myThread2,每個(gè)線程打印一句話。使用pthread_create(&id,NULL,(void*)thread,NULL)完成。 提示: 先定義每個(gè)線程的執(zhí)行體,然后在main中()創(chuàng)立幾個(gè) 線程,最后主線程等待子線程
3、結(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é)束。 ⑵數(shù)據(jù)結(jié)構(gòu) 線程:使用pthread_create()創(chuàng)立。每個(gè)線程有相應(yīng)的 線程標(biāo)示符,
4、也有各自的屬性。線程可以和線程運(yùn)行函數(shù)綁 定,并可以在創(chuàng)立線程時(shí)確定該線程運(yùn)行函數(shù)的參數(shù)。 (3)程序框圖 4)程序#include <stdio.h>#include <pthread.h>void thread(void) 〃線程運(yùn)行函數(shù)( printf("This is a pthread.\n"); 〃輸出一句 話)int main(void)(pthread_t idl,id2; 〃定義兩個(gè)線程標(biāo)識(shí)符int i,ret; ret=pthread_create(&idl,NULL,(void *) thread,NULL);〃
5、創(chuàng)立線程標(biāo)識(shí)為idlif(ret!=0){ 〃線程創(chuàng)立失敗printf ("Create pthread error!\n");exit (1);} ret=pthread_create(&id2,NULL,(void *) thread,NULL); 〃倉ij建線程標(biāo)識(shí)為id2if(ret!=O){〃線程創(chuàng)立失敗printf ("Create pthread error!\n");exit (1);}printf("This is the main process.\n");pthread_join(idl,NULL);
6、〃等待第一個(gè)線程結(jié)束 pthread」oin(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)線程:同L使用pthread_create()創(chuàng)立。每個(gè)線程有相應(yīng)的線程標(biāo)示符,也有各自的屬性。線程可以和線程運(yùn)行 函數(shù)綁
7、定,并可以在創(chuàng)立線程時(shí)確定該線程運(yùn)行函數(shù)的參數(shù)。 (3)程序框圖 (4)程序#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>void threadchar(char * c)〃接收字符的線程運(yùn)行函數(shù){printf("receive a char:%c\n",c); } void threadint(int * i) 〃接收整數(shù)的線程運(yùn)行函數(shù) (printf("receive a int:%d\n"
8、,i);)int main(void)(pthread_t idl,id2; 〃定義兩個(gè)線程標(biāo)識(shí)符int ret;char c='t'; char *a=c; 〃定義char*指針變量傳參數(shù)用 ret=pthread_create(&idl,NULL,(void *) threadchar,a); 〃創(chuàng)立線程1,第四個(gè)參數(shù)為char*型變量用來傳遞字 符if(ret!=O){ 〃線程創(chuàng)立失敗printf ("Create p th read error !\n");exit (1);)int i=99;int *b=i;〃定義int*指針變量傳參
9、數(shù)用 ret=pthread_create(&id2,NULL,(void *) threadint,b); 〃創(chuàng)立線程2,第四個(gè)參數(shù)為int*型變量用來傳遞字符 if(ret!=O){ 〃線程創(chuàng)立失敗printf ("Create pthread error!\n");exit (1);)printf("This is the main process.\n"); pthread Join(idl,NULL); 〃等待線程 1 結(jié)束 pthreadJoin(id2,NULL); 〃等待線程 2 結(jié)束return (0);)五、實(shí)驗(yàn)結(jié)果
10、由圖可知兩個(gè)線程主程序創(chuàng)立了兩個(gè)進(jìn)程這兩個(gè)進(jìn) 程分別輸出了一句話第11頁共11頁 主程序分別創(chuàng)立了兩個(gè)線程并向線程1傳遞了十向 線程2傳遞了 99,線程運(yùn)行函數(shù)分別輸出告知接收了這兩個(gè) 參數(shù)。 六、實(shí)驗(yàn)感想 通過本次實(shí)驗(yàn),我學(xué)會(huì)了如何使用LINUX下的線程 創(chuàng)立函數(shù)pthread_create()來創(chuàng)立線程,并且向線程傳遞參 數(shù)。同時(shí)更加熟練的使用LINUX。 實(shí)驗(yàn)四利用信號(hào)量實(shí)現(xiàn)進(jìn)程控制一、實(shí)驗(yàn)?zāi)康? 學(xué)習(xí)UNIX類(System V)操作系統(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ù)
11、責(zé)從文件讀取數(shù)據(jù)到 公共的緩沖區(qū),另兩個(gè)線程從緩沖區(qū)讀取數(shù)據(jù)作不同的處理 (加和乘運(yùn)算)。使用信號(hào)量控制這些線程的執(zhí)行。 提示: (1)參見“四、補(bǔ)充材料”中的相關(guān)系統(tǒng)調(diào)用的基本用 法。 (2)創(chuàng)立4個(gè)線程,其中2個(gè)線程用于從文件中讀數(shù) 據(jù)到緩沖區(qū)中(例如:一個(gè)進(jìn)程讀 l.dat文件,另一個(gè)進(jìn)程讀2.dat文件),另2個(gè)線程從 緩沖區(qū)中取數(shù)據(jù)作處理。 事先編輯好數(shù)據(jù)文件如:Ldat和2.dat,假設(shè)它們的 內(nèi)容分別為 1 2 3 4 5 6 7 8 9 10 和-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 ,然后運(yùn)行你編寫的程序,應(yīng)得到如下類似的結(jié)果: Multip
12、ly:-l*-2=2Plus:-l+-2=-3第12頁共12頁 Multiply:9*10=90Plus:-9+-10=-19MultipIy:-7*-8=56Plus:-5+-6=-llMultiply :-3*-4=12Plus:9+10=19Plus:7+8=15Plus:5+6=11 三、實(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才可以讀, 線
13、程2讀了后線程3才可以進(jìn)行加的運(yùn)算,線程3加完了后 線程4才能進(jìn)行乘的運(yùn)算,線程4乘完后線程1才能繼續(xù)讀。 故需4個(gè)信號(hào)量seml,sem2,sem3,sem4。線程1消費(fèi)semi 生產(chǎn)sem2,線程2消費(fèi)sem2生產(chǎn)sem3,線程3消費(fèi)sem3 生產(chǎn)sem4,線程4消費(fèi)sem4生產(chǎn)semi,形成一個(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])o數(shù)組中的兩列分別存儲(chǔ)兩個(gè)文件中的數(shù) 據(jù)。該2維數(shù)組還有一個(gè)索引:size,指向2維
14、數(shù)組的頂部。 讀線程每次從文件讀出兩個(gè)數(shù)放到stack[NUM][O]和 stack[NUM][l]3、程序框圖 第14頁共14頁 五、實(shí)驗(yàn)程序 #include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<semaphore.h>#define MAXSTACK 20int stack[MAXSTACK];int a=0;int b=0; sem_t sem,seml;void ReadDatal(void){)FILE *fp=fopen("l.dat"
15、;,"r");4L實(shí)驗(yàn)?zāi)康?2.實(shí)驗(yàn)內(nèi)容53.實(shí)驗(yàn)要求54.實(shí)驗(yàn)設(shè)計(jì)55.實(shí)驗(yàn)程序 66.實(shí)驗(yàn)結(jié)果77.實(shí)驗(yàn)感想7L實(shí)驗(yàn)?zāi)康?2.實(shí)驗(yàn)內(nèi)容83.實(shí)驗(yàn)要求84.實(shí)驗(yàn)設(shè)計(jì)95.實(shí)驗(yàn)程序106.實(shí)驗(yàn)結(jié)果 117 .實(shí)驗(yàn)感想11L實(shí)驗(yàn)?zāi)康?22.實(shí)驗(yàn)內(nèi)容123.實(shí)驗(yàn)要求124.實(shí)驗(yàn)設(shè)計(jì)125.實(shí)驗(yàn)結(jié)果126.實(shí)驗(yàn)感想12 二、實(shí)驗(yàn)二 4〃從文件中讀數(shù)據(jù)sem_wait(&seml);int i;for(i=0;i<10;i++) fscanf(fp,"%d",&stack[a++J);sem_post(&seml);sem_
16、post(&sem);fclose(fp);}void ReadData2(void){FILE *fp=fopen("2.dat","r");sem_wait(&seml); int i;sem_post(&seml);sem_post(&sem);fclose(fp);}void HandleDatal (void){int i;sem_wait(&sem); 〃等,讀完了加到1才能處理 for(i=0;i<5;i++){int m=stack[b++];int n=stack[b++];printf
17、("Plus:%d+%d=%d\n",m,n,m+n); })第15頁共15頁 void HandleData2(void){int i;sem_wait(&sem);for(i=0;i<5;i++){int m=stack[b++];int n=stack[b++];printf("Multiply:%d*%d=%d\n",m,n,m*n);} )int main(void)(pthread_t tl,t2,t3,t4;sem_init(&sem,O,O);〃初始化一個(gè)信號(hào)量為0,同 sem_init(&seml,O,
18、l); 〃初始化為 1,互斥pthread_create(&tl,NULL,(void*)HandleDatal,NULL);pthread_create(&t2,NULL,(void *)HandleData2,NULL);pthread_create(&t3,NULL,(void*)ReadDatal,NULL);pthread_create(&t4,NULL,(void*)ReadData2,NULL);pthreadJoin(tl,NULL);pthread_join(t2,NULL);pthread Join(t3,NULL); pthread_j
19、oin(t4,NULL);)六、實(shí)驗(yàn)感想 通過本次實(shí)驗(yàn),我進(jìn)一步掌握了如何使用LINUX下 的線程創(chuàng)立函數(shù)pthread_create()創(chuàng)立線程,并且學(xué)會(huì)了如何 使用信號(hào)量控制進(jìn)程的運(yùn)行,學(xué)會(huì)了使用消費(fèi)函數(shù) sem_wait(),生產(chǎn)函數(shù)sem_post(),以及如何初始化信 號(hào)量,同時(shí)也掌握了文件的讀取方法,本次實(shí)驗(yàn)加深了我對(duì) 信號(hào)量的認(rèn)識(shí)。 實(shí)驗(yàn)五 基于消息隊(duì)列和共享內(nèi)存的進(jìn)程間通信 一、實(shí)驗(yàn)?zāi)康? Linux系統(tǒng)的進(jìn)程通信機(jī)構(gòu)(IPC)允許在任意進(jìn)程間 大批量地交換數(shù)據(jù)。本實(shí)驗(yàn)的目的是了解和熟悉: 1. Linux支持的消息通信機(jī)制及其使用方法Linux系統(tǒng)的共享存儲(chǔ)區(qū)的原理及
20、使用方法。 二、實(shí)驗(yàn)內(nèi)容.消息的創(chuàng)立、發(fā)送和接收 使用消息調(diào)用 msgget ()、msgsnd ()、msgrcv ()、 msgctl ()編制長(zhǎng)度為1K的消息的發(fā)送和接收程序。 1 .共享存儲(chǔ)取得創(chuàng)立、附接和斷接 使用系統(tǒng)調(diào)用 shmget。、shmat ()、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ā)送,Clie
21、nt進(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先后接收這H條消息,方能到達(dá)實(shí)驗(yàn)?zāi)康摹? (2)數(shù)據(jù)結(jié)構(gòu) 消息(mymsg):結(jié)構(gòu)體實(shí)現(xiàn),包含的成員變量
22、有消息 類型和消息內(nèi)容,具體實(shí)現(xiàn)如下:struct mymsg{〃消息的結(jié) 構(gòu)體聲明long int mymsgtype;〃消息類型int text; 〃消息內(nèi)容};(3)程序框圖#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<sys/ipc.h> #include<sys/msg.h>#include<sys/shm.h>#define MAX 1024struct mymsg{〃消息結(jié)構(gòu)體long int mymsgtype; 〃消息類
23、型int text; 〃消息內(nèi)容}msg;main(void) (pid_t pids;〃發(fā)送進(jìn)程pid_t pidc;〃接收進(jìn)程int msgid; 〃消息隊(duì)列號(hào)int i=l; msgid=msgget(KEY,0666|IPC_CREAT); 〃獲得一個(gè)消 息的描述符if((pids=fork())==0){ 〃創(chuàng)立 Server 子進(jìn)程while(i<ll){msg.mymsgtype=11-i;msg.text=i; printf("the sended message is %d th\n",i); i++; msgsnd(msgid,&m
24、sg,MAX,O); 〃向 msgid 指定的 消息隊(duì)列發(fā)送消息,長(zhǎng)度為1K)exit(O);}else(i=10;if((pidc=fork())==0){ 〃創(chuàng)立 Client 子進(jìn)程while(i!=l){ msgrcv(msgid,&msg,MAX,O,O); 〃從 msgid 指定 的消息隊(duì)列接收消息printf("the message is %d th\n",msg.text);i=msg.mymsgtype;}exit(O); } else{wait(O); 〃等待子進(jìn)程結(jié)束wait(O);exit(O);}}}2、共享存儲(chǔ)區(qū)的創(chuàng)立、附接和斷接
25、(1)功能設(shè)計(jì) 為了實(shí)現(xiàn)進(jìn)程通過共享存儲(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)程通過list指針實(shí)現(xiàn)向共享存儲(chǔ) 區(qū)寫入int類型的數(shù)據(jù),第二個(gè)子進(jìn)程通過list指針實(shí)現(xiàn)從 共享存儲(chǔ)區(qū)讀出int類型的數(shù)據(jù)。由于兩個(gè)子進(jìn)程同時(shí)使用 了
26、 list指針,所以需要控制兩個(gè)進(jìn)程互斥,在讀進(jìn)程序中添 加了 sleep(l)語句。 (2)數(shù)據(jù)結(jié)構(gòu) 通過 shmid=shmget (key ,size ,flag)函數(shù)建立(獲得洪 享存儲(chǔ)區(qū),返回該共享存儲(chǔ)區(qū)的描述符shmid。 (3)程序框圖(4)程序#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include&It;sys/types.h>#include<sys/ipc.h> #include<sys/sh
27、m.h>#define MAX 11 #define KEY 75main(){int i,childl,child2,rumiing=l;〃定義子進(jìn)程號(hào)int id;〃共享存儲(chǔ)區(qū)描述符int *list; id=shmget(KEY,sizeof(int)*MAXJPC_CREAT|0666); 〃建立一塊共享存儲(chǔ)區(qū),返回該共享存儲(chǔ)區(qū)的描述符idlist=(int*)shmat(id,O,O); 〃將list指針指向共享存儲(chǔ)區(qū)if((childl=fork())==-l){printf("error in fork a\n");exit ⑴;}if(chiIdl=
28、=O){ 〃創(chuàng)立子進(jìn)程 childlsleep(l);〃暫停一段時(shí)間,等待第一個(gè)子進(jìn)程結(jié)束for(i=0;i<=10;i++) printf("your message is: %d \n",list[i]);// 從緩沖區(qū)里讀出數(shù)據(jù)exit(O);}else{if((child2=fork())==-l){printf("error in fork a\n");exit ⑴;}if(child2==0){ 〃創(chuàng)立子進(jìn)程 child2 i=0;while(l){ 〃向緩沖區(qū)里寫入數(shù)據(jù)printf("the message sent i
29、s : %d\n",list[i]);if(list[i]==10)break;i++;}exit(O);} else{wait(O);wait(O);shmdt(list); 〃將共享存儲(chǔ)區(qū)與進(jìn)城斷開 shmctl(id,IPC_RMID,O);//將共享存儲(chǔ)區(qū)標(biāo)志為被銷 毀的exit(O);}}}五、實(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)立、附接和斷接三、實(shí)驗(yàn)三 驗(yàn)四 一 三、實(shí)驗(yàn)三 驗(yàn)四 一 三、實(shí)驗(yàn)三 驗(yàn)四 一 8四、實(shí) 12個(gè)人總結(jié)12實(shí)驗(yàn)一 U
30、NIX/LINUX AH一、實(shí)驗(yàn)?zāi)康? 了解UNIX/LINUX運(yùn)行環(huán)境,熟悉UNIX/LINUX的 常用基本命令,熟悉和掌握UNIX/LINUX下C語言程序的 編寫、編譯、調(diào)試和運(yùn)行方法。 二、實(shí)驗(yàn)內(nèi)容 1、熟悉UNIX/LINUX的常用基本命令如Is、who、 pwd> ps等。(常用Linux命令在附錄中列出,請(qǐng)參閱。) 2、熟悉UNIX/LINUX下C語言編譯器cc/gcc的使用 方法。編寫一個(gè)簡(jiǎn)單的顯示“Hello,World!”C語言程序,用 gcc編譯并觀察編譯后的結(jié)果,然后運(yùn)行它。 具體方法如下: (1)開機(jī)選擇Linux操作系統(tǒng)進(jìn)入,根據(jù)要求輸入用 戶名 root,
31、密碼 rootrooto (2)嘗試使用實(shí)驗(yàn)指導(dǎo)書中提供的各種指令。步驟如 下: 如果你機(jī)器是英文系統(tǒng),找 Applications?Accessories ?Terminal,并運(yùn)行。 如果你機(jī)器是中文系統(tǒng),找 應(yīng)用?附件?終端,并運(yùn)行。 第21頁共21頁 第一個(gè)子進(jìn)程向共享存儲(chǔ)區(qū)寫入了 11個(gè)數(shù)據(jù),第二個(gè) 子進(jìn)程從共享存儲(chǔ)區(qū)讀取,兩個(gè)進(jìn)程之間是互斥執(zhí)行的。 六、實(shí)驗(yàn)感想 通過本次實(shí)驗(yàn),我學(xué)會(huì)了如何用消息隊(duì)列和共享內(nèi)存 的方式實(shí)現(xiàn)進(jìn)程間的通信,掌握了 Linux系統(tǒng)的消息通信機(jī) 制和共享存儲(chǔ)區(qū)的原理,并在實(shí)踐過程中掌握了它們的使用 方法。在編程和調(diào)試的過程中,我進(jìn)一步熟悉了 L
32、INUX環(huán) 境下的編譯過程和調(diào)試方法。 個(gè)人總結(jié) 通過本實(shí)驗(yàn)真正使用到了 Linux系統(tǒng),對(duì)linux系統(tǒng) 有個(gè)大概的了解,知道了 limix系統(tǒng)的大體結(jié)構(gòu)和使用方法。 知道了各個(gè)組合鍵的意義,使我更加了解Linux一些常用指 令的操作以及其作用,對(duì)于一個(gè)剛開始接觸Iniux操作系統(tǒng) 的初學(xué)者來說非常有用,助于以后能夠更進(jìn)一步學(xué)習(xí)Linux 操作系統(tǒng)。 第22頁共22頁 注意:Terminal是一個(gè)命令行系統(tǒng),嘗試運(yùn)行相關(guān)的 命令。 (3)嘗試寫一個(gè)Hello world程序。步驟如下: a)選擇一個(gè)目錄下創(chuàng)立一個(gè)文件example.c b)雙擊代表examples的圖標(biāo)進(jìn)入編輯
33、器并輸入hello world代碼c)保存并退出 d)在終端(Terminal)中對(duì)example.c進(jìn)行編譯。編 譯命令為: gcc example.c -o examplee)運(yùn)行編譯好的程序。指令為: ./example三、實(shí)驗(yàn)要求 按照要求編寫程序,放在相應(yīng)的目錄中,編譯成功后 執(zhí)行。 四、實(shí)驗(yàn)設(shè)計(jì)Linux系統(tǒng)常用命令格式: command [option] [argument!] [argument!]... 五、實(shí)驗(yàn)程序#include <stdio.h>#include <stdlib.h>int main(void)printf (&qu
34、ot;Hello World!\n");system ("pause");return 0;) 六、實(shí)驗(yàn)結(jié)果 七、實(shí)驗(yàn)感想 通過第一次室驗(yàn),熟悉了 LINUX系統(tǒng)的操作, 終端的使用,GCC編譯c程序?qū)嶒?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”。試觀察記錄屏幕上的顯 示
35、結(jié)果,并分析原因。(提示:對(duì)每個(gè)進(jìn)程的打印循環(huán)執(zhí)行10次,那么可以發(fā)現(xiàn)執(zhí)行順序的不同)(2)進(jìn)程控制 修改已編寫的程序,將每一個(gè)進(jìn)程輸出一個(gè)字符改為 用一個(gè)循環(huán)輸出1000個(gè)字符(父進(jìn)程輸出1000個(gè)“a”,子 進(jìn)程分別輸出1000個(gè)“b”和"c”),再觀察程序執(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分別向管道各寫一 句話: Child 1 is sending a message! Child 2 is sending a message! 父進(jìn)程從管道中讀出二個(gè)來自
36、子進(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)連起來,使得 一個(gè)緩沖區(qū)寫的東西可以從另一個(gè)緩沖區(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
37、_tfork()函數(shù)創(chuàng)立,返回值為子進(jìn)程 號(hào)。 管道:使用int pipe(int —edis[2])創(chuàng)立無名管道, filedis⑵為兩個(gè)文件描述符。 3、程序框圖五、實(shí)驗(yàn)程序#include<stdio.h>#include<string.h>#include<unistd.h>int pipe(int filedis[2]);#define INPUT 0#define OUTPUT 1 int main() int file_descriptors[2];pid_t pidl,pid2;〃定義子進(jìn)程char bufI256];int retur
38、ned_count;pipe(file_descriptors); 〃創(chuàng)立無名管道 if((pidl=fork())==-l) 〃創(chuàng)立子進(jìn)程 1 (printf("Error on fork\n");exit(l);) if(pidl==O)(printf("in the spawned(childl)process\n");close(file_descriptors[INPUT]); 〃關(guān)閉通道的讀端 write(file_descriptorsfOUTPUT],"childl issending message"9strlen
39、("childl is sending message")); 〃向管道中寫一句話exit(O);)else{ if((pid2=fork())==?l) 〃創(chuàng)立子進(jìn)程 2printf("Error on fork\n");exit(l);)if(pid2==0)(printf("in the spawned(child2)process\n");close(file_descriptors[INPUT]); 〃關(guān)閉通道的讀端 write(file_descriptors[OUTPUT],"chiId2 is sendi
40、ng message"9strlen("childl is sending message")); 〃向管道中寫一句話 exit(O);)else{〃父進(jìn)程printf("in the parent process\n");dose(file_descriptors[OUTPUT]); 〃關(guān)閉管道的寫端returned_count=read(file_descriptors[INPUT],buf,sizeof(bu D); printf("%d bytes of data received from spawned process: %s\n",retiinied_coiinLbiif); 〃父進(jìn)程從管道中讀出數(shù)據(jù)
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 設(shè)備采購常用的四種評(píng)標(biāo)方法
- 車間員工管理須知(應(yīng)知應(yīng)會(huì))
- 某公司設(shè)備維護(hù)保養(yǎng)工作規(guī)程
- 某企業(yè)潔凈車間人員進(jìn)出管理規(guī)程
- 企業(yè)管理制度之5S管理的八個(gè)口訣
- 標(biāo)準(zhǔn)化班前會(huì)的探索及意義
- 某企業(yè)內(nèi)審員考試試題含答案
- 某公司環(huán)境保護(hù)考核管理制度
- 現(xiàn)場(chǎng)管理的定義
- 員工培訓(xùn)程序
- 管理制度之生產(chǎn)廠長(zhǎng)的職責(zé)與工作標(biāo)準(zhǔn)
- 某公司各級(jí)專業(yè)人員環(huán)保職責(zé)
- 企業(yè)管理制度:5S推進(jìn)與改善工具
- XXX公司環(huán)境風(fēng)險(xiǎn)排查及隱患整改制度
- 生產(chǎn)車間基層管理要點(diǎn)及建議