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