實驗三-進(jìn)程通信_第1頁
實驗三-進(jìn)程通信_第2頁
實驗三-進(jìn)程通信_第3頁
實驗三-進(jìn)程通信_第4頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、實驗三進(jìn)程通信一 . 實驗學(xué)時與類型學(xué)時: 2,課外學(xué)時:自定實驗類型:設(shè)計性實驗二 . 實驗?zāi)康牧私?Linux 的軟中斷、管道、消息隊列、共享存儲區(qū)等進(jìn)程間通信方式。三 . 實驗內(nèi)容1. 軟中斷通信機制(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( “

2、how are you?n ” );Printf(“ byebye! ” );(2)使用信號機制實現(xiàn)父子進(jìn)程同步,父進(jìn)程先輸出#include#includeint k=1;void func(int sig) k=0; main()int pid;pid=fork();if(pid0)printf(“ An ” );kill(pid,12);A,然后子進(jìn)程輸出B。else if(pid=0) signal(12,func); while(k=1)sleep(1);printf(“ Bn ”);2. 管道機制(1) 父子進(jìn)程通過管道傳送一串字符。 要求:子進(jìn)程隨機從鍵盤輸入一串字符, 通過管道

3、發(fā)給父進(jìn)程,父進(jìn)程從管道中將消息讀出并顯示出來。#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:nread(fd0,outpipe,50);” );printf

4、(“ %sn” ,outpipe);( 2 )父子進(jìn)程通過管道互相發(fā)送字符串。要求:子進(jìn)程向父進(jìn)程通過管道發(fā)送”child.”,父進(jìn)程回送”I am father.”,父子進(jìn)程將各自收到的字符串顯示在屏幕上。I am#inlcude#include#includemain()int pid, fd2 ;char str150, str250;pipe(fd);pid=fork();if (pid=0)strcpy(str1,”I m child” );write(fd1,str1,strlen(str1);Sleep(1);read(fd0,str2,50);printf(“ Child re

5、ceived: %sn” ,str2);else if (pid0) read(fd0,str1,50);printf(“ Parent received:%sn”,str1);strcpy(str2,” I m father.” );write(fd1,str2,strlen(str2);3. 消息隊列機制(1) 父進(jìn)程及其子進(jìn)程通過一條消息隊列互相傳送數(shù)據(jù)。#include#include#include#includeint msgqid,qid;struct msg long mtype; char mtext256;pmsg;cancelqueue() msgctl(msgqid,I

6、PC_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,

7、cancelqueue);msgqid=msgget(75, 0777|IPC_CREAT);while(1)msgrcv(msgqid,&pmsg,256,1,0);qid=*(int *)pmsg.mtext;printf(“ B:receive msg from %dnpmsg.mtype=qid;*(int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);” ,qid);(2) 非父子進(jìn)程之間實通過一條消息隊列互相傳遞數(shù)據(jù)。A 進(jìn)程:#include#include#include#includestruct msg

8、long 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#in

9、clude#includeint 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 %dnpmsg.mtype=pid;*(int *)pmsg.m

10、text)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);” ,pid);4. 共享內(nèi)存機制(1) 編程實現(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 A s pid:%dn” ,*va);shmdt(va);B:#include#inc

11、ludemain() int shmid; int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(int*)shmat(shmid, 0,0);printf(“ A s pid is :%dn” ,*va);shmdt(va);shmctl(shmid,IPC_RMID,0);(2) 若要通過共享內(nèi)存實現(xiàn)進(jìn)程A 與進(jìn)程 B 互送進(jìn)程號,可怎樣編程實現(xiàn)?#include#includemain()int shmid; int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(int *

12、)shmat(shmid, 0,0);*va=getpid();printf(“ get A s pid:%dn” ,*va);Sleep(2);printf(“ B s 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(“ A s pid is :%sn” ,*va);*va=getpid();printf(“ get B s pid:%dn”

13、,*va);shmdt(va);shmctl(shmid,IPC_RMID,0);5. SOCKET 進(jìn)程通信(選做)編程實現(xiàn)基于 SOCKET的進(jìn)程間通信,通過網(wǎng)絡(luò)實現(xiàn)進(jìn)程之間數(shù)據(jù)通信。要求:分別編寫服務(wù)器端和客戶端方程序,運行于不同終端,二者可相互進(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 serve

14、r_addr;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);/server_addr.sin_port = htons(9736);/綁定到接受所有 9736 端口IP地址的連接/綁定(命名)套接字bind(server_sockfd,(structso

15、ckaddr*)&server_addr,sizeof(server_addr);/ 創(chuàng)建套接字隊列,監(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);if(fork(

16、) = 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 = 0;struct sockaddr_in

17、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 = connect(sockfd, (struct sockaddr*)&ad

18、dress, 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) 請對比下列程序與實驗 1(1) 在按下 Ctrl+C 之后的運行現(xiàn)象。int k=1;int main(void)while(k=1)printf(“ how are you?n” );printf(“Byebye!n” )

19、;(2)針對實驗2(2),你能否通過信號量機制來實現(xiàn)?若能,請給出相應(yīng)代碼及運行結(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;return

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論