UNIX進(jìn)程間通信課件_第1頁(yè)
UNIX進(jìn)程間通信課件_第2頁(yè)
UNIX進(jìn)程間通信課件_第3頁(yè)
UNIX進(jìn)程間通信課件_第4頁(yè)
UNIX進(jìn)程間通信課件_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

UNIX進(jìn)程間通信第一節(jié)進(jìn)程通信的基本概念進(jìn)程通信包括控制信息傳遞和大批量信息傳遞.1.通信方式1)主從式-----通信進(jìn)程間有主從之分。2)會(huì)話式-----用請(qǐng)求/服務(wù)方式完成通信。3)平等方式——通過(guò)消息緩沖或郵箱完成通信;或通過(guò)共享緩沖區(qū)通信。2.Unix中的進(jìn)程通信基本通信:用于傳遞進(jìn)程間的控制信息;管道通信:將管道文件作為通信的介質(zhì),傳遞進(jìn)程間的信息;IPC(InterProcessCommuation)通信:用于進(jìn)程間大量的數(shù)據(jù)傳送。第二節(jié)UNIX的基本進(jìn)程通信鎖文件通信通信進(jìn)程雙方在某個(gè)指定目錄中(通常會(huì)是/tmp目錄)查找是否有一個(gè)雙方約定好的鎖文件存在,存在時(shí)完成一種處理,不存在時(shí)完成另一種操作。記錄鎖定文件通信記錄文件中連續(xù)存儲(chǔ)的字節(jié)組成的特定數(shù)據(jù)段或數(shù)據(jù)區(qū)。實(shí)現(xiàn):使用UNIX中已有的一個(gè)加鎖程序。方式建議型鎖定強(qiáng)制型鎖定常用操作方法:系統(tǒng)調(diào)用fcntl及庫(kù)函數(shù)lockf3.信號(hào)通信信號(hào)進(jìn)程中異步發(fā)生事件的提示信息。UNIX進(jìn)程通信中可使用的信號(hào)已做了預(yù)先的內(nèi)部約定。查看各信號(hào)的描述說(shuō)明:man命令或在頭文件<sys/signal.h>中。信號(hào)的作用用于進(jìn)程間的同步和互斥進(jìn)程的條件執(zhí)行信號(hào)的發(fā)送編程級(jí)的:系統(tǒng)調(diào)用kill(pid,sig)Shell命令級(jí)的:kill命令注:普通用戶只能向自己創(chuàng)建的進(jìn)程發(fā)送信號(hào);超戶可以向任意進(jìn)程發(fā)送信號(hào)。信號(hào)的捕獲和處理系統(tǒng)調(diào)用signal(sig,func())功能:為sig信號(hào)注冊(cè)指定的處理函數(shù)func三種取值:SIG-IGN:忽略所接收信號(hào)SIG-DFL:恢復(fù)對(duì)信號(hào)的缺省處理函數(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());信號(hào)復(fù)位:信號(hào)處理函數(shù)僅用一次,處理過(guò)一次后恢復(fù)到默認(rèn)處理程序狀態(tài)。第三節(jié)管道通信管道UNIX中的一種先進(jìn)先出(FIFO)的特殊文件管道的讀寫(xiě)依然使用read、write系統(tǒng)調(diào)用管道讀出寫(xiě)入寫(xiě)管道與寫(xiě)文件的區(qū)別寫(xiě)管道總在管道的末尾寫(xiě);寫(xiě)文件可以通過(guò)調(diào)整文件指針在任意位置寫(xiě)。寫(xiě)管道每次寫(xiě)入的字節(jié)數(shù)受系統(tǒng)參數(shù)限制。設(shè)備忙時(shí),write會(huì)被阻塞延遲執(zhí)行。寫(xiě)一個(gè)沒(méi)有以寫(xiě)方式打開(kāi)的管道,將生成SIGPIPE信號(hào),error置為EPIPE。讀管道與讀文件的區(qū)別讀管道總從管道的當(dāng)前位置讀;讀文件支持文件指針的移動(dòng)。當(dāng)管道中無(wú)信息時(shí)read系統(tǒng)調(diào)用被阻塞;讀空文件返回空串。若管道未被其他進(jìn)程以寫(xiě)方式打開(kāi),就對(duì)管道進(jìn)行read,返回0值。無(wú)名管道創(chuàng)建方法:Shell命令級(jí)的:|管道符編程級(jí)的:intfds[2];

intpipe(fds);使用fds[0]讀取管道中的數(shù)據(jù);使用fds[1]往管道中寫(xiě)入數(shù)據(jù)。應(yīng)用場(chǎ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)中生成一個(gè)目錄表項(xiàng);允許兩個(gè)獨(dú)立的進(jìn)程借此進(jìn)行通信。創(chuàng)建方法:shell命令級(jí)的:mknod命令例:%mknodPFILEp管道文件名表示生成一個(gè)管道文件創(chuàng)建方法(續(xù))庫(kù)函數(shù)popen()

管道文件名訪問(wèn)權(quán)限典型用法:……mknod(path,S_IFIFO|mode,0);……fd=open(path,0);……read(fd,buf,PIPE_BUF);……編程級(jí)的:系統(tǒng)調(diào)用mknod()第四節(jié)SystemVIPCSystemVIPC的三種通信機(jī)制消息隊(duì)列(messagequeue)進(jìn)程間分類格式化的數(shù)據(jù)傳送。共享內(nèi)存(sharedmemory)通過(guò)共享同一塊內(nèi)存空間實(shí)現(xiàn)進(jìn)程間通信。信號(hào)燈(semaphore)多個(gè)進(jìn)程在一組信號(hào)燈上同步。相關(guān)知識(shí)IPC標(biāo)識(shí)符每個(gè)SystemVIPC對(duì)象都有一個(gè),對(duì)本類IPC對(duì)象唯一。key_t鍵三種類型的SystemVIPC使用key_t值作為它們的名字;<sys/types.h>把key_t定義為一個(gè)整數(shù),通常由一個(gè)進(jìn)程相關(guān)或用戶相關(guān)的唯一的字符串通過(guò)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,出錯(cuò)為-1msgsnd(msgqid,msgp,msgsz,msgflg)intmsgqid;/*消息描述符*/structmsgbuf*msgp;

/*消息類型和字符數(shù)組的指針*/intmsgsz,msgflg;/*

msgsz是數(shù)組大小,msgflg是同步標(biāo)識(shí)*/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建立或打開(kāi)一個(gè)消息隊(duì)列,得到msgqid。例:msgqid=msgget(MSGKEY,0777)然后,用上述獲得的msgqid調(diào)用msgsnd和msgrcv發(fā)送和接受消息?;?,調(diào)用msgctl

來(lái)設(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論