第2章 進(jìn)程管理4-進(jìn)程通信_(tái)第1頁(yè)
第2章 進(jìn)程管理4-進(jìn)程通信_(tái)第2頁(yè)
第2章 進(jìn)程管理4-進(jìn)程通信_(tái)第3頁(yè)
第2章 進(jìn)程管理4-進(jìn)程通信_(tái)第4頁(yè)
第2章 進(jìn)程管理4-進(jìn)程通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩38頁(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)介

第2章進(jìn)程管理本章主要內(nèi)容進(jìn)程的概念進(jìn)程狀態(tài)及轉(zhuǎn)換進(jìn)程控制及調(diào)度線程進(jìn)程互斥與同步進(jìn)程通信死鎖進(jìn)程通信進(jìn)程通信低級(jí)通信:傳遞控制信號(hào)高級(jí)通信:傳遞數(shù)據(jù)軟中斷信號(hào)量共享存儲(chǔ)區(qū)消息傳遞管道(文件)socket直接:消息緩沖隊(duì)列間接:信箱在進(jìn)程之間進(jìn)行信息交換,包括傳遞信號(hào)和數(shù)據(jù)。請(qǐng)自行閱讀教材P55-58關(guān)于進(jìn)程通信的一般性介紹Linux進(jìn)程s通信4軟中斷機(jī)制信號(hào)量機(jī)制(略)無(wú)名管道機(jī)制消息隊(duì)列機(jī)制共享存儲(chǔ)區(qū)機(jī)制Linux軟中斷通信5軟中斷是對(duì)硬件中斷的一種模擬。發(fā)送軟中斷就是向接收進(jìn)程的task_struct結(jié)構(gòu)中的相應(yīng)項(xiàng)發(fā)送一個(gè)信號(hào)。接收進(jìn)程在收到軟中斷信號(hào)后,將按照事先的規(guī)定去執(zhí)行一個(gè)軟中斷處理程序。軟中斷號(hào)發(fā)送后不會(huì)立即調(diào)相應(yīng)處理程序,而是必須等到接收進(jìn)程執(zhí)行時(shí)才生效。進(jìn)程也可以給自己發(fā)送軟中斷信號(hào),以便在某些特殊情況下能轉(zhuǎn)入規(guī)定好的處理程序。6Linux軟中斷信號(hào)Linux常見(jiàn)軟中斷信號(hào)類型,可以使用kill-l

查看。7格式:signal(sig,function)sig—系統(tǒng)給定的軟中斷信號(hào)中的序號(hào)或名稱function—與軟中斷信號(hào)關(guān)聯(lián)的處理函數(shù)名,當(dāng)進(jìn)程在運(yùn)行過(guò)程中捕捉到指定的軟中斷信號(hào)后,中斷當(dāng)前程序的執(zhí)行轉(zhuǎn)到該函數(shù)執(zhí)行。注意:軟中斷信號(hào)必須提前預(yù)置,然后才可以在程序運(yùn)行中捕獲。軟中斷信號(hào)預(yù)置函數(shù)signal()8格式:intkill(pid,sig)pid—進(jìn)程(組)標(biāo)識(shí)符:當(dāng)pid>0時(shí),將信號(hào)發(fā)給指定pid的進(jìn)程;當(dāng)pid=0時(shí),將信號(hào)發(fā)給同組所有進(jìn)程;當(dāng)pid=-1時(shí),將信號(hào)發(fā)給內(nèi)存所有進(jìn)程;當(dāng)pid<0時(shí),將信號(hào)發(fā)給進(jìn)程組識(shí)別碼為|pid|的所有進(jìn)程。sig—軟中斷信號(hào)的序號(hào)或名稱功能:向指定進(jìn)程發(fā)軟中斷信號(hào)sig頭文件:<sys/types.h>,<signal.h>發(fā)送軟中斷信號(hào)函數(shù)kill9[例1]編一程序?qū)崿F(xiàn)循環(huán)顯示字符串“Hello!”,當(dāng)鍵盤鍵入Ctrl+C時(shí)終止循環(huán),顯示“OK!”后結(jié)束。分析:Ctrl+C對(duì)應(yīng)的軟中斷信號(hào)SIGINT(序號(hào)為2),對(duì)應(yīng)處理函數(shù)需終止循環(huán)顯示。軟中斷例1intk=1;voidmain(void){while(k==1)printf("Hello!\n");//等待鍵入Ctrl+Cprintf(“OK!\n”); }#include<signal.h>voidint_func(intsig) //軟中斷處理函數(shù){k=0;}{signal(SIGINT,int_func);//預(yù)置軟中斷信號(hào)處理函數(shù)}10軟中斷例2[例2]使用軟中斷實(shí)現(xiàn)父子進(jìn)程同步,父進(jìn)程先輸出A,然后子進(jìn)程輸出B。#include<signal.h>intk=1;voidfunc(intsig){k=0;}main(){intpid;pid=fork();if(pid>0){printf("A\n");kill(pid,12);}elseif(pid==0){signal(12,func);while(k==1)

sleep(1);

printf("B\n");}}非軟中斷方式main(){intpid;pid=fork();if(pid>0){printf("A\n");wait(0);}elseif(pid==0){printf("B\n");}}Linux無(wú)名管道通信若只觸發(fā)某些行為,軟中斷信號(hào)機(jī)制簡(jiǎn)捷有效。若進(jìn)程間需交換數(shù)據(jù)?----管道管道:用“管道”將讀寫進(jìn)程連接在一起,寫進(jìn)程將數(shù)據(jù)從寫入端寫入,讀進(jìn)程將數(shù)據(jù)從讀出端讀出。數(shù)據(jù)量大小是系統(tǒng)定義的最大緩沖區(qū)字節(jié)數(shù)。系統(tǒng)調(diào)用接口write(pipeID[1],buf_out,size)read(pipeID[0],buf_in,size)進(jìn)程A地址空間進(jìn)程B地址空間輸出緩沖buf_out輸入緩沖buf_in管道文件創(chuàng)建和使用無(wú)名管道的系統(tǒng)調(diào)用1.創(chuàng)建管道格式:intpipe(intfp[2]);返回:0---正確返回,-1----錯(cuò)誤返回參數(shù):fp[1]為寫入端,fp[0]為讀出端功能:創(chuàng)建一個(gè)無(wú)名管道fp,fp[1]用于寫,fp[0]用于讀。2.讀寫管道----借助文件機(jī)制格式:寫管道

write(fp[1],buf,size);

讀管道

read(fp[0],buf,size);參數(shù):buf為數(shù)據(jù)緩沖區(qū);size為l讀寫長(zhǎng)度。頭文件:<unistd.h>管道通信示例1main(){intp1,fd[2];charoutpipe[50],inpipe[50]=“Thisisamessagefromchild.”;

pipe(fd); p1=fork();if(p1==0)

write(fd[1],inpipe,50); //寫信息到管道

elseif(p1>0);

{wait(0);//等待子進(jìn)程終止

read(fd[0],outpipe,50);//從管道讀信息printf("%s\n",outpipe);}}父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程和一個(gè)無(wú)名管道fd,子進(jìn)程向管道寫入“Thisisamessagefromchild!”后終止;父進(jìn)程接收到子進(jìn)程終止信號(hào)后從管道中讀出并顯示信息后結(jié)束。管道通信示例2main(){intp1,fd[2];charstr1[50],str2[50];

pipe(fd); p1=fork();

子進(jìn)程執(zhí)行的分支父進(jìn)程執(zhí)行的分支}父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程和一個(gè)無(wú)名管道fd,子進(jìn)程通過(guò)管道向父進(jìn)程發(fā)送“Howareyou?”,父進(jìn)程接收到消息后通過(guò)管道回送“Iamfine.”,父子進(jìn)程將各自收到的消息顯示出來(lái)。elseif(p1>0)

{read(fd[0],str1,50);printf(“Parentreceived:%s\n”,str1);strcpy(str2,”Iamfine.”);write(fd[1],str2,strlen(str2));}if(p1==0)

{strcpy(str1,”Howareyou?”);write(fd[1],str1,strlen(str1));

read(fd[0],str2,50);printf(“Childreceived:%s\n”,str2);}管道通信示例2執(zhí)行結(jié)果分析父進(jìn)程讀不到數(shù)據(jù)被阻塞了子進(jìn)程把自己寫入管道的數(shù)據(jù)讀出來(lái)了!修改管道通信示例2

若將子進(jìn)程執(zhí)行分析修改為:

if(p1==0)

{strcpy(str1,”Howareyou?”);write(fd[1],str1,strlen(str1));

sleep(1);

read(fd[0],str2,50);printf(“Childreceived:%s\n”,str2);}父進(jìn)程不變:elseif(p1>0)

{read(fd[0],str1,50);printf(“Parentreceived:%s\n”,str1);strcpy(str2,”Iamfine.”);write(fd[1],str2,strlen(str2));}請(qǐng)分析上述代碼執(zhí)行結(jié)果:先調(diào)度到父進(jìn)程?先調(diào)度到子進(jìn)程?無(wú)名管道通信機(jī)制特點(diǎn)管道中的數(shù)據(jù)是字符流,工作于單向通信方式;管道邏輯上是由系統(tǒng)在內(nèi)存中創(chuàng)建的臨時(shí)文件實(shí)現(xiàn)的,物理上則由文件系統(tǒng)的高速緩沖區(qū)構(gòu)成;無(wú)名管道只能供創(chuàng)建管道的進(jìn)程及其子孫進(jìn)程共享;管道為臨界資源,各進(jìn)程對(duì)管道的訪問(wèn)既有同步又有互斥,需要用戶自己借助同步互斥機(jī)制以及文件機(jī)制來(lái)實(shí)現(xiàn)對(duì)管道的訪問(wèn)!Linux消息緩沖隊(duì)列msg_queue鏈表----系統(tǒng)所有消息隊(duì)列等待發(fā)送進(jìn)程pid等待接收進(jìn)程pid

……msg_msg*nextmsg_msg*nextmsgbufmsgbuf……………………iker_ipc_permkey……q_messagesq_receiversq_sanders一個(gè)msg_queue結(jié)構(gòu)對(duì)應(yīng)一個(gè)消息隊(duì)列msg結(jié)構(gòu)消息隊(duì)列有一個(gè)稱為關(guān)鍵字(key)的名字;收發(fā)消息前必須創(chuàng)建消息隊(duì)列,使用消息隊(duì)列描述符(msqid)來(lái)標(biāo)識(shí)該消息隊(duì)列。Linux消息隊(duì)列系統(tǒng)調(diào)用19intmsgget(key_tkey,intmsgflg);intmsgctl(intmsqid,intcmd,structmsqid_ds*buf);intmsgsnd(intmsqid,structmsgbuf*msgp,size_tmsgsz,intmsgflg);sszie_tmsgrcv(intmsqid,structmsgbuf*msgp,size_tmsgsz,longmsg_typ,intmsgflg);相關(guān)頭文件:<sys/types.h>,<sys/ipc.h>,<sys/msg.h>,<stdio.h>

1.創(chuàng)建或獲取消息隊(duì)列格式:intmsgget(key_tkey,intmsgflag);功能:創(chuàng)建或獲取標(biāo)識(shí)為key的消息隊(duì)列,并返回隊(duì)列描述符。返回:正確返回該消息隊(duì)列的描述符msgid;錯(cuò)誤返回-1。參數(shù):key—消息隊(duì)列標(biāo)識(shí)符,為正整數(shù)。可由用戶指定(適用于不同進(jìn)程家族);也可使用IPC_PRIVATE由系統(tǒng)產(chǎn)生key值(適用于同一進(jìn)程家族);msgflag—標(biāo)志或訪問(wèn)方式,由操作權(quán)限和控制命令進(jìn)行或運(yùn)算得到。操作權(quán)限:用戶可讀0400 小組可讀0040其他可讀0004 用戶可寫0200小組可寫0020其他可寫0002控制命令:IPC_CREAT(值0001000),若隊(duì)列不存在則創(chuàng)建。21/*有關(guān)頭文件…..*/main(){ intqid; key_tkey=113;

qid=msgget(key,IPC_CREAT|0666);//創(chuàng)建消息隊(duì)列 if(qid<0) {perror("msgget");exit(1); } printf("createdqueueid:%d\n",qid); system("ipcs-q");//查看系統(tǒng)IPC的狀態(tài)}創(chuàng)建消息隊(duì)列示例2.對(duì)消息隊(duì)列的控制格式:intmsgctl(intmsgid,intcmd,structmsqid_ds*buf);功能:查詢、設(shè)置消息隊(duì)列的狀態(tài);撤消消息隊(duì)列。返回:函數(shù)調(diào)用成功返回0,不成功返回-1。參數(shù):msgid—該消息隊(duì)列的描述符;cmd—規(guī)定命令的類型:IPC_STAT查詢消息隊(duì)列狀態(tài),將消息隊(duì)列的msqid_ds復(fù)制到buf;IPC_SET設(shè)置或修改消息隊(duì)列狀態(tài),設(shè)置有效用戶、組標(biāo)識(shí)、操作允許權(quán)、字節(jié)數(shù);IPC_RMID撤消描述符為msgid的消息隊(duì)列;buf—含有控制參數(shù)或查詢結(jié)果的用戶緩沖區(qū)的地址,可為0。/*有關(guān)頭文件…..*/main(){ intqid; intkey=113;

qid=msgget(key,IPC_CREAT|0666);//創(chuàng)建消息隊(duì)列

if(qid<0) {perror("msgget");exit(1); } printf("createdqueueid:%d\n",qid); system(“ipcs-q”);//查看系統(tǒng)IPC的狀態(tài) if(msgctl(qid,IPC_RMID,NULL)<0) {perror(“msgctl”);exit(1);} system("ipcs-q"); printf("successfullyremoved%dqueue\n",qid);}刪除消息隊(duì)列示例3.發(fā)送消息格式:intmsgsnd(intmsgid,structmsgbuf*msgp,intsize,intflag);功能:將msgp->msgbuf中的消息復(fù)制到msgid消息隊(duì)列中,將之掛到隊(duì)尾,喚醒等待消息的進(jìn)程。參數(shù):msgid—執(zhí)行msgget()返回的消息隊(duì)列的描述符;msgp—待發(fā)送的消息;size—由msgp指向的數(shù)據(jù)結(jié)構(gòu)中消息長(zhǎng)度;flag—規(guī)定當(dāng)消息隊(duì)列滿時(shí)應(yīng)執(zhí)行的動(dòng)作,例如:若在flag中設(shè)置了IPC_NOWAIT,則當(dāng)消息隊(duì)列中的字節(jié)數(shù)超過(guò)最大值時(shí),msgsnd立即返回,否則msgsnd睡眠。flag可置0。25/*有關(guān)頭文件…..*/structmsg{longmtype;//消息類型charmtext[511];//消息正文};intmain(void){intqid,pid;structmsgpmsg;//創(chuàng)建消息隊(duì)列

qid=msgget(113,IPC_CREAT|0666)if(qid<0){perror("msgget");exit(1);}system(“ipcs-q”);發(fā)送消息示例//發(fā)送消息到隊(duì)列上pmsg.mtype=getpid();sprintf(pmsg.mtext,"hello!thisis%d\n\0",getpid());

if(msgsnd(qid,&pmsg,len,0)<0){perror("msgsnd");exit(1);}system(“ipcs-q”);//刪除消息隊(duì)列if(msgctl(qid,IPC_RMID,NULL)<0){perror(“msgctl”);exit(1);}system("ipcs-q");printf("successfullyremoved%dqueue\n",qid);}4.接收消息格式:intmsgrcv(intmsgid,structmsgbuf*msgp,intsize,inttype,intflag);功能:從msgid消息隊(duì)列中接收一個(gè)消息:將消息復(fù)制到msgp->msgbuf中,并從隊(duì)列中刪除此消息,若消息未到則調(diào)用進(jìn)程阻塞插入等待消息隊(duì)列尾。參數(shù):msgid—消息隊(duì)列描述符;msgp—存放接收消息的用戶緩沖區(qū)的首地址;size—要接收字節(jié)數(shù)(一般為msgp中數(shù)據(jù)數(shù)組的大小);type—接收消息類型:=0--接收隊(duì)列的第一個(gè)消息;>0--接收類型為type的第一個(gè)消息;<0—接收第一個(gè)類型小于或等于|type|的消息。flag—若該隊(duì)列無(wú)消息,內(nèi)核應(yīng)當(dāng)做什么,可置0。IPC_NOWAIT,立即返回IPC_EXCEPT與msgtype>0配合使用,返回隊(duì)列中第一個(gè)類型不為msgtype的消息IPC_NOERROR

如果消息內(nèi)容大于所請(qǐng)求的字節(jié),則丟棄多余字節(jié)。#include<sys/msg.h>structmsg{longmtype;charmtext[256];}pmsg;main(){intmsgqid,pid;msgqid=msgget(75,0777);printf(“msgid:%d\n”,msgqid);pmsg.mtype=1;*((int*)pmsg.text)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);msgrcv(msgqid,&pmsg,256,getpid(),0);printf(“A:receivemsgfrom%d\n",

*((int*)pmsg.text));}27消息通信示例—模擬服務(wù)器與客戶端進(jìn)程A發(fā)送如下消息給進(jìn)程B:mtypemtext1A_pid進(jìn)程B等待接收A的消息并回送如下消息:mtypemtextA_pidB_pid#include<sys/msg.h>intmsgqid,pid;structmsg{longmtype;charmtext[256];}pmsg;cancelqueue(){msgctl(msgqid,IPC_RMID,0);exit(0);}main(){signal(2,cancelqueue); msgqid=msgget(75,0777|IPC_CREAT);while(1){msgrcv(msgqid,&pmsg,256,1,0);pid=*(int*)pmsg.mtext;printf(“B:receivemsgfrom%d\n",pid);pmsg.mtype=pid;*((int*)pmsg.text)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);}}沒(méi)有IPC_CREAT,只獲取不創(chuàng)建28消息通信示例—模擬服務(wù)器與客戶端運(yùn)行結(jié)果29Linux共享存儲(chǔ)區(qū)通信消息緩沖需要CPU復(fù)制消息,進(jìn)程間直接進(jìn)行數(shù)據(jù)交換的通信方式?——共享內(nèi)存附接附接進(jìn)程A地址空間進(jìn)程B地址空間共享內(nèi)存與消息緩沖通信類似,Linux對(duì)共享內(nèi)存通信也提供了4個(gè)系統(tǒng)調(diào)用函數(shù):shmget()

shmat()shmdt()shmctl()頭文件:

sys/types.h,linux/shm.h共享存儲(chǔ)區(qū)系統(tǒng)調(diào)用1.創(chuàng)建或獲取一個(gè)共享內(nèi)存格式:intshmid=shmget(key_tkey,intsize,intflag);功能:獲得一個(gè)內(nèi)部標(biāo)識(shí)為shmid的共享存儲(chǔ)區(qū)參數(shù):key—共享存儲(chǔ)區(qū)關(guān)鍵字,由用戶指定或由系統(tǒng)產(chǎn)生(IPC_PRIVATE)。size—存儲(chǔ)區(qū)的字節(jié)數(shù)。flag—標(biāo)志或訪問(wèn)方式,與shmget中含義相同,如0666|IPC_CREAT表示任意進(jìn)程可讀可寫。返回:正確時(shí)返回共享存儲(chǔ)區(qū)的標(biāo)識(shí)符shmid,錯(cuò)誤則返回-1。2.將共享內(nèi)存附接到進(jìn)程的虛擬地址空間格式:void*shmat(intshmid,void*shmaddr,intflag);功能:將shmid共享存儲(chǔ)區(qū)附接到進(jìn)程的虛擬地址空間shmaddr。參數(shù):shmid—共享存儲(chǔ)區(qū)的描述符,由shmget()的返回值得到;shmaddr—共享存儲(chǔ)區(qū)附接的虛地址,若shmaddr為0,則由系統(tǒng)選擇一個(gè)適當(dāng)?shù)牡刂穪?lái)附接該存儲(chǔ)區(qū);flag—存儲(chǔ)區(qū)的操作權(quán)限以及系統(tǒng)是否要舍除用戶規(guī)定的地址。SHM_RND表示在必要時(shí)舍去地址;SHM_RDONLY表示只讀,flag為0表示可讀可寫;返回值—正確返回附接的虛地址;出錯(cuò)返回-1。調(diào)用舉例:字符型:char*viraddr=(char*)shmat(shmid,shmaddr,shmflag);數(shù)值型:int*viraddr=(int*)shmat(shmid,shmaddr,shmflag);3.將共享內(nèi)存從進(jìn)程的地址空間斷開(kāi)(斷接)格式:shmdt(viraddr);功能:將一個(gè)共享存儲(chǔ)區(qū)從指定進(jìn)程的虛擬地址空間斷開(kāi)參數(shù):viraddr——系統(tǒng)調(diào)用shmat()所返回的虛地址返回:正確返回0

錯(cuò)誤返回-14.對(duì)共享內(nèi)存的控制或查詢格式:shmctl(intshmid,intcmd,structshmid_ds*buf)功能:對(duì)共享存儲(chǔ)區(qū)進(jìn)行控制,如刪除共享存儲(chǔ)區(qū)。返回值:正確返回0,錯(cuò)誤返回-1。參數(shù):shmid—共享存儲(chǔ)區(qū)的內(nèi)部標(biāo)識(shí)符,由shmget()調(diào)用返回;buf—讀寫共享存儲(chǔ)區(qū)參數(shù)的數(shù)據(jù)緩沖區(qū),可為0。cmd—操作類型:

IPC_STAT---返回包相關(guān)數(shù)據(jù)結(jié)構(gòu)中的狀態(tài)信息,由buf帶出

IPC_SET---設(shè)置有效用戶和小組標(biāo)識(shí)符和操作存取權(quán),由buf帶入

IPC_RMID---刪除共享存儲(chǔ)區(qū)

SHM_LOCK---鎖定共享存儲(chǔ)區(qū),須是超級(jí)用戶才可操作。調(diào)用舉例:shmctl(shmid,IPC_RMID,0);共享內(nèi)存通信實(shí)現(xiàn)方法:發(fā)送進(jìn)程1.用shmget()創(chuàng)建或者獲取指定key值的共享內(nèi)存;2.用shmat()將該共享內(nèi)存附接到自己的虛擬地址空間;3.將需要發(fā)送的信息寫入共享內(nèi)存:①共享內(nèi)存定義為字符串,則可通過(guò)strcat(viraddr,buf)將buf追加到共享存儲(chǔ)區(qū)尾部。或通過(guò)strcpy(viraddr,buf)將buf復(fù)制到共享內(nèi)存中。②共享內(nèi)存定義為單變量,則可將*viraddr作為數(shù)值型變量對(duì)其進(jìn)行操作。如*viradd=0。③共享內(nèi)存定義為數(shù)組變量,則可將viraddr[i]作為下標(biāo)變量使用。如viradd[i]=0。4.使用shmdt()

斷開(kāi)共享內(nèi)存。5.如果不再使用共享內(nèi)存時(shí),用shmctl()將其撤消,格式為:shmctl(shmid,IPC_RMID,0);

共享內(nèi)存通信實(shí)現(xiàn)方法:接收進(jìn)程1.用shmget()創(chuàng)建或者獲取指定key值的共享內(nèi)存;2.用shmat()將該共享內(nèi)存附接到自己的程序空間;3.讀取共享內(nèi)存中的信息;4.用shmdt()斷開(kāi)共享內(nèi)存。5.如果不再使用共享內(nèi)存時(shí),用shmctl()將其撤消,格式為:shmctl(shmid,IPC_RMID,0);共享內(nèi)存通信示例#include<stdio.h>#include<linux/shm.h>main(){ intshmid; char*va,buf[BUFSIZ];

shmid=shmget(22,BUFSIZ,0666|IPC_CREAT);

va=(char*)shmat(shmid,0,0);while(1)

{puts("Entersometext:");fgets(buf,BUFSIZ,stdin);

strcat(va,buf);

if(strncmp(buf,"end",3)==0)break; }

shmdt(va);//斷開(kāi)附接

shmctl(shmid,IPC_RMID,0);

}/*頭文件*/main(){intshmid;char*va;shmid=shmget(22,BUFSIZ,0666|IPC_CREAT);va=(char*)shmat(shmid,0,0);printf("Yourmsgis:%s\n",va);shmdt(va);

}發(fā)送程序shma.c接收程序shmb.c共享內(nèi)存通信特點(diǎn)共享內(nèi)存只能由處于同一個(gè)計(jì)算機(jī)系統(tǒng)中的諸進(jìn)程共享。進(jìn)程之間的讀寫操作的同步問(wèn)題必須由諸共享該內(nèi)存的進(jìn)程去控制。信號(hào)量機(jī)制基本PV原語(yǔ)原理。Linux提供下列3個(gè)有關(guān)信號(hào)量的系統(tǒng)調(diào)用函數(shù):semget()semop()semctl()頭文件:sys/ipc.h,sys/sem.h信號(hào)量機(jī)制格式:intsemget(key_tkey,intnsems,intsemflg);返回:正確返回信號(hào)量集的標(biāo)識(shí)符,錯(cuò)誤返回-1參數(shù):key——信號(hào)量集的key值,使用IPC_PRIVATE由系統(tǒng)產(chǎn)生key值,或由用戶指定一個(gè)正整數(shù)。nsems——指定信號(hào)量集中信號(hào)量數(shù)目,最大值在linux/sem.h中定義:#defineSEMMSL250/*<=8000*/semflg——當(dāng)key值不為IPC_PRIVATE:①.只設(shè)置semflag的IPC_CREAT位,則創(chuàng)建一個(gè)信號(hào)量集,若該信號(hào)量集已存在,則返回其標(biāo)識(shí)符②.設(shè)置semflag的IPC_CREAT|IPC_EXCL位,則創(chuàng)建一個(gè)新的信號(hào)量集,若信號(hào)量集已存在則返回錯(cuò)誤信息。③.只設(shè)置IPC_EXCL位而不設(shè)置IPC_CREAT位沒(méi)有意義。調(diào)用舉例:semid=semget(SEMKEY,2,0777|IPC_CREAT);1

溫馨提示

  • 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)論