版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)三 進(jìn)程通信一. 實(shí)驗(yàn)學(xué)時與類型學(xué)時:2,課外學(xué)時:自定實(shí)驗(yàn)類型:設(shè)計(jì)性實(shí)驗(yàn)二. 實(shí)驗(yàn)?zāi)康牧私釲inux的軟中斷、管道、消息隊(duì)列、共享存儲區(qū)等進(jìn)程間通信方式。三. 實(shí)驗(yàn)內(nèi)容1. 軟中斷通信機(jī)制(1) 請編寫一個程序:循環(huán)輸出“how are you?”,在按下Ctrl+C后中斷顯示,輸出“Byebye!”后退出程序。#include#includeint k=1;void int_func(int sig) /軟中斷處理函數(shù) k=0; Int main() signal(SIGINT,int_func);/預(yù)置軟中斷信號處理函數(shù) While(k=1) Printf(“how are you
2、?n”); Printf(“byebye!”);(2) 使用信號機(jī)制實(shí)現(xiàn)父子進(jìn)程同步,父進(jìn)程先輸出A,然后子進(jìn)程輸出B。#include#includeint k=1;void func(int sig) k=0; main() int pid; pid=fork(); if(pid0) printf(“An”); kill(pid,12); else if(pid=0) signal(12,func); while(k=1) sleep(1); printf(“Bn”); 2. 管道機(jī)制(1) 父子進(jìn)程通過管道傳送一串字符。要求:子進(jìn)程隨機(jī)從鍵盤輸入一串字符,通過管道發(fā)給父進(jìn)程,父進(jìn)程從管道
3、中將消息讀出并顯示出來。#include#includemain() int pid, fd2 ; char outpipe50, inpipe50; pipe(fd); pid=fork(); if (pid=0) Printf(“please input some message:n”); Fgets(inpipe,sizeof(inpipe),stdin);write(fd1,inpipe,50); else if (pid0); wait(0); Printf(“father get this message:n”); read(fd0,outpipe,50); printf(“%sn
4、”,outpipe); (2)父子進(jìn)程通過管道互相發(fā)送字符串。要求:子進(jìn)程向父進(jìn)程通過管道發(fā)送”I am child.”,父進(jìn)程回送”I am father.”,父子進(jìn)程將各自收到的字符串顯示在屏幕上。#inlcude#include#includemain() int pid, fd2 ; char str150, str250; pipe(fd); pid=fork();if (pid=0) strcpy(str1,”Im child”); write(fd1,str1,strlen(str1);Sleep(1); read(fd0,str2,50); printf(“Child rece
5、ived: %sn”,str2); else if (pid0) read(fd0,str1,50); printf(“Parent received:%sn”,str1); strcpy(str2,”Im father.”); write(fd1,str2,strlen(str2); 3. 消息隊(duì)列機(jī)制(1) 父進(jìn)程及其子進(jìn)程通過一條消息隊(duì)列互相傳送數(shù)據(jù)。#include#include#include#includeint msgqid,qid;struct msg long mtype; char mtext256;pmsg;cancelqueue() msgctl(msgqid,IPC
6、_RMID,0); exit(0);main() int pid; Pid=fork(); If (pid0) msgqid=msgget(75, 0777);printf(“msg id: %dn”,msgqid);pmsg.mtype=1;*(int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);msgrcv(msgqid,&pmsg,256,getpid(),0);printf(“A:receive msg from %dn,*(int *)pmsg.mtext);Else if(pid=0) signal(2,can
7、celqueue);msgqid=msgget(75, 0777|IPC_CREAT);while(1) msgrcv(msgqid,&pmsg,256,1,0);qid=*(int *)pmsg.mtext;printf(“B:receive msg from %dn”,qid);pmsg.mtype=qid;*(int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0); (2) 非父子進(jìn)程之間實(shí)通過一條消息隊(duì)列互相傳遞數(shù)據(jù)。A進(jìn)程:#include#include#include#includestruct msg long
8、 mtype; char mtext256;pmsg;main() int msgqid,pid;msgqid=msgget(75, 0777);printf(“msg id: %dn”,msgqid);pmsg.mtype=1;*(int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);msgrcv(msgqid,&pmsg,256,getpid(),0);printf(“A:receive msg from %dn”,*(int *)pmsg.mtext);B進(jìn)程:#include#include#include#incl
9、udeint msgqid,pid;struct msg long mtype; char mtext256; pmsg;cancelqueue() msgctl(msgqid,IPC_RMID,0); exit(0);main() signal(2,cancelqueue);msgqid=msgget(75, 0777|IPC_CREAT);while(1) msgrcv(msgqid,&pmsg,256,1,0);pid=*(int *)pmsg.mtext;printf(“B:receive msg from %dn”,pid);pmsg.mtype=pid;*(int *)pmsg.m
10、text)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0); 4. 共享內(nèi)存機(jī)制(1) 編程實(shí)現(xiàn)基于共享內(nèi)存的進(jìn)程間通信。要求:進(jìn)程A通過共享內(nèi)存將自己的進(jìn)程號傳遞給進(jìn)程B。A:#include#includemain()int shmid; int *va; shmid=shmget(22,sizeof(*va),0666|IPC_CREAT); va=(int *)shmat(shmid, 0,0); *va=getpid(); printf(“get As pid:%dn”,*va);shmdt(va); B:#include#includemai
11、n() int shmid; int *va; shmid=shmget(22,sizeof(*va),0666|IPC_CREAT); va=(int*)shmat(shmid, 0,0); printf(“As pid is :%dn”,*va); shmdt(va); shmctl(shmid,IPC_RMID,0);(2) 若要通過共享內(nèi)存實(shí)現(xiàn)進(jìn)程A與進(jìn)程B互送進(jìn)程號,可怎樣編程實(shí)現(xiàn)?A:#include#includemain()int shmid; int *va; shmid=shmget(22,sizeof(*va),0666|IPC_CREAT); va=(int *)shm
12、at(shmid, 0,0); *va=getpid();printf(“get As pid:%dn”,*va);Sleep(2);printf(“Bs pid is:%dn”,*va)shmdt(va) B:#include#includemain() int shmid; int *va; shmid=shmget(22,sizeof(*va),0666|IPC_CREAT); va=(int*)shmat(shmid, 0,0); printf(“As pid is :%sn”,*va); *va=getpid(); printf(“get Bs pid:%dn”,*va); shmd
13、t(va); shmctl(shmid,IPC_RMID,0);5. SOCKET進(jìn)程通信(選做)編程實(shí)現(xiàn)基于SOCKET的進(jìn)程間通信,通過網(wǎng)絡(luò)實(shí)現(xiàn)進(jìn)程之間數(shù)據(jù)通信。要求:分別編寫服務(wù)器端和客戶端方程序,運(yùn)行于不同終端,二者可相互進(jìn)行通信。Server:#include #include #include #include #include #include #include int main() int server_sockfd = -1; int client_sockfd = -1; int client_len = 0; struct sockaddr_in server_addr;
14、 struct sockaddr_in client_addr; /創(chuàng)建流套接字 server_sockfd = socket(AF_INET, SOCK_STREAM, 0); /設(shè)置服務(wù)器接收的連接地址和監(jiān)聽的端口 server_addr.sin_family = AF_INET;/指定網(wǎng)絡(luò)套接字 server_addr.sin_addr.s_addr = htonl(INADDR_ANY);/接受所有IP地址的連接 server_addr.sin_port = htons(9736);/綁定到9736端口 /綁定(命名)套接字 bind(server_sockfd,(struct soc
15、kaddr*)&server_addr, sizeof(server_addr); /創(chuàng)建套接字隊(duì)列,監(jiān)聽套接字 listen(server_sockfd, 5); /忽略子進(jìn)程停止或退出信號 signal(SIGCHLD, SIG_IGN); while(1) char ch = 0; client_len = sizeof(client_addr); printf(Server waitingn); /接受連接,創(chuàng)建新的套接字 client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_addr, &client_len)
16、; if(fork() = 0) /子進(jìn)程中,讀取客戶端發(fā)過來的信息,處理信息,再發(fā)送給客戶端 read(client_sockfd, &ch, 1); sleep(5); ch+; write(client_sockfd, &ch, 1); close(client_sockfd); exit(0); else /父進(jìn)程中,關(guān)閉套接字 close(client_sockfd); Client:#include #include #include #include #include #include #include int main() int sockfd = -1; int len =
17、0; struct sockaddr_in address; int result; char ch = A; /創(chuàng)建流套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); /設(shè)置要連接的服務(wù)器的信息 address.sin_family = AF_INET;/使用網(wǎng)絡(luò)套接字 address.sin_addr.s_addr = inet_addr(127.0.0.1);/服務(wù)器地址 address.sin_port = htons(9736);/服務(wù)器所監(jiān)聽的端口 len = sizeof(address); /連接到服務(wù)器 result = connec
18、t(sockfd, (struct sockaddr*)&address, len); if(result = -1) perror(ops:clientn); exit(1); /發(fā)送請求給服務(wù)器 write(sockfd, &ch, 1); /從服務(wù)器獲取數(shù)據(jù) read(sockfd, &ch, 1); printf(char form server = %cn, ch); close(sockfd); exit(0); 四. 思考與總結(jié)(1) 請對比下列程序與實(shí)驗(yàn)1(1)在按下Ctrl+C之后的運(yùn)行現(xiàn)象。int k=1;int main(void) while(k=1) printf(“
19、how are you?n”); printf(“Byebye!n”);(2) 針對實(shí)驗(yàn)2(2),你能否通過信號量機(jī)制來實(shí)現(xiàn)?若能,請給出相應(yīng)代碼及運(yùn)行結(jié)果分析。#include #include #include#include #include #include union semunint val;struct semid_ds *buf;unsigned short *array;arg;/生成信號量int sem_creat(key_t key)int semid;semid = semget(key,1,IPC_CREAT|0666);if (-1 = semid)printf(create semaphore errorn);exit(-1);sem.val = 0;semctl(semid,0,SETVAL,arg);return semid;/刪除信號量void del_sem(int semid)arg.val = 0;semctl(semid,0,IPC_RMID,arg);/pint p(int semid)struct sembuf sops=0,-1,IPC_NOWAIT;retur
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度競業(yè)禁止企業(yè)合規(guī)審查服務(wù)協(xié)議3篇
- 二零二五年度醫(yī)療耗材采購供貨合同模板3篇
- 二零二五年度智能化公司單方解除勞動合同合同3篇
- 2025年度年度知識產(chǎn)權(quán)保護(hù)商標(biāo)轉(zhuǎn)讓合同模板3篇
- 二零二五年度退股風(fēng)險評估與管理協(xié)議3篇
- 2025農(nóng)村土地永久轉(zhuǎn)讓與農(nóng)村基礎(chǔ)設(shè)施建設(shè)合同
- 2025年度養(yǎng)生館合伙人項(xiàng)目投資與管理合同3篇
- 2025年度農(nóng)村土地租賃與農(nóng)業(yè)觀光旅游合作協(xié)議
- 2025年度礦山礦產(chǎn)資源評估與交易合同3篇
- 二零二五年度新材料研發(fā)員工合作協(xié)議書3篇
- 企業(yè)貸款書面申請書
- 人教五年級英語上冊2011版五年級英語上冊《Lesson17》教案及教學(xué)反思
- 交換機(jī)安裝調(diào)試記錄表實(shí)用文檔
- 理性思維作文素材800字(通用范文5篇)
- 應(yīng)急物資清單明細(xì)表
- 房地產(chǎn)估計(jì)第八章成本法練習(xí)題參考
- 《社會主義核心價值觀》優(yōu)秀課件
- 《妊娠期糖尿病患者個案護(hù)理體會(論文)3500字》
- 《小學(xué)生錯別字原因及對策研究(論文)》
- 便攜式氣體檢測報警儀管理制度
- 酒店安全的管理制度
評論
0/150
提交評論