版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
UNIX進(jìn)程間通信第一節(jié)進(jìn)程通信的基本概念進(jìn)程通信包括控制信息傳遞和大批量信息傳遞.1.通信方式1)主從式-----通信進(jìn)程間有主從之分。2)會話式-----用請求/服務(wù)方式完成通信。3)平等方式——通過消息緩沖或郵箱完成通信;或通過共享緩沖區(qū)通信。2.Unix中的進(jìn)程通信基本通信:用于傳遞進(jìn)程間的控制信息;管道通信:將管道文件作為通信的介質(zhì),傳遞進(jìn)程間的信息;IPC(InterProcessCommuation)通信:用于進(jìn)程間大量的數(shù)據(jù)傳送。第二節(jié)UNIX的基本進(jìn)程通信鎖文件通信通信進(jìn)程雙方在某個指定目錄中(通常會是/tmp目錄)查找是否有一個雙方約定好的鎖文件存在,存在時(shí)完成一種處理,不存在時(shí)完成另一種操作。記錄鎖定文件通信記錄文件中連續(xù)存儲的字節(jié)組成的特定數(shù)據(jù)段或數(shù)據(jù)區(qū)。實(shí)現(xiàn):使用UNIX中已有的一個加鎖程序。方式建議型鎖定強(qiáng)制型鎖定常用操作方法:系統(tǒng)調(diào)用fcntl及庫函數(shù)lockf3.信號通信信號進(jìn)程中異步發(fā)生事件的提示信息。UNIX進(jìn)程通信中可使用的信號已做了預(yù)先的內(nèi)部約定。查看各信號的描述說明:man命令或在頭文件<sys/signal.h>中。信號的作用用于進(jìn)程間的同步和互斥進(jìn)程的條件執(zhí)行信號的發(fā)送編程級的:系統(tǒng)調(diào)用kill(pid,sig)Shell命令級的:kill命令注:普通用戶只能向自己創(chuàng)建的進(jìn)程發(fā)送信號;超戶可以向任意進(jìn)程發(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)在第二次循環(huán)后按了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)第二次循環(huán)后按了delete鍵,第三次又按了delete鍵。%test_signalsleepcall#1sleepcall#2CATCHINT:signo=2;Return.sleepcall#3
signal(SIGINT,catchint());信號復(fù)位:信號處理函數(shù)僅用一次,處理過一次后恢復(fù)到默認(rèn)處理程序狀態(tài)。第三節(jié)管道通信管道UNIX中的一種先進(jìn)先出(FIFO)的特殊文件管道的讀寫依然使用read、write系統(tǒng)調(diào)用管道讀出寫入寫管道與寫文件的區(qū)別寫管道總在管道的末尾寫;寫文件可以通過調(diào)整文件指針在任意位置寫。寫管道每次寫入的字節(jié)數(shù)受系統(tǒng)參數(shù)限制。設(shè)備忙時(shí),write會被阻塞延遲執(zhí)行。寫一個沒有以寫方式打開的管道,將生成SIGPIPE信號,error置為EPIPE。讀管道與讀文件的區(qū)別讀管道總從管道的當(dāng)前位置讀;讀文件支持文件指針的移動。當(dāng)管道中無信息時(shí)read系統(tǒng)調(diào)用被阻塞;讀空文件返回空串。若管道未被其他進(jìn)程以寫方式打開,就對管道進(jìn)行read,返回0值。無名管道創(chuàng)建方法:Shell命令級的:|管道符編程級的:intfds[2];
intpipe(fds);使用fds[0]讀取管道中的數(shù)據(jù);使用fds[1]往管道中寫入數(shù)據(jù)。應(yīng)用場合:父子進(jìn)程間通信示例/*用管道將數(shù)據(jù)從父進(jìn)程傳遞到子進(jìn)程*/#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]有名管道特點(diǎn)生成時(shí)在文件系統(tǒng)中生成一個目錄表項(xiàng);允許兩個獨(dú)立的進(jìn)程借此進(jìn)行通信。創(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的三種通信機(jī)制消息隊(duì)列(messagequeue)進(jìn)程間分類格式化的數(shù)據(jù)傳送。共享內(nèi)存(sharedmemory)通過共享同一塊內(nèi)存空間實(shí)現(xiàn)進(jìn)程間通信。信號燈(semaphore)多個進(jìn)程在一組信號燈上同步。相關(guān)知識IPC標(biāo)識符每個SystemVIPC對象都有一個,對本類IPC對象唯一。key_t鍵三種類型的SystemVIPC使用key_t值作為它們的名字;<sys/types.h>把key_t定義為一個整數(shù),通常由一個進(jìn)程相關(guān)或用戶相關(guān)的唯一的字符串通過ftok函數(shù)生成。內(nèi)核中的消息隊(duì)列結(jié)構(gòu)消息機(jī)制提供的系統(tǒng)調(diào)用msgget:返回消息描述符,用于創(chuàng)建或指定一消息隊(duì)列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建立或打開一個消息隊(duì)列,得到msgqid。例:msgqid=msgget(MSGKEY,0777)然后,用上述獲得的msgqid調(diào)用msgsnd和msgrcv發(fā)送和接受消息。或,調(diào)用msgctl
來設(shè)置或獲取消息隊(duì)列屬性、或刪除該消息隊(duì)列。例:客戶進(jìn)程和服務(wù)進(jìn)程用消息機(jī)制進(jìn)行信息通信/*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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年湘師大新版必修三語文下冊階段測試試卷
- 2025年浙教版七年級生物下冊月考試卷含答案
- 2025年湘教新版選擇性必修3物理上冊階段測試試卷含答案
- 2025年度面料質(zhì)量認(rèn)證與采購合同范本4篇
- 2025版牛羊養(yǎng)殖基地與養(yǎng)殖戶合作銷售合同范本4篇
- 二零二五年度苗圃場租賃與農(nóng)業(yè)生態(tài)保護(hù)合作合同4篇
- 擔(dān)保合同執(zhí)行協(xié)議書(2篇)
- 2025年度模板腳手架租賃與施工一體化合同標(biāo)準(zhǔn)版4篇
- 2025版美容院員工培訓(xùn)與職業(yè)發(fā)展規(guī)劃合同4篇
- 2025年度ICP證年審專項(xiàng)服務(wù)合同4篇
- GB/T 45120-2024道路車輛48 V供電電壓電氣要求及試驗(yàn)
- 春節(jié)文化常識單選題100道及答案
- 華中師大一附中2024-2025學(xué)年度上學(xué)期高三年級第二次考試數(shù)學(xué)試題(含解析)
- 12123交管學(xué)法減分考試題及答案
- 2025年寒假實(shí)踐特色作業(yè)設(shè)計(jì)模板
- 24年追覓在線測評28題及答案
- 高考滿分作文常見結(jié)構(gòu)
- 心肌梗死診療指南
- 食堂項(xiàng)目組織架構(gòu)圖
- 原油脫硫技術(shù)
- GB/T 2518-2019連續(xù)熱鍍鋅和鋅合金鍍層鋼板及鋼帶
評論
0/150
提交評論