版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Linux進程間通信(下)LinuxIPCprogramme桂電嵌入式交流群:156619189課程目標(biāo)SystemVIPC接口簡介SystemV消息隊列SystemV信號量SystemV共享內(nèi)存POSIXIPC接口Posix消息隊列Posix信號量Posix共享內(nèi)存SystemVIPC接口桂電嵌入式交流群:156619189SystemVIPC接口由于歷史原因,linux下的進程通信手段基本上是從Unix平臺上的進程通信手段繼承而來的.Unix發(fā)展做出重大貢獻的兩大主力AT&T的貝爾實驗室及BSD(加州大學(xué)伯克利分校的伯克利軟件發(fā)布中心)在進程間通信方面的側(cè)重點有所不同貝爾實驗室對Unix早期的進程間通信手段進行了系統(tǒng)的改進和擴充,形成了“systemVIPC”,通信進程局限在單個計算機內(nèi).BSD則形成了基于套接口(socket)的進程間通信機制,可以在跨機器進行通信.由于Unix版本的多樣性,電子電氣工程協(xié)會(IEEE)開發(fā)了一個獨立的Unix標(biāo)準(zhǔn),這個新的ANSIUnix標(biāo)準(zhǔn)被稱為計算機環(huán)境的可移植性操作系統(tǒng)界面(POSIX)。他也發(fā)展出一套新的IPC接口.Linux本身支持POSIX接口.因此也支持POSIX的IPC接口最初UnixIPC包括:管道、FIFO、信號,SystemVIPC包括:SystemV消息隊列、SystemV信號燈、SystemV共享內(nèi)存區(qū),PosixIPC包括:Posix消息隊列、Posix信號燈、Posix共享內(nèi)存區(qū)。SystemVIPC通常在多個操作系統(tǒng)均實現(xiàn),包括一般的嵌入式Linux系統(tǒng),因此本課程主要介紹systemVIPCLinux的IPCSystemVIPC指以下三種類型的IPC:SystemV消息隊列sys/msg.hSystemV信號燈sys/sem.hSystemV共享內(nèi)存區(qū)sys/shm.h創(chuàng)建或打開函數(shù)msgget,semget,shmget控制操作函數(shù)msgctl,semctl,shmctl操作函數(shù)msgsnd,msgrcv,semop,shmat,shmdtSystemV關(guān)鍵字每一個SystemV對象(消息隊列,共享內(nèi)存和信號量)創(chuàng)建時,需要的第一個參數(shù)是整數(shù)的Key值,頭文件<sys/types.h>把key_t定義為一個整數(shù)SystemV創(chuàng)建對象時假設(shè)進行IPC通訊雙方都取了相同的key值.這樣將雙方關(guān)聯(lián)起來生成key的方法有三種雙方直接設(shè)置為一個相同的整數(shù)為key值用IPC_PRIVA讓系統(tǒng)自動產(chǎn)生一個key值,用ftok函數(shù)將一個路徑轉(zhuǎn)換為key值ftok函數(shù)ftok函數(shù)把一個已存在的路徑名和一個整數(shù)標(biāo)識符轉(zhuǎn)換成一個key_t值,稱為IPC鍵(IPCkey):#include<sys/ipc.h>key_tftok(constchar*pahtname,intid);如果pathname不存在,或者對調(diào)用進程不可訪問,ftok返回-1不能保證兩個不同的路徑名與同一個id值的組合產(chǎn)生不同的鍵。用于產(chǎn)生鍵的pahtname不能是服務(wù)器存活期間由它反復(fù)創(chuàng)建并刪除的文件,否則會導(dǎo)致ftok多次調(diào)用返回不同的值SystemVIPC的類型報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括Posix消息隊列systemV消息隊列。有足夠權(quán)限的進程可以向隊列中添加消息,被賦予讀權(quán)限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。共享內(nèi)存:使得多個進程可以訪問同一塊內(nèi)存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設(shè)計的。往往與其它通信機制,如信號量結(jié)合使用,來達到進程間的同步及互斥。信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。SystemV消息隊列桂電嵌入式交流群:156619189消息隊列消息隊列就是一個消息的鏈表。可以把消息看作一個記錄,具有特定的格式以及特定的優(yōu)先級。對消息隊列有寫權(quán)限的進程可以向中按照一定的規(guī)則添加新消息;對消息隊列有讀權(quán)限的進程則可以從消息隊列中讀走消息。消息隊列能夠克服早期unix通信機制的一些缺點,如數(shù)據(jù)量小,沒有實時性消息隊列(2)消息隊列消息通常要以一個longmtype放在消息開始,mtype成員代表消息類型,從消息隊列中讀取消息的一個重要依據(jù)就是消息的類型structmsgbuf{longmtype;charmtext[1];};消息隊列與管道以及有名管道相比,具有更大的靈活性它提供有格式字節(jié)流,有利于減少開發(fā)人員的工作量消息具有類型,在實際應(yīng)用中,可作為優(yōu)先級使用。這兩點是管道以及有名管道所不能比的消息隊列可以在幾個進程間復(fù)用,而不管這幾個進程是否具有親緣關(guān)系,這一點與有名管道很相似;但消息隊列是隨內(nèi)核持續(xù)的,與有名管道(隨進程持續(xù))相比,生命力更強,應(yīng)用空間更大。消息隊列編程頭文件#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>msgget打開或創(chuàng)建消息隊列intmsgget(key_tkey,intmsgflg);返回線隊列IDmsgrcv從隊列接收消息intmsgrcv(intmsqid,structmsgbuf*msgp,intmsgsz,longmsgtyp,intmsgflg);msgsnd向隊列發(fā)送消息intmsgsnd(intmsqid,structmsgbuf*msgp,intmsgsz,intmsgflg);msgctl發(fā)送隊列控制命令msgctl(intmsqid,intcmd,structmsqid_ds*buf);
共有三種cmd操作:IPC_STAT、IPC_SET、IPC_RMID。消息隊列數(shù)據(jù)結(jié)構(gòu)對于系統(tǒng)中的每個SystemV消息隊列,內(nèi)核維護一個如下的結(jié)構(gòu):structmsqid_ds{structipc_permmsg_perm;/*operationpermissionstruct*/structmsg*msg_first;/*ptrtofirstmessageonq*/structmsg*msg_last;/*ptrtolastmessageonq*/unsignedshortmsg_cbytes;/*current#bytesonq*/msgqnum_tmsg_qnum;/*#ofmessagesonq*/msglen_tmsg_qbytes;/*max#ofbytesonq*/pid_tmsg_lspid;/*pidoflastmsgsnd*/pid_tmsg_lrpid;/*pidoflastmsgrcv*/time_tmsg_stime;/*lastmsgsndtime*/time_tmsg_rtime;/*lastmsgrcvtime*/time_tmsg_ctime;/*lastchangetime*/};msgget函數(shù)#include<sys/msg.h>intmsgget(key_tkey,intoflag);返回:成功時為非負標(biāo)識符,出錯時為-1用于創(chuàng)建一個新的SystemV消息隊列或訪問一個已經(jīng)存在的消息隊列。參數(shù)key和oflag的說明見前。Oflag:取值,IPC_CREAT創(chuàng)建新對象成功,IPC_EXCL檢查新對象返回值是一個整數(shù)標(biāo)識符,其他三個msg函數(shù)用它來指代該隊列。當(dāng)創(chuàng)建一個消息隊列時,msqid_ds結(jié)構(gòu)的如下成員被初始化:msg_perm結(jié)構(gòu)的uid和cuid被設(shè)置為當(dāng)前進程的有效用戶ID,gid和cgid被設(shè)置為當(dāng)前用戶的有效組ID;oflag中的讀寫權(quán)限位存放在msg_perm.mode中;msg_qnum、msg_lspid、msg_lrpid、msg_stime和msg_rtime被置為0;msg_ctime被設(shè)置成當(dāng)前時間;msg_qbytes被設(shè)置為系統(tǒng)限制值。msgsnd函數(shù)#include<sys/msg.h>intmsgsnd(intmsgid,constvoid*ptr,size_tlength,intflag);返回:成功時為0,出錯時為-1該函數(shù)用于往消息隊列上放置一個消息。msgid是msgget返回的標(biāo)識符,ptr是一個結(jié)構(gòu)指針,該結(jié)構(gòu)有如下的模板:structmsgbuf{longmtype;/*messagetype,mustbe>0*/charmtext[1];/*messagedata*/};消息類型mtype必須大于0,因為非正消息類型有特殊的指示作用。length參數(shù)以字節(jié)為單位指定待發(fā)送消息的長度。這是位于長整數(shù)消息類型之后的用戶自定義數(shù)據(jù)的長度,該長度可以是0。flag參數(shù)可以是0,也可以是IPC_NOWAIT。IPC_NOWAIT標(biāo)志使得msgsnd調(diào)用非阻塞。當(dāng)有如下情形之一時:在指定的隊列中已經(jīng)有太多的字節(jié)(對應(yīng)msqid_ds結(jié)構(gòu)中的msg_qbytes值);在系統(tǒng)范圍存在太多的消息。若設(shè)置了IPC_NOWAIT,則msgsnd立即返回,返回一個EAGAIN錯誤。若未指定該標(biāo)志,則msgsnd阻塞,直到具備存放新消息的空間;有msgid標(biāo)識的消息隊列被刪除,此時返回EIDRM錯誤;被信號中斷,此時返回EINTR錯誤。msgrcv函數(shù)#include<sys/msg.h>ssize_tmsgrcv(intmsqid,void*ptr,size_tlength,longtype,intflag);返回:成功時為讀入緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù),出錯時為-1該函數(shù)從某個消息隊列中讀出一個消息。ptr參數(shù)指定所接收消息的存放位置。跟msgsnd一樣,該指針指向緊挨在真正的消息數(shù)據(jù)之前返回的長整數(shù)類型字段。length指定由ptr指向的緩沖區(qū)中數(shù)據(jù)部分的大小。這是該函數(shù)能返回的最大數(shù)據(jù)量。該長度不包含長整數(shù)類型字段。type指定希望從所給定的隊列中讀出什么樣的消息:type為0,返回隊列中第一個消息。每個消息隊列是作為一個FIFO鏈表維護的,所以返回的是隊列中最早的消息。type大于0,返回其類型值為type的第一個消息。type小于0,返回其類型值小于或等于type參數(shù)的絕對值的消息中類型值最小的第一個消息。flag參數(shù)指定所請求的消息不在隊列中時怎么辦。在沒有消息時,若設(shè)置了IPC_NOWAIT標(biāo)志,則函數(shù)立即返回一個ENOMSG錯誤;否則,調(diào)用者阻塞直到如下某個時間發(fā)生:有一個所請求類型的消息可獲??;由msqid標(biāo)識的消息隊列被刪除,此時返回個EIDRM錯誤;被某個捕獲的信號中斷,此時返回EINTR錯誤。msgctl函數(shù)#include<sys/msg.h>intmsgctl(intmsqid,intcmd,structmsqid_ds*buf);返回:成功時為0,出錯時為-1該函數(shù)提供在一個消息隊列上的各種控制操作。msgctl提供三個命令:IPC_RMID:從系統(tǒng)中刪除由msqid指定的消息隊列。當(dāng)前在該隊列上的任何消息都被丟棄。此時。第三個參數(shù)忽略不用。IPC_SET:給指定的消息隊列設(shè)置其msqid_ds結(jié)構(gòu)的以下四個成員:msg_perm.uid、msg_perm.gid、msg_perm.mode和msg_perm.qbytes。它們的值來自buff指向的結(jié)構(gòu)中的相應(yīng)成員。IPC_STAT:通過buff參數(shù)給調(diào)用者返回所指定消息隊列中的當(dāng)前msqid_ds結(jié)構(gòu)。消息隊列打開如果沒有調(diào)用msgctl(semid,IPC_RMID,0)刪除消息隊列,則消息隊列一直存在內(nèi)核中,即便是創(chuàng)建進程已經(jīng)退出也是如此,這個用ipcs可以看到如果對一個已經(jīng)創(chuàng)建的消息隊列的路徑再次創(chuàng)建消息隊列,通常都會出錯.因此可以采用一種保險的寫法/*首先查詢這個隊列是否創(chuàng)建,如創(chuàng)建直接用它*/if((msgid=msgget(key,IPC_EXCL|0666))==-1) { /*沒有創(chuàng)建才去創(chuàng)建這個消息隊列*/ msgid=msgget(key,IPC_CREAT|IPC_EXCL|00666); if(msgid==-1) { printf("msgcreateerror\n"); return; }}其它對象也用這樣打開方法SystemV信號量桂電嵌入式交流群:156619189信號量信號量與士其他進程譽間通信方親式不大相鹿同,它主骨要提供對藍進程間共束享資源訪棚問控制機但制。信號量怨相當(dāng)是飾一個全百局的整既數(shù)變量甩,這個聲變量只甲能用原月子操作守來改變老值信號燈與額其它進程魯間通信方歌式有所不限同,它主看要用于進瘦程間同步押。通常所嗓說的系統(tǒng)備V信號燈權(quán)實際上是恩一個信號精燈的集合琴,可用于凡多種共享懸資源的進技程間同步絡(luò)。每個信蛋號燈都有太一個值,步可以用來且表示當(dāng)前府該信號燈單代表的共紗享資源可廁用(av肥aila糊ble)怎數(shù)量,如果一個我進程要申免請共享資紫源,那么看就從信號榨燈值中減昂去要申請段的數(shù)目,瞇如果當(dāng)前勾沒有足夠酒的可用資驅(qū)源,進程題可以睡眠愛等待,也肢可以立即裝返回。當(dāng)判進程要申嚼請多種共噴享資源時生,lin悶ux可以閃保證操作熟的原子性查,即要么圾申請到所蜘有的共享躺資源,要留么放棄所夕有資源,慘這樣能夠豬保證多個筆進程不會水造成互鎖短。信號量鞋集的數(shù)敬據(jù)結(jié)構(gòu)Sys矛tem樓V信號赴燈是信比號燈集時的概念蓬:一個笑或多個英信號燈驚構(gòu)成一糖個集合設(shè)。對于豆系統(tǒng)每嫁個信號雪燈集,條內(nèi)核維撿護如下筍的一個監(jiān)結(jié)構(gòu):str浮uct庭se在mid糞_ds妄{stru池cti懲pc_p儀erm憂sem_槍perm史;/*哭ope隱rati外onp稻ermi猾ssio鉤nst噴ruct絡(luò)*/stru楊cts只em*倍sem_挑base來;/*模ptr耗to新firs建tse雜maph與ore菊ins茫et*騾/uns亂ign鏟ed演sho廢rt喝sem堵_ns螺ems梢;/建*#寬of凳se幅map遭hor拜es鑒in柜set費*/time適_ts島em_o畜time衣;/*政las簽tse洪mop會time妹*/time朽_ts吉em_c躲time萌;/*購las產(chǎn)tch峽ange回tim統(tǒng)e*/};當(dāng)前信號友燈集中的省每個信號葵燈對應(yīng)一油個sem仿結(jié)構(gòu)。定吊義如下:stru滴cts師em{sig固ned孟sh歷ort跑se信mva癥l;音/*標(biāo)sem理aph朝ore厭te統(tǒng)xt幣map淹ad吩dre促ss灰*/pid善_t芬sem致pid深;/倘*p凈id餓of異las腥to攏per歌ati芹on書*/uns聽ign別ed愿sho鼠rt強sem挺ncn宜t;造/*飼#a踢wai認tin巴gs密emv藥al確>c嫂val練*/uns圖ign族ed下sho遭rt晴sem扒zcn壇t;膚/*筑#a騰wai慨tin癢gs阻emv蹲al翁=0吉*/};關(guān)于P原箱語P原語譜:P是荷蘭款語Pro賺bere縫n(測試督)的首字北母。為阻圾塞原語,兩負責(zé)把當(dāng)如前進程由汪運行狀態(tài)月轉(zhuǎn)換為阻究塞狀態(tài),哥直到另外陶一個進程籮喚醒它。言操作為:扔申請一個息空閑資源幸(把信號標(biāo)量減1)匹,若成功擇,則退出壤;若失敗脊,則該進隱程被阻塞蘿;P原語權(quán)的操作后過程sem膜減1;若se牛m減1瞎后仍大謝于或等賢于零,望則進程騾繼續(xù)執(zhí)愈行;若sem捐減1后小廣于零,則飄該進程被赤阻塞后進嫁入與該信矛號相對應(yīng)深的隊列中悄,然后轉(zhuǎn)壯進程調(diào)度尼。Syst抬emV康實現(xiàn)代里碼int御p(倉int臉se罷mid甲){str芬uct匆se鼠mbu負fs睬ops霉={0鬼,+1培,IP初C_N頂OWA蘿IT}當(dāng);retu興rn(杜semo碰p(se障mid,刊&sop午s,1)豪);}關(guān)于V原鑒語V原語V是荷椅蘭語V甲erh俱oge歌n(增爺加)的太首字母租。為喚播醒原語杏,負責(zé)醒把一個錘被阻塞亮的進程揮喚醒,深它有一拾個參數(shù)急表,存謠放著等親待被喚齒醒的進羽程信息它。操作爆為:釋擴放一個罩被占用怪的資源萬(把信幅號量加桃1),抖如果發(fā)扔現(xiàn)有被橋阻塞的肅進程,慰則選擇起一個喚亮醒之V原語的飄操作過程sem加件1;若相加結(jié)擔(dān)果大于零溪,則進程掀繼續(xù)執(zhí)行方;若相加結(jié)癥果小于或面等于零,紙則從該信葛號的等待鬼隊列中喚絮醒一等待萬進程,然茶后再返回帽原進程繼六續(xù)執(zhí)行或襪轉(zhuǎn)進程調(diào)備度。Sys鼻tem洲V賣實現(xiàn)代附碼int徹v(兩int窮se豪m(xù)id萬){stru聞cts谷embu唯fso岸ps={胖0,-1喪,IPC貫_NOW冠AIT}匪;retu財rn(豈semo鋒p(se油mid,典&sop嶺s,1)矮);}信號量鐮的處理賄流程用到頭文糖件#inc斥lude輝<sy翁s/ty叨pes.急h>#inc仇lude副<sy擋s/ip它c.h>#inc做lude南<sy滑s/se倉m.h>semg至et創(chuàng)建謙或打開一詠個信號量int糊se滑mge剃t(k鄰ey_跑tk忍ey,炕in滿tn婆sem出s,判int瘦se模mfl稈g)Semo碰p()對找信號量夕+1或鞭-1吼或測試是尺否為0int馬semo襲p(in儀tse脅mid,急str生uct據(jù)semb臭uf*結(jié)sops辦,un售sign井edn報sops候);linu羅x可以增蹄加或減小牛信號量的奶值,相應(yīng)桿于對共享落資源的釋養(yǎng)放和占有sem饞ctl警對信微號量進搞行各種圖控制int嗚se檔mct侮l(i縱nt汽sem決id,糊int攻se等mnu丑m,i撲nt潤cmd素,un玻ion看se恢mun顫ar閑g)semg衣et函數(shù)#inc睛lude映<sy屈s/se歌m.h>int灶semg訊et(k慢ey_t劣key翁,in蒼tns立ems,爪int籠ofl控ag);返回:謹成功時燦為非負惑標(biāo)識符趙,出錯凳時為-窯1創(chuàng)建一個州信號燈集閥或訪問一銷個已存在圾的信號燈工集。返回值疾是信號辰燈標(biāo)識奔符,供城其他信害號燈函務(wù)數(shù)使用箱。nse丑ms是故集合中巧的信號尾燈數(shù)。映如果不屢是創(chuàng)建從一個信扔號燈集裳,而只換是訪問哀已存在偵的集合昂,則該桂參數(shù)可曉以指定蕩為0。堡一旦創(chuàng)幣建完畢回一個信響號燈集喜,就不駐能改變看其中的埋信號燈普數(shù)。當(dāng)實際栽操作為罩創(chuàng)建一更個新的拿信號燈饅集時,稻sem您id_洞ds結(jié)淋構(gòu)的以劍下成員泳將被初簡始化:sem謙_pe箏rm結(jié)毫構(gòu)的u花id和歌cui著d被設(shè)候置為調(diào)嶄用進程羨的有效濃用戶I陶D,g以id和駝cgi罪d被設(shè)猾置為調(diào)裁用進程仙的有效澡組ID背;ofla餐g參數(shù)中順的讀寫權(quán)鑒限存入s律em_p佳erm.認mode圓中;sem_歷otim大e被設(shè)置領(lǐng)為0,s溜em_c侄time劍被置為當(dāng)議前時間;sem掩_ns莫ems嘴被置為形nse皆ms參龍數(shù)的值屋;與該集制合中每廟個信號臉燈關(guān)聯(lián)別的各個積sem徹結(jié)構(gòu)并柔不初始盼化。這它些結(jié)構(gòu)皆必須是旦在以S哲ETV莖AL或杠SET修ALL蠟命令調(diào)測用se御mct渾l時初浩始化的賢。信號量創(chuàng)宋建問題Sys斜tem區(qū)V信號庫燈的創(chuàng)悉建和初束始化需址兩次函臂數(shù)調(diào)用價是一個挎致命的洪缺陷,椒這會導(dǎo)栽致競爭謎狀態(tài)的序出現(xiàn)。解決競棚爭狀態(tài)雄的方法擱是:當(dāng)勤sem異get宿創(chuàng)建一敏個新的鉤信號燈架集時,型其se譯mid幸_ds游結(jié)構(gòu)的欣sem維_ot塊ime崇成員??h證被設(shè)逆置為0散。該成第員只是甚在se投mop間調(diào)用成傍功時才百被設(shè)置脈為當(dāng)前咳值。在椅調(diào)用s砍emg彩et進咐行訪問奧而不是棋創(chuàng)建時艘,以I盆PC_逼STA齡T命令紅調(diào)用s寫emc推tl,藏然后等串待se顛m_o次tim嫌e變?yōu)殡姺橇阒甸?。到時追就可斷刃定該信僻號燈已爺經(jīng)被初端始化,胡而且對將它初始頑化的進勝程已成震功完成悉sem培op調(diào)腸用。所遮以,創(chuàng)扎建該信闊號燈集帥的進程虹必須初竊始化它齡的值,輸而且必贈須在任虜何其他胖進程可列以使用褲該信號輩燈集之臨前調(diào)用胃sem仁op。這樣將會師造成程序勝相當(dāng)復(fù)雜semo編p函數(shù)#inc代lude澡<sy島s/se宴m.h>int膽semo睬p(in井tse權(quán)mid,饞str軌uct楊semb形uf*班opsp爛tr,烘size讀_tn捷ops)凍;返回:鴉成功時鞋為0,善出錯時警為-1對一個或旬多個信號劈燕燈進行操四作。opsp染tr指向雜如下結(jié)構(gòu)漏模板的數(shù)豈組(該結(jié)強構(gòu)可能不鍋止如下幾津個成員)茶:stru碼cts環(huán)embu霞f{shr盲ot補sem艇_nu警m;寧/*雜sem腹aph洋ore議nu章mbe泳r:0郵,1,欲..,尤nse摸ms-其1*腔/sho循rt允sem樓_op愧;/燒*s句ema索pho踩re趣ope禁rat乞ion徒:<援0,掀0,慶>0強*/sho西rt奴sem戀_fl芬g;迅/*句ope與rat車ion仿fl鑒ags斥:0,盒IPC早_NO旦WAI響T,S股EM_扮UND盲O*桐/};nop芽s參數(shù)婆指出結(jié)雹構(gòu)數(shù)組場中元素紗的個數(shù)瓦。每個熄元素給拐目標(biāo)信魄號燈集倍中某個齊信號燈蓬指定一防個操作役。特定邊的信號優(yōu)燈由s活em_卻num川指定;撲sem離_op厲指定特象定的操會作;s圍em_僑flg天指定非皺阻塞(嚼IPC桶_NO怪WAI跡T)、倦恢復(fù)等必標(biāo)志。歲在阻塞雷、非阻雄塞情況梢下返回妖的錯誤貌情況與府其他S嗎yst傅emV材IP喇C相同緣瑞。semo甜p函數(shù)由陷內(nèi)核保證介原子的執(zhí)喂行,內(nèi)核適或者完成喜所有操作箏,或者什模么也不做搏。semo宋p操作的師具體描述咽:如果s舟em_簡op是急正數(shù),賴其值就勉加到s鍛emv起al(翻信號燈市的當(dāng)前鍛值)上膠,這對慘應(yīng)于釋今放由某阿個信號贊燈控制捎的資源榆。如果攀指定了糧SEM淋_UN童DO標(biāo)卵志,就貪從相應(yīng)濱信號燈擁的se臥mad鉤j值中續(xù)減掉s轎em_誦op的涉值。如果se牧m_op眉是0,那都么調(diào)用者乘希望等待足到sem浩val變喇為0,如筒果sem槽val已耐經(jīng)是0,謙則立即返鋤回;如果嚇semv似al不為聯(lián)0,相應(yīng)埋信號燈的余semz劃cnt(勇等待se父mval生變?yōu)?的素線程數(shù))夢值就加1繪,調(diào)用線跨程阻塞到漂semv藥al變?yōu)樨?(那時涂semz咽cnt再茫減1)。市若指定了匠IPC_臉NOWA航IT,則晃調(diào)用線程包不會睡眠翠,返回E娛AGAI秤N。如果s左em_品op是診負數(shù),計那么調(diào)高用者希濱望等待姐sem年val腫變?yōu)榇笈R于或等騾于se大m_o千p的絕劫對值,句這對應(yīng)逆于分配噴資源。頑如果s僵emv扛al大葡于或等秩于se愧m_o塞p的絕遠對值,先則從s趴emv妄al中衡減掉s僚em_槳op的晴絕對值混,如果姓指定了錦SEM怪_UN云DO,錦那么s家em_吩op的畏絕對值約就加到尺相應(yīng)信范號燈的渾sem距adj炎值上。刷如果s霞emv償al小樸于se滿m_o染p的絕栽對值,贈相應(yīng)信杏號燈的逝sem丘ncn溜t值就件加1,偏調(diào)用線巷程阻塞聲直到s驚emv陷al變?nèi)鐬榇笥跓峄虻扔趽Psem鵝_op厲的絕對閱值。若達指定了拔IPC鑰_NO摔WAI偏T,則冶調(diào)用線際程不會陽睡眠,賠返回E豬AGA拜IN。sem聞adj斧稱為指驕定信號恐燈針對旨調(diào)用進功程的調(diào)虜整值。圣當(dāng)調(diào)用簡進程終擋止時,干sem碗adj庭的值就拔加到相交應(yīng)信號宵燈的s炊emv擠al上維。若調(diào)屢用進程頭對某個磨信號燈脖的全部適操作都淘指定S擋EM_者UND睡O標(biāo)志測,則該繡進程終似止時,劈燕該信號乓燈的值潔就會變詞得像根效本沒有品運行過愛該進程碗一樣,虎這就是面復(fù)舊(罪und扇o)的刻本意。sem陷op的濁調(diào)用問不題sem載op采下用復(fù)雜送的信號醋燈集做爛參數(shù),求因此造俱成程序希調(diào)用變?nèi)缘脧?fù)雜基.信號燈的銷值加1,呆或值減1藝都在se稿mop完鏡成,相當(dāng)哄于加鎖或嗎解鎖都是咐有一個函防數(shù)完成,細這也是與擇其它互質(zhì)災(zāi)量等其它顯同步機制記不一樣的矛地方一般是扶將其封悟裝成P完,V原趕語的函宣數(shù)來操諒作/*申乘請資源,怪用P原語童*/int卸se贏map滅hor吊e_w湯ait漠_p(柱int緩se扯m_i孕d)占{str來uct綱se嗎mbu語fs析b;sb.s桐em_n奏um=辱0;sb.s稻em_o柳p=狐-1;sb.s董em_f結(jié)lg=間SEM桿_UND萬O;if(棒semo凈p(se磨m_id膊,&s失b,1全)==煎-1)佩{fpri糟ntf(席stde任rr,碑"sem邪apho執(zhí)re_p部fai鞏led\尿n");retu映rn(除-1);}ret輩urn艘0;}/*釋怪放或分配鬧資源用,佩用V原語版*/int稅sema域phor松e_si偏gnal缸_v(i抬nts漆em_i匆d){stru柄cts個embu蠻fsb心;sb.s椅em_n狡um=寨0;sb.粱sem舍_op虜=旱1;sb.s旋em_f藍lg=孩SEM撒_UND互O;if(推semo予p(se逃m_id念,&s角b,1蜘)==難-1)貍{fpri攻ntf(掘stde涌rr,澤"sem貨apho因re_v孝fai獅led\哈n");retu面rn(鈴-1);}ret乞urn場0;}semc頌tl函數(shù)#in洲clu攔de幅<sy砌s/s齡em.筋h>int遞se究mct振l(i距nt止sem包id,千in脆ts寄emn久um,起in點tc虜md,件…/揪*u具nio柔na堆rg頂*/)里;返回:客成功時耍為非負介值,出餐錯時為輛-1對一個信檔號燈執(zhí)行絨各種控制拖操作。sem托num制標(biāo)識某吊個信號活燈,s紹emn四um僅儲僅用于最GET搬VAL痰、SE卵TVA策L、G恒ETN把CNT蛙、GE氏TZC急NT和豈GET譯PID鑼命令。第四個參開數(shù)是可選句的,它依負賴于第三揭個參數(shù)c酷md。它恩是一個聯(lián)賠合:uni它on座sem求un翻{int兄val;盜/*隨used絞for免SET醬VAL縫only準(zhǔn)*/stru暖cts染emid區(qū)_ds短*buf傲;/*細use凳dfr防oIP案C_SE浪Tan衰dIP股C_ST米AT*齡/usho謝rt*既arra躍y;/撞*us漁edf慨orG聰ETAL患Lan醒dSE皺TALL羞*/};該聯(lián)合澆沒有出穿現(xiàn)在任漿何系統(tǒng)伙頭文件校中,由缸應(yīng)用程序序聲明參。而且探它是以淹值傳遞順的,而交不是以德引用傳晴遞的。semo皮p命令選眠項GET畫VAL奮:把s替emv喂al的牌當(dāng)前值雕作為函離數(shù)返回剩值返回真。SET土VAL巧:把s購emv際al設(shè)白置為a才rg.偵val靜。如果釣操作成撿功,那蔽么相應(yīng)英信號燈變在所在飯進程中動的調(diào)整隆值(s劃ema然dj)登將被置忌為0。GET磨PID講:把s莫emp襪id的祥當(dāng)前值扎作為函蠢數(shù)值返怖回。GET糟NCN萍T:把溉sem恩ncn齡t的當(dāng)泉前值作周為函數(shù)亦值返回利。GETZ依CNT:弄把sem口zcnt角的當(dāng)前值果作為函數(shù)列值返回。GET御ALL伍:返回翅所指定們信號燈世集的每駱個成員溝的se補mva黑l值。杜這些值針通過a握rg.證arr攔ay指察針返回倚。函數(shù)拔本身返腦回值為柴0。注曬意,調(diào)吃用者必財須分配軟足夠容尊納所指嶼定信號察燈集中嬸所有成貴員的s夏emv勵al值己的一個籌uns怖ign郵ed危sho跡rt整癥數(shù)數(shù)組陸,然后筑把ar遭g.a嶄rra皆y設(shè)置圾成指向錦這個數(shù)為組。SETA涂LL:設(shè)絹置所指定惹信號燈集仍中每個成類員的se川mval自值。這些醫(yī)值通過a戒rg.a殘rray億數(shù)組指定重。IPC筑_RM頂ID:摟把由s看emi杜d指定胡的信號足燈集從披系統(tǒng)中超刪除。IPC_顆SET:肉設(shè)置se廟mid_藥ds結(jié)構(gòu)略中的以下層三個成員村:sem搜_per減m.ui駝d、se居m_pe簡rm.g蘿id和s疫em_p身erm.缺mode滲。這些值掠來自由a注rg.b饅uf參數(shù)嗚指向的結(jié)晉構(gòu)中相應(yīng)仍成員。s洽emid顏_ds中灣的sem擾_cti錢me成員敞也被設(shè)置休為當(dāng)前值斗。IPC古_ST陜AT:鋼通過a榆rg.喂buf唇參數(shù)返治回當(dāng)前顛的se談mid憤_ds漠結(jié)構(gòu)。關(guān)注意,途調(diào)用者鹿必須首示先分配峽一個s厚emi懂d_d斑s結(jié)構(gòu)昌,并把嫁arg瘡.bu萬f設(shè)置扇為指向伍這個結(jié)吵構(gòu)。Sys苦tem債V說共享內(nèi)膏存桂電嵌血入式交得流群:迅156甚619砍189共享內(nèi)存福數(shù)據(jù)表示對于每煮個Sy鏈ste漸mV艙共享內(nèi)泛存區(qū),跟內(nèi)核維癢護如下灑的信息們結(jié)構(gòu):stru崗cts證hmid抱_ds戚{stru釋cti冰pc_p野erm賭shm_仆perm裁;/*獎ope任rati寸onp參ermi汽ssio濱nst壇ruct白*/siz資e_t瘋sh網(wǎng)m_s途egs巷z;鞏/*恢siz剖eo修fs番egm山ent建in缸by法tes忍*/pid漫_t愛shm床_lp死id;萌/*護pi擱do猛fl指ast罩sh務(wù)mop鏡*/pid獵_t得shm優(yōu)_cp遇id;殘/*繼pi難do任fc酷rea廳tor轟*/shma狼tt_t井shm告_nat惜tch;陰/*愛curr干ent停#at假tach改ed*獨/shma幸t_t租shm_擋cnat子tch;牛/*尚in-c乏ore潤#at福tach傘ed*蠻/time餓_ts鬧hm_a示time偵;/*樂las信tsh張mat服time應(yīng)*/tim潤e_t盟sh瞞m_d謊tim疾e;黃/*愧las秤ts尚hmd袋tt悠ime料*/tim技e_t蘭sh巧m_c翻tim淹e;宇/*誕las事tc蒙han乘ge退tim袍e*賢/};Sys欲tem溜V爐共享內(nèi)邊存使用麻流程使用頭文活件#inc瓦lude養(yǎng)<sy溫s/ip均c.h>#inc艷lude養(yǎng)<sy潑s/sh旅m.h>shmg穿et()胖獲得共單享內(nèi)存區(qū)導(dǎo)域的ID如果不笨存在指蠅定的共倡享區(qū)域敢就創(chuàng)建鈔相應(yīng)的剃區(qū)域。int園shmg岡et(k夸ey_t售key枝,int探siz捆e,in千t
sh罷mflg蹄);shma建t()把競共享內(nèi)存類區(qū)域映射狐到調(diào)用進初程的地址李空間中去這樣,進貿(mào)程就可以狡方便地對奪共享區(qū)域警進行訪問躺操作。voi旁d
*遲shm菌at(華int闖sh銅mid使,co富nst唐vo葉id威*sh碰mad諷dr,餡int俘sh敘mfl鞋g);shm蔥dt(誼)調(diào)用霧用來解訂除進程洞對共享樂內(nèi)存區(qū)繁域的映召射int集shmd剝t(co匹nst昏void但*sh回madd惕r);Shm掀ctl蘋()實露現(xiàn)對共拴享內(nèi)存滲區(qū)域的拴控制操蜓作int采sh奮mct曠l(i磨nt走shm寫id,育int朱cm失d,s競tru聯(lián)ct扣shm授id_短ds運*bu涉f);shm矛get解函數(shù)#inc恥lude復(fù)<sy桿s/sh職m.h>int砍shmg防et(k駕ey_t厚key按,si規(guī)ze_t曾siz搶e,i緊nto喉flag待);返回:成經(jīng)功時為共頭享內(nèi)存區(qū)斑對象,出種錯時為-幼1函數(shù)創(chuàng)建揉一個尚未翼存在的共菠享內(nèi)存區(qū)窗,或者訪版問一個已獻存在的共腔享內(nèi)存區(qū)砍。返回值是穴共享內(nèi)存掏區(qū)標(biāo)識符頃,供其他鍵函數(shù)使用則。size依參數(shù)以字醬節(jié)為單位疲指定內(nèi)存婚的大小。慰當(dāng)實際操萄作為創(chuàng)建禾一個新的杯內(nèi)存區(qū)時小,必須指竊定一個不蛇為0的s犁ize值故;如果實旨際操作是乏訪問一個稻已存在的德共享內(nèi)存孕區(qū),則s秤ize應(yīng)仙為0。當(dāng)實際伴操作為習(xí)創(chuàng)建一島個新的般內(nèi)存區(qū)喜時,該葬內(nèi)存區(qū)寫被初始摧化為s尿ize已個字節(jié)掀的0。shm悼at函富數(shù)#inc別lude慎<sy小s/sh林m.h>void予*s暗hmat棒(int魄shm惡id,拌cons舊tvo殺id*其shma熱ddr,窗int區(qū)fla近g);返回:杠成功時疊為映射基區(qū)的其膛始地址頌,出錯撇時為-斗1調(diào)用sh州mat將岡共享內(nèi)存奧區(qū)附接到贊調(diào)用進程殿的地址空綢間。shmi靈d是sh鄙mget誤的返回值幸。shm俗at的返炮回值是所焰指定的共地享內(nèi)存區(qū)會在調(diào)用進烏程內(nèi)的起押始地址。牲確定此地與址的規(guī)則殊如下:如果s喜hma御ddr敗是空指夜針,則翼系統(tǒng)替流調(diào)用者羽選擇地檢址。這銳是推薦攜(也是掙可移植臘性最好舊的)方羨法。如果sh偷madd并r非空,蘇則返回地貨址取決于蛇調(diào)用者是表否給fl住ag參數(shù)桂指定了S墊HM_R同ND值。品如果SH猴M_RN點D沒有指浸定,則共閱享內(nèi)存區(qū)呢附接到由拾shma敵ddr指偏定的地址辰;若指定導(dǎo)SHM_芹RND,圾則附接到科由shm附addr日指定的地沃址向下舍姿入一個S燈HMLB園A常值。劈燕LBA代饅表“低端堪邊界地址漢(low醬erb晃ound翠ary盒addr漿ess)賽”。flag稈參數(shù)可以紅指定SH責(zé)M_RD食ONLY級值,它限娛定只讀訪哨問。shm錦dt函康數(shù)#in云clu雖de摩<sy君s/s腔hm.它h>int溉sh平mdt羽(co非nst姨vo際id豆*sh縮慧mad反dr)軌;返回:成聚功時為0熟,出錯時暮為-1調(diào)用s眼hmd豎t斷開售與共享園內(nèi)存區(qū)開的連接告。當(dāng)一個鞏進程終肯止時,狀它的所針有當(dāng)前揀附接著奏的共享速內(nèi)存區(qū)脹都自動蓄斷接掉牙。shm挨ctl遣函數(shù)#inc曠lude約<sy糞s/sh聯(lián)m.h>int朵shmc像tl(i散nts墾hmid宰,in饅tcm里d,s管truc賊tsh屯mid_窗ds*娛buff垮);返回:茄成功時唱為0,淚出錯時贏為-1函數(shù)提乒供三個杰命令:IPC_背RMID類:從系統(tǒng)膀中刪除由晝shmi罷d標(biāo)識的員共享內(nèi)存貞區(qū)并拆除鹿它。IPC_愉SET:妙給所指定滑的共享內(nèi)央存區(qū)設(shè)置虧其shm涼id_d揭s結(jié)構(gòu)的齊以下三個毯成員:s史hm_p柱erm.咽uid、概shm_米perm胃.gid項和shm紡_per垮m.mo礎(chǔ)de,它異們的值來尋自參數(shù)中上的相應(yīng)成留員。sh餅m_ct蘇ime的催值用當(dāng)前鼠時間替換晚。IPC塞_ST瓜AT:牲向調(diào)用慢者返回沿所指定錦共享內(nèi)虛存區(qū)的科當(dāng)前s脆hmi躲d_d輪s結(jié)構(gòu)黎。關(guān)于S兄yst澇em珍V的維匹護命令可以用考ipc偽s命令佛查看s毛yst鴨em誘V對象用ip己crm種可以刪若除sy瀉ste邀mV胡對象ipcr互mse依m(xù)19舍6632刪除se宋mid驅(qū)為19導(dǎo)6632變的信號量ipcr庫msh斑m12勺395刪除sh啟mid諷為12付395的捉共享內(nèi)存ipcr肅mms撕g23鄰4刪除m劣sgi玩d為穩(wěn)234堂的消息位隊列POSI府XIP續(xù)C接口桂電嵌入怖式交流群剩:156移6191宗89兩大類應(yīng)脹用接口區(qū)中別Sys拆tem門V肢IPC瞧存在時能間比較侍老,許晨多系統(tǒng)肥都支持頸,而P娃osi過xI餃PC是腥新出的誘標(biāo)準(zhǔn).餐很多嵌取入式平巧臺只支匹持Sy蛇ste瓜mV電的接仆口Sys往tem貍V的震接口相吸對復(fù)雜紡,而P唉OSI茄X比較競簡單,迫優(yōu)先選伸擇后者遇.參見sy靜stem襖V的信煤號量和P傘osix袍信號量的屑操作比較POS歲IX發(fā)IPC輕是線程諒安全的Sys氏tem炕V內(nèi)息置在g營lib逼c中,淹因此所麥有使用套gli場bc庫下的環(huán)境扔都可以旱使用,清POS映IX浸IPC讀的使用漂必須鏈近接li依brt救.XX趁X庫,桿(即使持用-l軋rt參消數(shù))POSI特X消息抬隊列接口名稱目的mq_open(3RT)
連接到以及創(chuàng)建(可選)命名消息隊列mq_close(3RT)
結(jié)束到開放式消息隊列的連接mq_unlink(3RT)
結(jié)束到開放式消息隊列的連接,并在最后一個進程關(guān)閉此隊列時將其刪除mq_send(3RT)
將消息放入隊列mq_receive(3RT)
在隊列中接收(刪除)最早且優(yōu)先級最高的消息mq_notify(3RT)
通知進程或線程消息已存在于隊列中mq_setattr(3RT),mq_getattr(3RT)
設(shè)置或獲取消息隊列屬性POS豎IX消緣瑞息隊列設(shè)使用使用頭文健件mqu并eue.找h隊列數(shù)寒據(jù)結(jié)構(gòu)件mq掛d_t打開隊能列mqd墻_t惰mq_臥ope霞n(c術(shù)ons睡tc廢har衣*n遣ame游,i瓜nt劣ofl戰(zhàn)ag,參/*鼓un翁sig菌ned謊lo乞ng蜘mod侵e,蹈mq_棗att組ra請ttr延*/撕..穗.);關(guān)閉隊涉列POSI例X信號詞量Posi拘x信號量尺的使用遠渡比Sys鴨tem蜜V信號量壤簡單.而貨且支持多拳種操作系炒統(tǒng).sem_覺open遲(3RT角)連接到頸以及創(chuàng)狀建(可擾選)命土名信號痰量sem洋_in擇it(壟3RT畝)初始化信樂號量結(jié)構(gòu)被(在調(diào)用之程序內(nèi)部劇,因此不爬是命名信墨號量)sem雅_cl于ose魚(3R茫T)結(jié)束到打挽開信號量辛的連接sem俗_un懸lin泉k(3池RT)結(jié)束到打犬開信號量浩的連接,頭并在最后槳一個進程綿關(guān)閉此信喜號量時將榴其刪除sem慌_de襯str陶oy(績3RT悼)銷毀信史號量結(jié)寶構(gòu)(在到調(diào)用程形序內(nèi)部拉,因此歌不是命料名信號魯量)sem_庫getv還alue祖(3RT激)將信號量煤的值復(fù)制督到指定整盜數(shù)中sem轉(zhuǎn)_wa鼻it(四3RT侄)、sem映_tr滾ywa久it(垃3RT狐)當(dāng)其他巷進程擁攝有信號細量時進杠行阻塞愚,或者拖當(dāng)其他肺進程擁仗有信號詳量時返跪回錯誤sem_雄post罵(3RT速)遞增信號甩量計數(shù)POSI蜂X共享內(nèi)腔存桂電嵌懷入式交甚流群:給156供619徹189共享內(nèi)代存共享內(nèi)溪存可以漁說是最綁有用的房誠進程間旬通信方肺式,也始是最快凡的IP應(yīng)C形式土。兩個表不同進鴨程A、輪B共享洗內(nèi)存的辦意思是拌,同一頓塊物理狡內(nèi)存被篩映射到殲進程A動、B各草自的進秀程地址振空間。爐進程A蘆可以即賓時看到縱進程B參對共享拜內(nèi)存中掏數(shù)據(jù)的忘更新,嫌反之亦朋然。由于多個軍進程共享丈同一塊內(nèi)輕存區(qū)域,越必然需要限某種同步注機制,互磚斥鎖和信菜號量都可塑以。共享內(nèi)效存通信疑的一個飲顯而易筍見的好餅處是效潑率高,細因為進灑程可以好直接讀驢寫內(nèi)存燈,而不獵需要任細何數(shù)據(jù)筐的拷貝墳。對于越像管道萄和消息倆隊列等租通信方符式,則桿需要在淚內(nèi)核和旁用戶空板間進行申四次的眨數(shù)據(jù)拷扛貝,而掉共享內(nèi)或存則只遞拷貝兩擦次數(shù)據(jù)并[1]失:一次購從輸入洽文件到香共享內(nèi)短存區(qū),醬另一次勻從共享低內(nèi)存區(qū)知到輸出伍文件。共享內(nèi)漂存廣泛君被應(yīng)用扇數(shù)據(jù)庫儉系統(tǒng)實抵現(xiàn)到驅(qū)爺動程序貼各種應(yīng)察用共享內(nèi)捉存的實扯現(xiàn)Lin嗓ux有懸三種共嚷享內(nèi)存踏實現(xiàn)機天制mmap偵()Syst付emV危共享內(nèi)最存Pos挪ix亞共享內(nèi)攜存前兩者較犁為常用系統(tǒng)調(diào)燈用mm螺ap(時)通過惰映射一暫個普通派文件實觀現(xiàn)共享村內(nèi)存。虜系統(tǒng)V猶則是通纏過映射陽特殊文榜件系統(tǒng)星shm影中的文嚷件實現(xiàn)度進程間梨的共享芽內(nèi)存通歡信。也顯就是說艘,每個循共享內(nèi)打存區(qū)域瓣對應(yīng)特栽殊文件側(cè)系統(tǒng)s柴hm中輝的一個溉文件(房誠這是通扛過sh群mid熄_ke任rne爪l結(jié)構(gòu)御聯(lián)系起浸來的)mmapmma來p函數(shù)環(huán)把一個逝文件或否一個P喇osi陡x共享連內(nèi)存區(qū)浮對象映呀射到調(diào)冒用進程鋸的地址察空間。緊使用該章函數(shù)有證三個目心的:1.使用皺普通文件株以提供內(nèi)閃存映射I肚/O2.使辛用特殊淚文件以療提供匿齡名內(nèi)存桶映射。3.使青用sh歷m_o疊pen六以提供裁無親緣弦關(guān)系進防程間的島Pos獻ix共澤享內(nèi)存詳區(qū)mmap都-創(chuàng)建一消個共享內(nèi)躬存區(qū)名稱::mmap功能:把I/O文件映射到一個存儲區(qū)域中頭文件:#include<sys/mman.h>函數(shù)原形:void*mmap(void*addr,size_tlen,intprot,intflag,intfiledes,off_toff);參數(shù):addr
指向映射存儲區(qū)的起始地址,addr參數(shù)用于指定映射存儲區(qū)的起始地址。通常將其設(shè)置為NULL,這表示由系統(tǒng)選擇該映射區(qū)的起始地址。len
映射的字節(jié)prot
對映射存儲區(qū)的保護要求flag
flag標(biāo)志位filedes
要被映射文件的描述符,在映射該文件到一個地址空間之前,先要打開該文件。len是映射的字節(jié)數(shù)。off
要映射字節(jié)在文件中的起始偏移量,通常將其設(shè)置為0。返回值:若成功則返回映射區(qū)的起始地址,若出錯則返回MAP_FAILEDmma犬p參數(shù)諒說明prot逗參數(shù)說明畢對映射存喜儲區(qū)的保衣護要求。蠢可將pr余ot參數(shù)悠指定為P纏ROT_擋NONE緩,或者是陳PROT泄_REA真D(映射嫂區(qū)可讀)祖,PRO濤T_WR登ITE(滴映射區(qū)可雅寫),P壁ROT_悅EXEC鉗(映射區(qū)性可執(zhí)行)縣任意組合伶的按位或號,也可以顯是PRO拼T_NO敢NE(映痰射區(qū)不可碼訪問)。胞對指定映鞠射存儲區(qū)丑的保護要勾求不能超幅過文件o啞pen模徒式訪問權(quán)淘限。fla闊g參數(shù)更影響映噴射區(qū)的促多種屬薄性:MAP_更FIXE忘D返回渣值必須等有于add烏r.因為其這不利于礎(chǔ)可移植性粘,所以不樣鼓勵使用忍此標(biāo)志。MAP寇_SH梳ARE鼻D這亦一標(biāo)志府說明了委本進程斃對映射催區(qū)所進奧行的存皇儲操作反的配置聰。此標(biāo)殿志指定硬存儲操任作修改仗映射文烤件。MAP患_PR刃IVA夾TE腰本標(biāo)志餐導(dǎo)致對思映射區(qū)極建立一俱個該映嫁射文件斤的一個百私有副稀本。所針有后來茄對該映蹄射區(qū)的否引用都傻是引用咸該副本來,而不拖是原始竟文件。要注意遍的是必殼須指定怎MAP解_FI份XED叢或MA鉗P_P超RIV棟ATE信標(biāo)志其紀中的一戒個,指周定前者嫁是對存捧儲映射杠文件本仰身的一層個操作雪,而后瓦者是對堵其副本棟進行操佩作。unmm丘ap取消便一個共享玻內(nèi)存名稱::munmap功能:解除存儲映射頭文件:#include<sys/mman.h>函數(shù)原形:intmunmap(caddr_taddr,size_tlen);參數(shù):addr
指向映射存儲區(qū)的起始地址,其中addr參數(shù)是由mmap返回的地址,len
映射的尺寸。再次訪問這些地址導(dǎo)致向調(diào)用進程產(chǎn)生一個SIGSEGV信號。
返回值:若成功則返回0,若出錯則返回-1名稱::msync功能:同步文件到存儲器頭文件:#include<sys/mman.h>函數(shù)原形:intmsync(void*addr,size_tlen,intflags);參數(shù):addr
指向映射存儲區(qū)的起始地址len
映射的字節(jié)prot
flags返回值:若成功則返回0,若出錯則返回-1posi民x共享內(nèi)貓存pos脈ix共仰享內(nèi)存氣區(qū)涉及累兩個步鉛驟:1、指定德一個名字療參數(shù)調(diào)用例shm_壩open斥,以創(chuàng)建護一個新的束共享內(nèi)存膀區(qū)對象或酒打開一個孩以存在的原共享內(nèi)存顛區(qū)對象。2、調(diào)夾用mm桑ap把宮這個共鬼享內(nèi)存匠區(qū)映射退到調(diào)用顫進程的剩地址空庸間。傳蛙遞給s趨hm_恥ope狹n的名鐘字參數(shù)幼隨后由席希望共察享該內(nèi)墨存區(qū)的費任何其迫他進程港使用。shm_調(diào)open論打開共享侍內(nèi)存名稱::shm_open功能:打開或創(chuàng)建一個共享內(nèi)存區(qū)頭文件:#include<sys/mman.h>函數(shù)原形:intshm_open(constchar*name,intoflag,mode_tmode);參數(shù):name
共享內(nèi)存區(qū)的名字cflag
標(biāo)志位,oflag參數(shù)必須含有O_RDONLY和O_RDWR標(biāo)志,還可以指定如下標(biāo)志:O_CREAT,O_EXCL或O_TRUNC.mode
權(quán)限位返回值:shm_open的返回值是一個整數(shù)描述字,它隨后用作mmap的第五個參數(shù)刪除一孔個共享嚼內(nèi)存區(qū)名稱::shm_unlink功能:刪除一個共享內(nèi)存區(qū)頭文件:#include<sys/mman.h>函數(shù)原形:intshm_unlink(constchar*name);參數(shù):name
共享內(nèi)存區(qū)的名字返回值:成功返回0,出錯返回-1共享內(nèi)染存的應(yīng)貴用共享內(nèi)屈存是在鉗進程之勺間開辟踏一個原摟始的內(nèi)縮慧存bu轎ffe幟r,因甘此是進祝程之間巷傳輸大廢量數(shù)據(jù)稼最快的蔬方式大量數(shù)情據(jù)庫在聲Uni門x/L未inu弟x上實鳳現(xiàn)內(nèi)存辮分配,淋都是采的用共享巴內(nèi)存自駛行分配但共享內(nèi)險存沒有同督步和鎖機趨制,所以念必須配合降信號量或武互斥鎖進烤行加鎖參見共養(yǎng)享內(nèi)存慮實現(xiàn)服粉務(wù)器和幫客戶端棕例
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南活動策劃方案公司(3篇)
- 班級服務(wù)與安全管理制度(3篇)
- 病理科試劑管理制度(3篇)
- 美國非稅收入管理制度(3篇)
- 設(shè)備創(chuàng)新工作管理制度(3篇)
- 《GA 814-2009警用約束帶》專題研究報告:技術(shù)創(chuàng)新、應(yīng)用深化與未來展望
- 納稅評估培訓(xùn)
- 中學(xué)學(xué)生社團活動風(fēng)險管理制度
- 養(yǎng)老院消防通道及疏散預(yù)案制度
- 2026河北省定向長安大學(xué)選調(diào)生招錄考試備考題庫附答案
- 2026年年長租公寓市場分析
- 生態(tài)環(huán)境監(jiān)測數(shù)據(jù)分析報告
- 金融機構(gòu)衍生品交易操作規(guī)范
- 醫(yī)院檢查、檢驗結(jié)果互認制度
- 學(xué)堂在線 雨課堂 學(xué)堂云 實繩結(jié)技術(shù) 章節(jié)測試答案
- 110kV線路運維方案
- 智能化弱電工程常見質(zhì)量通病的避免方法
- 《中國古代文學(xué)通識讀本》pdf
- 罐區(qū)加溫操作規(guī)程
- 昆明醫(yī)科大學(xué)第二附屬醫(yī)院進修醫(yī)師申請表
- 國有企業(yè)干部選拔任用工作系列表格優(yōu)質(zhì)資料
評論
0/150
提交評論