




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
UNIX進程間通信第一節(jié)進程通信的基本概念進程通信包括控制資訊傳遞和大批量資訊傳遞.1.通信方式1)主從式-----通信進程間有主從之分。2)會話式-----用請求/服務(wù)方式完成通信。3)平等方式——通過消息緩衝或郵箱完成通信;或通過共用緩衝區(qū)通信。2.Unix中的進程通信基本通信:用於傳遞進程間的控制資訊;管道通信:將管道檔作為通信的介質(zhì),傳遞進程間的資訊;IPC(InterProcessCommuation)通信:用於進程間大量的數(shù)據(jù)傳送。第二節(jié)UNIX的基本進程通信鎖檔通信通信進程雙方在某個指定目錄中(通常會是/tmp目錄)查找是否有一個雙方約定好的鎖檔存在,存在時完成一種處理,不存在時完成另一種操作。記錄鎖定檔通信記錄檔中連續(xù)存儲的位元組組成的特定數(shù)據(jù)段或數(shù)據(jù)區(qū)。實現(xiàn):使用UNIX中已有的一個加鎖程式。方式建議型鎖定強制型鎖定常用操作方法:系統(tǒng)調(diào)用fcntl及庫函數(shù)lockf3.信號通信信號進程中非同步發(fā)生事件的提示資訊。UNIX進程通信中可使用的信號已做了預(yù)先的內(nèi)部約定。查看各信號的描述說明:man命令或在頭檔<sys/signal.h>中。信號的作用用於進程間的同步和互斥進程的條件執(zhí)行信號的發(fā)送編程級的:系統(tǒng)調(diào)用kill(pid,sig)Shell命令級的:kill命令注:普通用戶只能向自己創(chuàng)建的進程發(fā)送信號;超戶可以向任意進程發(fā)送信號。信號的捕獲和處理系統(tǒng)調(diào)用signal(sig,func())功能:為sig信號註冊指定的處理函數(shù)func三種取值:SIG-IGN:忽略所接收信號SIG-DFL:恢復(fù)對信號的缺省處理函數(shù)名:自定義函數(shù)/*test_signal.c*/#include<signal.h>main(){voidcatchint();
inti;
signal(SIGINT,catchint());for(i=1;i<5;i++){printf(“sleepcall#%d\n”,i);
sleep(1);}
printf(“Exiting.\n”);exit(0);}voidcatchint(intsigno){/*signal(SIGINT,SIG_IGN);*/
printf(“\nCATCHINT:signo=%d;”,signo);
printf(“Return.\n”);}1)執(zhí)行中不用delete或^c鍵打斷%test_signalsleepcall#1……sleepcall#4Exiting./*test_signal.c*/#include<signal.h>main(){voidcatchint();
inti;signal(SIGINT,catchint());for(i=1;i<5;i++){printf(“sleepcall#%d\n”,i);
sleep(1);}
printf(“Exiting.\n”);exit(0);}voidcatchint(intsigno){
printf(“\nCATCHINT:signo=%d;”,signo);
printf(“Return.\n”);}2)在第二次迴圈後按了delete鍵;%test_signalsleepcall#1sleepcall#2CATCHINT:signo=2;Return.sleepcall#3sleepcall#4Exiting./*test_signal.c*/#include<signal.h>main(){voidcatchint();
inti;signal(SIGINT,catchint());for(i=1;i<5;i++){printf(“sleepcall#%d\n”,i);
sleep(1);}
printf(“Exiting.\n”);exit(0);}voidcatchint(intsigno){
printf(“\nCATCHINT:signo=%d;”,signo);
printf(“Return.\n”);}3)第二次迴圈後按了delete鍵,第三次又按了delete鍵。%test_signalsleepcall#1sleepcall#2CATCHINT:signo=2;Return.sleepcall#3
signal(SIGINT,catchint());信號複位:信號處理函數(shù)僅用一次,處理過一次後恢復(fù)到默認處理程式狀態(tài)。第三節(jié)管道通信管道UNIX中的一種先進先出(FIFO)的特殊檔管道的讀寫依然使用read、write系統(tǒng)調(diào)用管道讀出寫入寫管道與寫檔的區(qū)別寫管道總在管道的末尾寫;寫檔可以通過調(diào)整檔指針在任意位置寫。寫管道每次寫入的位元組數(shù)受系統(tǒng)參數(shù)限制。設(shè)備忙時,write會被阻塞延遲執(zhí)行。寫一個沒有以寫方式打開的管道,將生成SIGPIPE信號,error置為EPIPE。讀管道與讀檔的區(qū)別讀管道總從管道的當(dāng)前位置讀;讀檔支持檔指針的移動。當(dāng)管道中無資訊時read系統(tǒng)調(diào)用被阻塞;讀空文件返回空串。若管道未被其他進程以寫方式打開,就對管道進行read,返回0值。無名管道創(chuàng)建方法:Shell命令級的:|管道符編程級的:intfds[2];
intpipe(fds);使用fds[0]讀取管道中的數(shù)據(jù);使用fds[1]往管道中寫入數(shù)據(jù)。應(yīng)用場合:父子進程間通信示例/*用管道將數(shù)據(jù)從父進程傳遞到子進程*/#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sting.h>#defineBUFSIZ512main(intargc,char*argv[]){int
fds[2];staticcharmessage[BUFSIZ];if(argc!=2){
fprintf(stderr,”Usage:%smessage\n”,*argv);
exit(1);}if(pipe(fds)==-1){
perror(“pipe”);exit(2);}switch(fork()){case-1:perror(“forkerror.”);
exit(3);case0:close(fds[1]);
if(read(fds[0],message,BUFSIZ)!=-1){ printf(“Messagereceivedbychild:[%s]\n”,message); fflush(stdout); }else{perror(“Readerror”); exit(4); } break;default:
close(fds[0]);
if(write(fds[1],argv[1],strlen(argv[1]))!=-1){printf("Messagesentbyparent:[%s]\n",argv[1]);
fflush(stdout);
}else{
perror("write");
exit(5);}
}exit(0);}%a.out"messageisabc"Messagereceivedbychild:[messageisabc]Messagesentbyparent:[messageisabc]有名管道特點生成時在檔系統(tǒng)中生成一個目錄表項;允許兩個獨立的進程借此進行通信。創(chuàng)建方法:shell命令級的:mknod命令例:%mknodPFILEp管道檔案名表示生成一個管道檔創(chuàng)建方法(續(xù))庫函數(shù)popen()
管道檔案名訪問許可權(quán)典型用法:……mknod(path,S_IFIFO|mode,0);……fd=open(path,0);……read(fd,buf,PIPE_BUF);……編程級的:系統(tǒng)調(diào)用mknod()第四節(jié)SystemVIPCSystemVIPC的三種通信機制消息佇列(messagequeue)進程間分類格式化的數(shù)據(jù)傳送。共用記憶體(sharedmemory)通過共用同一塊記憶體空間實現(xiàn)進程間通信。信號燈(semaphore)多個進程在一組信號燈上同步。相關(guān)知識IPC識別字每個SystemVIPC對象都有一個,對本類IPC對象唯一。key_t鍵三種類型的SystemVIPC使用key_t值作為它們的名字;<sys/types.h>把key_t定義為一個整數(shù),通常由一個進程相關(guān)或用戶相關(guān)的唯一的字串通過ftok函數(shù)生成。內(nèi)核中的消息佇列結(jié)構(gòu)消息機制提供的系統(tǒng)調(diào)用msgget:返回消息描述符,用於創(chuàng)建或指定一消息佇列msgqid=msgget(key,msgflg)key_tkey;/*關(guān)鍵字*/intmsgflg;/*get的標(biāo)誌及許可權(quán)*/msgsnd:發(fā)送消息,成功返回0,出錯為-1msgsnd(msgqid,msgp,msgsz,msgflg)intmsgqid;/*消息描述符*/structmsgbuf*msgp;
/*消息類型和字元數(shù)組的指針*/intmsgsz,msgflg;/*
msgsz是數(shù)組大小,msgflg是同步標(biāo)識*/msgrcv:接受消息msgrcv(msgqid,msgp,msgsz,msgtype,msgflg)intmsgqid;structmsgbug*msgp;intmsgsz;longmsgtype;
/*用戶想要讀出消息的類型*/intmsgflg;msgctl:查詢、設(shè)置或刪除消息描述符的狀態(tài)msgctl(msgqid,cmd,buf)intmsgqid,cmd;/*cmd是規(guī)定命令的類型:IPC_STAT、IPC_SET或IPC_RMID*/msgqid_ds*buf;/*用戶數(shù)據(jù)結(jié)構(gòu)的地址*/相關(guān)的頭檔:sys/types.h sys/ipc.h sys/msg.h相關(guān)管理命令ipcs命令ipcrm命令系統(tǒng)調(diào)用的使用關(guān)係和順序:首先用msgget建立或打開一個消息佇列,得到msgqid。例:msgqid=msgget(MSGKEY,0777)然後,用上述獲得的msgqid調(diào)用msgsnd和msgrcv發(fā)送和接受消息?;?,調(diào)用msgctl
來設(shè)置或獲取消息佇列屬性、或刪除該消息佇列。例:客戶進程和服務(wù)進程用消息機制進行資訊通信/*msg-client.c*/#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#defineMSGKEY75structmsgform{longmtype;charmtext[256];};main(){structmsgformmsg;
intmsgqid,pid,*pint;
msgqid=msgget(MSGKEY,0777);pid=getpid();printf(“client:pid=%d\n”,pid);pint=(int*)msg.mtext;*pint=pid;msg.mtype=1;msgsnd(msgqid,&msg,sizeof(int),0);msgrcv(msgqid,&msg,256,pid,0);printf(“client:receivefrompid%d\n”,*pint);}/*msg-server.c*/#inclide<sys/types.h>#inclide<sys/ipc.h>#inclide<sys/msg.h>#defineMSGKEY75structmsgform{longmtype;charmtext[256];}msg;
intmsgqid;main(){inti,pid,*pint;externcleanup();for(i=0;i<23;i++)signal(i,cleanup);sgqid=msgget(MSGKEY,0777|IPC_CREAT);
printf(“server:pid=%d\n”,getpid());for(;;){
msgrcv(msgqid,&msg,256,1,0);pint=(int*)msg.mtext;pid=*pint;
printf(“server:receivefrompid%d\n”,pid);msg.mtype=pid;*pint=getpid();
sgsnd(msgqid,&msg,sizeof(int),0);
}}cleanup()
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 如何與家教簽訂2025年的合同或協(xié)議
- 2025合作伙伴協(xié)議合同范本
- 2025年個人影像技術(shù)制作的合同范本示例
- 《生育與健康》課件
- 2025購銷合同范本3
- 2025貨車買賣合同樣本模板
- 2025年度機械設(shè)備采購合同專業(yè)版
- 2025國內(nèi)租賃合同模板
- 《課件傳播的途徑與策略》
- 諾貝爾生平創(chuàng)見課件
- 青馬工程筆試試題及答案
- 豆粕交易合同協(xié)議
- 項目設(shè)計安全管理制度
- 電子化采購招投標(biāo)平臺系統(tǒng)建設(shè)項目解決方案
- 小學(xué)京劇知識
- 鐵塔土建施工方案
- 2025年演出經(jīng)紀人《演出市場政策與經(jīng)紀實務(wù)》考前點題卷一
- GB/T 45235-2025電子電氣產(chǎn)品中雙酚A的測定高效液相色譜法
- 2025年度祠堂宗教用品銷售承包合同3篇
- 2024旅行社與境外旅游機構(gòu)入境合作框架協(xié)議范本3篇
- 《人文地理學(xué)》宗教地理與宗教景觀
評論
0/150
提交評論