操作系統(tǒng)作業(yè)2--進程和進程通信(共7頁)_第1頁
操作系統(tǒng)作業(yè)2--進程和進程通信(共7頁)_第2頁
操作系統(tǒng)作業(yè)2--進程和進程通信(共7頁)_第3頁
操作系統(tǒng)作業(yè)2--進程和進程通信(共7頁)_第4頁
操作系統(tǒng)作業(yè)2--進程和進程通信(共7頁)_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗二 進程和進程通信實驗報告僅供參考僅供參考!(一)實驗目的n 通過使用進程和進程通信方面的系統(tǒng)調用的,加深理解有關進程方面的基本概念。通過實驗對進程有進一步的感性認識,掌握系統(tǒng)V的IPC機制。 (二)實驗題目n 1設計一個程序,創(chuàng)建一個子進程,使父子進程合作,協調地完成某一功能。要求在該程序中還要使用進程的睡眠、進程圖象改換、父進程等待子進程終止、信號的設置與傳送(包括信號處理程序)、子進程的終止等有關進程的系統(tǒng)調用。n 2利用UNIX的消息通信機制、共享內存機制(要用信號燈實施進程間的同步和互斥)實現兩個進程間的數據通信。具體的通信數據可從一個文件讀出,接收方進程可將收到的數據寫入一個新

2、文件,以便能判斷數據傳送的正確性(對文件操不熟悉的同學可不必通過讀寫文件,只要鍵盤輸入和輸出至屏幕進行比較即可)。 (藍字部分對一般同學不作要求)(三)實驗報告要求n 要求在實驗室當場調試完成,經老師檢查通過,登記,實驗報告可免做。n 對于因特殊情況,不能到實驗室上機的同學,可在自己的Linux機器上機,但要求寫實驗報告,包括題目、數據結構的說明,畫出程序框圖,在源程序中加入注釋,說明程序的測試方法和測試結果,以及實驗總結或體會。n 在實驗報告中要有一幅Linux系統(tǒng)運行的截圖,截圖中要注釋實驗者的姓名或學號。實驗報告不要做壓縮文件。n 為了截圖,可以建立以學號為用戶名的帳號,或在命令行中輸入

3、姓名或學號(會顯示出錯,沒有關系),或在程序加入注釋,再對其截圖。n 至少要完成一道實驗題。一、運行程序(一)、數據結構說明和程序框圖1、數據結構說明main()函數:子進程的創(chuàng)建都是在main()函數里面;signalfun(),是信號SIGUSR1對應的處理函數;writetofile函數,是對一個文件寫如一定的內容的函數;readfromfile,是從一個文件里面讀取內容的函數。2、程序框圖如下:開始Fork()輸入字符,并寫入文件結束YesNo子進程讀取父進程寫入的文件,并處理,處理后寫回文件子進程結束后,從文件讀取子進程處理結果,顯示結果向子進程傳送信號,并阻塞本身,等待子進程結束初

4、始化處理后是數據字符?進程圖像轉換NoYes(二)、源程序1、父子進程程序#include <sys/types.h>#include <signal.h>main()int pid,status = 1;void func();signal(SIGUSR1,func); /* 預置信號處理程序,將SIGUSR1設置為func函數的功能*/while (pid=fork( )=-1);if (pid) /* 父進程 */printf("It is the parent process.n");printf("Parent: will sen

5、d signal.n");kill(pid,SIGUSR1); /* 發(fā)送信號,即發(fā)送執(zhí)行func函數的信息 */pid = wait(&status); /* 父進程等待子進程終止 */printf("Child process %d,status=%d n",pid,status);else /* 子進程 */sleep (2); /* 等待接受信號 */printf("It is the child process.n");printf("Child:signal is received.n");execvp

6、("pwd",(char*)0); /* 映像改換,顯示當前工作區(qū),exevcp不用給出具體路徑,(char*)0指向pwd命令 */printf("execl error.n"); /* 映像改換失敗 */exit(2);printf ("Parent process finish. n"); void func ()system("date");2、消息通信機制/* msgcom.h */#include <errno.h>#include <sys/types.h>#include &

7、lt;sys/ipc.h>#include <sys/msg.h>#define MSGKEY 5678struct msgtypelong mtype;int text;#include "msgcom.h"main()/* 請求進程 */struct msgtype buf;int qid,pid;qid=msgget(MSGKEY,IPC_CREAT|0666);/* MSGKEY為約定的消息隊列關鍵字,訪問控制權限為0666 */buf.mtype=1;/* 請求進程發(fā)送消息標識為1 */buf.text=pid=getpid();/* 請求進程發(fā)

8、送消息內容為進程標識 */msgsnd(qid,&buf,sizeof(buf.text), IPC_NOWAIT|04000);/* 發(fā)送消息正文長度為buf的大小 */msgrcv(qid,&buf,512,pid,MSG_NOERROR);/* 指定接收mtype=pid的信息,即請求進程發(fā)送給服務器處理后的信息 */printf("Request received a massags from server, type is: %dn",buf.mtype);#include "msgcom.h"main()/* 服務器進程 */

9、struct msgtype buf;int qid;if(qid=msgget(MSGKEY,IPC_CREAT|0666)= -1)return(-1); /* 出錯處理 */while(1)msgrcv(qid,&buf,512,1,MSG_NOERROR);/* 接收所有請求進程發(fā)送的消息 */printf("Server receive a request from process %dn",buf.text);buf.mtype=buf.text;/* 將請求進程的標識數作為mtype的值,以便于請求進程識別 */msgsnd(qid,&buf,

10、sizeof(int),IPC_NOWAIT|04000);/* 將消息發(fā)送給請求進程 */3、共享內存機制#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/shm.h>#include <stdio.h>#define SHMKEY 18001 /* 共享內存關鍵字 */#define SHMKEY2 18002#define SIZE 1024 /* 共享內存長度 */#define SEMKEY1 19001 /* 信號燈組1關

11、鍵字 */#define SEMKEY2 19002 /* 信號燈組2關鍵字 */#define SEMKEY3 19003 /* 信號燈組3關鍵字 */static void semcall(sid,op)int sid,op;struct sembuf sb;sb.sem_num = 0;/* 信號燈編號0 */sb.sem_op = op;/* 信號燈操作數加1或減1 */sb.sem_flg = 0;/* 操作標志 */if(semop(sid,&sb,1) = -1)perror("semop"); /* 出錯處理 */;int creatsem(key)

12、 /* 信號燈組創(chuàng)建及初始化程序 */key_t key;int sid;union semun /* 如sem.h中已定義,則省略 */int val;struct semid_ds *buf;ushort *array; arg;if(sid=semget(key,1,0666|IPC_CREAT)=-1)/* 創(chuàng)建1個關鍵字為1的信號燈組,訪問控制權限為0666 */perror("semget"); /* 出錯處理 */arg.val=1;/* 初值為1 */if(semctl(sid,0,SETVAL,arg)=-1)/* 將信號燈組的第一個信號燈的初值置1 */

13、perror("semctl"); /* 出錯處理 */return(sid);void P(sid)int sid;semcall(sid,-1); /*對關鍵字為sid信號燈組值減1,相當于wait */void V(sid)int sid;semcall(sid,1); /*對關鍵字為sid信號燈組值加1,相當于signal */main()char *segaddr,*segaddr2;int segid,segid2,sid1,sid2,sid3; if(segid=shmget(SHMKEY,SIZE,IPC_CREAT|0666)=-1) /* 創(chuàng)建共享內存段

14、 */perror("shmget"); /* 出錯處理 */if(segid2=shmget(SHMKEY2,SIZE,IPC_CREAT|0666)=-1) /* 創(chuàng)建共享內存段2 */perror("shmget"); /* 出錯處理 */ segaddr=shmat(segid,0,0); /* 將共享內存映射到進程數據空間 */segaddr2=shmat(segid2,0,0); /* 將共享內存2映射到進程數據空間 */sid1=creatsem(SEMKEY1); /* 創(chuàng)建三個信號燈,初值為1 */sid2=creatsem(SEMKE

15、Y2);sid3=creatsem(SEMKEY3);P(sid2); /* 置信號燈2值為0,表示緩沖區(qū)1空 */P(sid3); /* 置信號燈3值為0,表示緩沖區(qū)2空 */if(!fork()if(!fork()while(1) /* 子進程的子進程,接收和輸出 */P(sid3);printf("Received from Parent: %sn",segaddr2);printf("Received from Grandparent: %sn",segaddr);V(sid1);while(1)/* 子進程,輸入和存儲 */ P(sid2);scanf("%s",segaddr2);V(sid3);while(1) /* 父進程,輸入和存儲

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論