版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省2024-2025學(xué)年高一上學(xué)期百校聯(lián)考語(yǔ)文試卷及答案
- 瘢痕的臨床護(hù)理
- 《計(jì)算機(jī)的存儲(chǔ)系統(tǒng)》課件
- 肛門(mén)及肛周皰疹性疾病的臨床護(hù)理
- 《供用電技術(shù)管理》課件
- 孕期子宮內(nèi)膜脫落的健康宣教
- 《機(jī)械制造基礎(chǔ)》課件-05篇 第七單元 數(shù)控高速切削
- 《隊(duì)列訓(xùn)練教程》課件
- 甲狀旁腺功能亢進(jìn)的臨床護(hù)理
- JJF(陜) 109-2023 直流換流閥試驗(yàn)裝置校準(zhǔn)規(guī)范
- JC∕T 2647-2021 預(yù)拌混凝土生產(chǎn)企業(yè)廢水回收利用規(guī)范
- 五年級(jí)《列那狐的故事》知識(shí)考試題庫(kù)(含答案)
- 售前、售中、售后服務(wù)流程圖
- 湖南省鄉(xiāng)鎮(zhèn)衛(wèi)生院街道社區(qū)衛(wèi)生服務(wù)中心地址醫(yī)療機(jī)構(gòu)名單目錄
- 板坯連鑄機(jī)板坯連鑄機(jī)液壓系統(tǒng)系統(tǒng)課件
- 傳感器與測(cè)試技術(shù)論文
- 試油服務(wù)安全環(huán)保技術(shù)措施
- 小學(xué)道德與法治《我們的好朋友》課件完整版
- 電力工程施工進(jìn)度計(jì)劃和保證工期的措施
- 2021年墨玉縣輔警招聘筆試模擬試題及答案解析
- 上海市2022年楊浦區(qū)初三化學(xué)一模試卷(含答案)
評(píng)論
0/150
提交評(píng)論