




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)二 進(jìn)程和進(jìn)程通信實(shí)驗(yàn)報(bào)告僅供參考僅供參考!(一)實(shí)驗(yàn)?zāi)康膎 通過使用進(jìn)程和進(jìn)程通信方面的系統(tǒng)調(diào)用的,加深理解有關(guān)進(jìn)程方面的基本概念。通過實(shí)驗(yàn)對(duì)進(jìn)程有進(jìn)一步的感性認(rèn)識(shí),掌握系統(tǒng)V的IPC機(jī)制。 (二)實(shí)驗(yàn)題目n 1設(shè)計(jì)一個(gè)程序,創(chuàng)建一個(gè)子進(jìn)程,使父子進(jìn)程合作,協(xié)調(diào)地完成某一功能。要求在該程序中還要使用進(jìn)程的睡眠、進(jìn)程圖象改換、父進(jìn)程等待子進(jìn)程終止、信號(hào)的設(shè)置與傳送(包括信號(hào)處理程序)、子進(jìn)程的終止等有關(guān)進(jìn)程的系統(tǒng)調(diào)用。n 2利用UNIX的消息通信機(jī)制、共享內(nèi)存機(jī)制(要用信號(hào)燈實(shí)施進(jìn)程間的同步和互斥)實(shí)現(xiàn)兩個(gè)進(jìn)程間的數(shù)據(jù)通信。具體的通信數(shù)據(jù)可從一個(gè)文件讀出,接收方進(jìn)程可將收到的數(shù)據(jù)寫入一個(gè)新
2、文件,以便能判斷數(shù)據(jù)傳送的正確性(對(duì)文件操不熟悉的同學(xué)可不必通過讀寫文件,只要鍵盤輸入和輸出至屏幕進(jìn)行比較即可)。 (藍(lán)字部分對(duì)一般同學(xué)不作要求)(三)實(shí)驗(yàn)報(bào)告要求n 要求在實(shí)驗(yàn)室當(dāng)場(chǎng)調(diào)試完成,經(jīng)老師檢查通過,登記,實(shí)驗(yàn)報(bào)告可免做。n 對(duì)于因特殊情況,不能到實(shí)驗(yàn)室上機(jī)的同學(xué),可在自己的Linux機(jī)器上機(jī),但要求寫實(shí)驗(yàn)報(bào)告,包括題目、數(shù)據(jù)結(jié)構(gòu)的說明,畫出程序框圖,在源程序中加入注釋,說明程序的測(cè)試方法和測(cè)試結(jié)果,以及實(shí)驗(yàn)總結(jié)或體會(huì)。n 在實(shí)驗(yàn)報(bào)告中要有一幅Linux系統(tǒng)運(yùn)行的截圖,截圖中要注釋實(shí)驗(yàn)者的姓名或?qū)W號(hào)。實(shí)驗(yàn)報(bào)告不要做壓縮文件。n 為了截圖,可以建立以學(xué)號(hào)為用戶名的帳號(hào),或在命令行中輸入
3、姓名或?qū)W號(hào)(會(huì)顯示出錯(cuò),沒有關(guān)系),或在程序加入注釋,再對(duì)其截圖。n 至少要完成一道實(shí)驗(yàn)題。一、運(yùn)行程序(一)、數(shù)據(jù)結(jié)構(gòu)說明和程序框圖1、數(shù)據(jù)結(jié)構(gòu)說明main()函數(shù):子進(jìn)程的創(chuàng)建都是在main()函數(shù)里面;signalfun(),是信號(hào)SIGUSR1對(duì)應(yīng)的處理函數(shù);writetofile函數(shù),是對(duì)一個(gè)文件寫如一定的內(nèi)容的函數(shù);readfromfile,是從一個(gè)文件里面讀取內(nèi)容的函數(shù)。2、程序框圖如下:開始Fork()輸入字符,并寫入文件結(jié)束YesNo子進(jìn)程讀取父進(jìn)程寫入的文件,并處理,處理后寫回文件子進(jìn)程結(jié)束后,從文件讀取子進(jìn)程處理結(jié)果,顯示結(jié)果向子進(jìn)程傳送信號(hào),并阻塞本身,等待子進(jìn)程結(jié)束初
4、始化處理后是數(shù)據(jù)字符?進(jìn)程圖像轉(zhuǎn)換NoYes(二)、源程序1、父子進(jìn)程程序#include <sys/types.h>#include <signal.h>main()int pid,status = 1;void func();signal(SIGUSR1,func); /* 預(yù)置信號(hào)處理程序,將SIGUSR1設(shè)置為func函數(shù)的功能*/while (pid=fork( )=-1);if (pid) /* 父進(jìn)程 */printf("It is the parent process.n");printf("Parent: will sen
5、d signal.n");kill(pid,SIGUSR1); /* 發(fā)送信號(hào),即發(fā)送執(zhí)行func函數(shù)的信息 */pid = wait(&status); /* 父進(jìn)程等待子進(jìn)程終止 */printf("Child process %d,status=%d n",pid,status);else /* 子進(jìn)程 */sleep (2); /* 等待接受信號(hào) */printf("It is the child process.n");printf("Child:signal is received.n");execvp
6、("pwd",(char*)0); /* 映像改換,顯示當(dāng)前工作區(qū),exevcp不用給出具體路徑,(char*)0指向pwd命令 */printf("execl error.n"); /* 映像改換失敗 */exit(2);printf ("Parent process finish. n"); void func ()system("date");2、消息通信機(jī)制/* 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()/* 請(qǐng)求進(jìn)程 */struct msgtype buf;int qid,pid;qid=msgget(MSGKEY,IPC_CREAT|0666);/* MSGKEY為約定的消息隊(duì)列關(guān)鍵字,訪問控制權(quán)限為0666 */buf.mtype=1;/* 請(qǐng)求進(jìn)程發(fā)送消息標(biāo)識(shí)為1 */buf.text=pid=getpid();/* 請(qǐng)求進(jìn)程發(fā)
8、送消息內(nèi)容為進(jìn)程標(biāo)識(shí) */msgsnd(qid,&buf,sizeof(buf.text), IPC_NOWAIT|04000);/* 發(fā)送消息正文長(zhǎng)度為buf的大小 */msgrcv(qid,&buf,512,pid,MSG_NOERROR);/* 指定接收mtype=pid的信息,即請(qǐng)求進(jìn)程發(fā)送給服務(wù)器處理后的信息 */printf("Request received a massags from server, type is: %dn",buf.mtype);#include "msgcom.h"main()/* 服務(wù)器進(jìn)程 */
9、struct msgtype buf;int qid;if(qid=msgget(MSGKEY,IPC_CREAT|0666)= -1)return(-1); /* 出錯(cuò)處理 */while(1)msgrcv(qid,&buf,512,1,MSG_NOERROR);/* 接收所有請(qǐng)求進(jìn)程發(fā)送的消息 */printf("Server receive a request from process %dn",buf.text);buf.mtype=buf.text;/* 將請(qǐng)求進(jìn)程的標(biāo)識(shí)數(shù)作為mtype的值,以便于請(qǐng)求進(jìn)程識(shí)別 */msgsnd(qid,&buf,
10、sizeof(int),IPC_NOWAIT|04000);/* 將消息發(fā)送給請(qǐng)求進(jìn)程 */3、共享內(nèi)存機(jī)制#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/shm.h>#include <stdio.h>#define SHMKEY 18001 /* 共享內(nèi)存關(guān)鍵字 */#define SHMKEY2 18002#define SIZE 1024 /* 共享內(nèi)存長(zhǎng)度 */#define SEMKEY1 19001 /* 信號(hào)燈組1關(guān)
11、鍵字 */#define SEMKEY2 19002 /* 信號(hào)燈組2關(guān)鍵字 */#define SEMKEY3 19003 /* 信號(hào)燈組3關(guān)鍵字 */static void semcall(sid,op)int sid,op;struct sembuf sb;sb.sem_num = 0;/* 信號(hào)燈編號(hào)0 */sb.sem_op = op;/* 信號(hào)燈操作數(shù)加1或減1 */sb.sem_flg = 0;/* 操作標(biāo)志 */if(semop(sid,&sb,1) = -1)perror("semop"); /* 出錯(cuò)處理 */;int creatsem(key)
12、 /* 信號(hào)燈組創(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個(gè)關(guān)鍵字為1的信號(hào)燈組,訪問控制權(quán)限為0666 */perror("semget"); /* 出錯(cuò)處理 */arg.val=1;/* 初值為1 */if(semctl(sid,0,SETVAL,arg)=-1)/* 將信號(hào)燈組的第一個(gè)信號(hào)燈的初值置1 */
13、perror("semctl"); /* 出錯(cuò)處理 */return(sid);void P(sid)int sid;semcall(sid,-1); /*對(duì)關(guān)鍵字為sid信號(hào)燈組值減1,相當(dāng)于wait */void V(sid)int sid;semcall(sid,1); /*對(duì)關(guān)鍵字為sid信號(hào)燈組值加1,相當(dāng)于signal */main()char *segaddr,*segaddr2;int segid,segid2,sid1,sid2,sid3; if(segid=shmget(SHMKEY,SIZE,IPC_CREAT|0666)=-1) /* 創(chuàng)建共享內(nèi)存段
14、 */perror("shmget"); /* 出錯(cuò)處理 */if(segid2=shmget(SHMKEY2,SIZE,IPC_CREAT|0666)=-1) /* 創(chuàng)建共享內(nèi)存段2 */perror("shmget"); /* 出錯(cuò)處理 */ segaddr=shmat(segid,0,0); /* 將共享內(nèi)存映射到進(jìn)程數(shù)據(jù)空間 */segaddr2=shmat(segid2,0,0); /* 將共享內(nèi)存2映射到進(jìn)程數(shù)據(jù)空間 */sid1=creatsem(SEMKEY1); /* 創(chuàng)建三個(gè)信號(hào)燈,初值為1 */sid2=creatsem(SEMKE
15、Y2);sid3=creatsem(SEMKEY3);P(sid2); /* 置信號(hào)燈2值為0,表示緩沖區(qū)1空 */P(sid3); /* 置信號(hào)燈3值為0,表示緩沖區(qū)2空 */if(!fork()if(!fork()while(1) /* 子進(jìn)程的子進(jìn)程,接收和輸出 */P(sid3);printf("Received from Parent: %sn",segaddr2);printf("Received from Grandparent: %sn",segaddr);V(sid1);while(1)/* 子進(jìn)程,輸入和存儲(chǔ) */ P(sid2);scanf("%s",segaddr2);V(sid3);while(1) /* 父進(jìn)程,輸入和存儲(chǔ)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建省東山縣第二中學(xué)2025屆化學(xué)高二下期末聯(lián)考試題含解析
- 校外培訓(xùn)用戶管理辦法
- 極端氣候預(yù)警管理辦法
- 沖擊地壓防治管理辦法
- 作戰(zhàn)數(shù)據(jù)存儲(chǔ)管理辦法
- 河南省核查員管理辦法
- 兵棋推演中的智能決策技術(shù):基于大語言模型的探索與應(yīng)用
- 星級(jí)管理辦法舉措建議
- 江蘇沛縣公墓管理辦法
- 合肥廠區(qū)定位管理辦法
- 企業(yè)消防安全責(zé)任制模板
- 2025屆黑龍江省哈爾濱四十七中學(xué)七年級(jí)英語第二學(xué)期期末統(tǒng)考試題含答案
- 人工智能通識(shí)課程開課方案
- 2025-2030中國(guó)智慧政務(wù)行業(yè)發(fā)展策略及投資潛力預(yù)測(cè)報(bào)告
- 【中考真題】2025年福建中考數(shù)學(xué)真題試卷(含解析)
- 2025年四川省宜賓市中考數(shù)學(xué)真題試卷及答案解析
- 2025年時(shí)事政治考試題及答案(300題)
- 楊浦區(qū)“十五五”規(guī)劃綱要及專項(xiàng)規(guī)劃編制工作方案
- 2025年中國(guó)氧化鎂項(xiàng)目投資計(jì)劃書
- T/CIE 186-2023業(yè)務(wù)研發(fā)安全運(yùn)營(yíng)一體化能力成熟度模型
- 2025屆內(nèi)蒙古自治區(qū)呼和浩特市七年級(jí)數(shù)學(xué)第二學(xué)期期末檢測(cè)試題含解析
評(píng)論
0/150
提交評(píng)論