進(jìn)程實(shí)驗(yàn)-進(jìn)程間通信(管道、消息、共享內(nèi)存、軟中斷)_第1頁
進(jìn)程實(shí)驗(yàn)-進(jìn)程間通信(管道、消息、共享內(nèi)存、軟中斷)_第2頁
進(jìn)程實(shí)驗(yàn)-進(jìn)程間通信(管道、消息、共享內(nèi)存、軟中斷)_第3頁
進(jìn)程實(shí)驗(yàn)-進(jìn)程間通信(管道、消息、共享內(nèi)存、軟中斷)_第4頁
進(jìn)程實(shí)驗(yàn)-進(jìn)程間通信(管道、消息、共享內(nèi)存、軟中斷)_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

...wd......wd......wd...進(jìn)程實(shí)驗(yàn)3Linux進(jìn)程間通信軟中斷信號的處理,實(shí)現(xiàn)同一用戶的各進(jìn)程之間的通信。相關(guān)的系統(tǒng)調(diào)用kill(pid,sig):發(fā)送信號signal〔sig,func〕:指定進(jìn)程對信號sig的處理行為是調(diào)用函數(shù)func。程序清單#include<unistd.h>#include<stdio.h>#include<signal.h>voidwaiting();voidstop();intwait_mark;main(){ intp1,p2; while((p1=fork())==-1); if(p1>0) { while((p2=fork())==-1); if(p2>0) { printf("parent\n");/*父進(jìn)程在此完成某個操作、或接收到用戶從鍵盤輸入的特殊按鍵命令后發(fā)出下面的信號。這里省略。*/kill(p1,16); kill(p2,17); wait(0); wait(0); printf("parentprocessidkilled!\n"); exit(0); } else/*p2==0*/ { printf("p2\n"); wait_mark=1; signal(17,stop); waiting(); printf("childprocess2iskilledbyparent!\n"); exit(0); } } else/*p1==0*/ { printf("p1\n");wait_mark=1; signal(16,stop); waiting(); printf("childprocess1iskelledbyparent!\n"); exit(0); }}voidwaiting(){while(wait_mark!=0);}voidstop(){wait_mark=0;}輸入并運(yùn)行此程序,分析程序的運(yùn)行結(jié)果。消息的創(chuàng)立、發(fā)送和接收多個進(jìn)程通過訪問一個公共的消息隊(duì)列來交換信息消息隊(duì)列:即消息的一個鏈表任何進(jìn)程都可以向消息隊(duì)列中發(fā)送消息〔消息類型及正文〕,其它進(jìn)程都可以從消息隊(duì)列中根據(jù)類型獲取相應(yīng)的消息相關(guān)的系統(tǒng)調(diào)用頭文件:#include<sys/msg.h>翻開或創(chuàng)立消息隊(duì)列:intmsgget(key_tkey,intmsgflg);key:消息隊(duì)列的鍵IPC_PRIVATE:創(chuàng)立一個私有的消息隊(duì)列其它:可被多個進(jìn)程使用的消息隊(duì)列msgflg:設(shè)置操作類型及訪問權(quán)限IPC_CREAT/IPC_EXCL獲得或設(shè)置消息隊(duì)列屬性:intmsgctl(intmsgid,intcmd,structmsqid_ds*data);發(fā)送消息:intmsgsnd(intmsgid,constvoid*msgp,

size_tmsgsize,intflags);參數(shù)msgid:消息隊(duì)列標(biāo)識符idmsgp:指針,用戶自定義緩沖區(qū),可定義成構(gòu)造體類型,包含兩項(xiàng)longmtype;代表消息類型

charmtext[MTEXTSIZE];消息正文msgsize:要發(fā)送消息正文的長度mflags:標(biāo)志,假設(shè)設(shè)置IPC_NOWAIT那么不等待消息發(fā)出就返回返回值:成功返回0,錯誤返回-1〔置errno〕接收消息intmsgrcv(intmsgid,void*msgp,size_tmtexsize,longmsgtype,intflags);參數(shù):與msgsnd類似msgtype>0:只接收指定類型消息的第一個==0:不管什么消息類型都讀取隊(duì)列中第一個數(shù)據(jù)<0:接收等于或小于其絕對值的最低類型的第一個,如有5、6、17三類,假設(shè)為-6,那么獲取類型5的。返回值成功:返回消息正文字節(jié)數(shù)錯誤:返回-1〔置errno〕程序清單#include<stdio.h>#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineMSGKEY75structmsgform{ longmtype; charmsgtext[1030];}msg;intmsgqid,i;voidCLIENT(){ inti; charstring_i[5];msgqid=msgget(MSGKEY,0777); for(i=10;i>=1;i--) { msg.mtype=i; printf("(client)sent\n");sprintf(msg.msgtext,"thecontentofmessage");sprintf(string_i,"%d",i); strcat(msg.msgtext,string_i); strcat(msg.msgtext,"\n"); msgsnd(msgqid,&msg,1030,0);} exit(0);}voidSERVER(){ msgqid=msgget(MSGKEY,0777|IPC_CREAT); do { msgrcv(msgqid,&msg,1030,0,0); printf("(server)receivedmessage%d\n",msg.mtype);printf(“%s\n",msg.msgtext); }while(msg.mtype!=1); msgctl(msgqid,IPC_RMID,0);exit(0);}main(){ while((i=fork())==-1); if(!i)SERVER(); while((i=fork())==-1); if(!i)CLIENT(); wait(0); wait(0);}編輯并運(yùn)行程序,并分析程序的運(yùn)行結(jié)果。思考題:符號常量MSGKEY有什么作用server和client不使用同一個MSGKEY會出現(xiàn)什么問題程序擴(kuò)展:client和server之間若何通過軟中斷信號控制進(jìn)程的推進(jìn)速度,使得client每發(fā)送一個消息,server就接收一個消息,然后client再發(fā)送下一個消息共享存儲區(qū)的創(chuàng)立、發(fā)送和接收同一系統(tǒng)中的幾個進(jìn)程可共享某塊物理內(nèi)存。include<sys/shm.h>翻開或創(chuàng)立創(chuàng)立共享區(qū):intshmget(key_tkey,size_tsize,intshmflg);參數(shù)key:鍵值IPC_PRIVATE:創(chuàng)立一個私有的shm其它:非IPC_PRIVATE整數(shù)值。size:指明shm的大小,假設(shè)shm已經(jīng)存在,那么size應(yīng)為0shmflg:設(shè)置訪問權(quán)限及IPC_CREAT/IPC_EXCL返回值成功:該shm的id,當(dāng)前進(jìn)程是其擁有者及創(chuàng)立者

錯誤:-1將共享內(nèi)存連接到進(jìn)程中:void*shmat(intshmid,constvoid*shmaddr,intflags);參數(shù)shmid:共享內(nèi)存標(biāo)識符idshmaddr:進(jìn)程映射內(nèi)存段的地址,可指定,但一般設(shè)為NULL表示由系統(tǒng)安排。flags:對該內(nèi)存的段設(shè)置是否只讀 (SHM_RDONLY),默認(rèn)是讀寫。返回值成功:進(jìn)程中該內(nèi)存段的地址錯誤:-1程序清單:#include<stdio.h>#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#defineSHMKEY75intshmid,i;int*addr;voidCLIENT(){ inti;shmid=shmget(SHMKEY,1024,0777); addr=shmat(shmid,0,0); for(i=5;i>=0;i--) { while(*addr!=-1); printf("(client)sent,"); *addr=i;printf("clienti:%d\n",i); } exit(0);}voidSERVER(){ shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); addr=shmat(shmid,0,0); do { *addr=-1; while(*addr==-1); printf("(server)received,"); printf("server*addr%d\n",*addr); }while(*addr); shmctl(shmid,IPC_RMI

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論