




已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Linux下的消息隊(duì)列的使用SUNNY.MAN一、消息隊(duì)列的基本概念消息隊(duì)列 (也叫做報(bào)文隊(duì)列)是Unix系統(tǒng)V版本中進(jìn)程間通信機(jī)制之一。消息隊(duì)列就是一個(gè)消息的鏈表。就是把消息看作一個(gè)記錄,并且這個(gè)記錄具有特定的格式以及特定的優(yōu)先級(jí)。對消息隊(duì)列有寫權(quán)限的進(jìn)程可以按照一定的規(guī)則添加新消息;對消息隊(duì)列有讀權(quán)限的進(jìn)程則可以從消息隊(duì)列中讀出消息。Linux采用消息隊(duì)列的方式來實(shí)現(xiàn)消息傳遞。這種消息的發(fā)送方式是:發(fā)送方不必等待接收方檢查它所收到的消息就可以繼續(xù)工作下去,而接收方如果沒有收到消息也不需等待。新的消息總是放在隊(duì)列的末尾,接收的時(shí)候并不總是從頭來接收,可以從中間來接收。消息隊(duì)列是隨內(nèi)核持續(xù)的并和進(jìn)程相關(guān),只有在內(nèi)核重起或者顯示刪除一個(gè)消息隊(duì)列時(shí),該消息隊(duì)列才會(huì)真正被刪除。因此系統(tǒng)中記錄消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu) (struct ipc_ids msg_ids)位于內(nèi)核中,系統(tǒng)中的所有消息隊(duì)列都可以在結(jié)構(gòu)msg_ids中中找到訪問入口。IPC標(biāo)識(shí)符:每一個(gè)I P C目標(biāo)都有一個(gè)唯一的I P C標(biāo)識(shí)符。這里所指的I P C目標(biāo)是指一個(gè)單獨(dú)的消息隊(duì)列、一個(gè)信號(hào)量集或者一個(gè)共享的內(nèi)存段。系統(tǒng)內(nèi)核使用此標(biāo)識(shí)符在系統(tǒng)內(nèi)核中指明 I P C目標(biāo)。IPC 關(guān)鍵字:想要獲得唯一的標(biāo)識(shí)符,則必須使用一個(gè) I P C關(guān)鍵字??蛻舳诉M(jìn)程和服務(wù)器端進(jìn)程必須雙方都同意此關(guān)鍵字。這是建立一個(gè)客戶機(jī)/服務(wù)器框架的第一步。一般情況下,可以使用ftok ( )函數(shù)為客戶端和服務(wù)器端產(chǎn)生關(guān)鍵字值。#include #include key_t ftok( const char * fname, int id ) fname就是你指定的文件名(已經(jīng)存在的文件名),一般使用當(dāng)前目錄,如: key_t key; key = ftok(., 1); 這樣就是將fname設(shè)為當(dāng)前目錄。id是子序號(hào)在一般的UNIX實(shí)現(xiàn)中,是將文件的索引節(jié)點(diǎn)號(hào)取出,前面加上子序號(hào)得到key_t的返回值。如指定文件的索引節(jié)點(diǎn)號(hào)為65538,換算成16進(jìn)制為0x010002,而你指定的ID值為38,換算成16進(jìn)制為0x26,則最后的key_t返回值為0x26010002。查詢文件索引節(jié)點(diǎn)號(hào)的方法是: ls -i當(dāng)刪除重建文件后,索引節(jié)點(diǎn)號(hào)由操作系統(tǒng)根據(jù)當(dāng)時(shí)文件系統(tǒng)的使用情況分配,因此與原來不同,所以得到的索引節(jié)點(diǎn)號(hào)也不同。 如果要確保key_t值不變,要么確保ftok的文件不被刪除,要么不用ftok,指定一個(gè)固定的key_t值,比如: #define IPCKEY 0x111 char path256; sprintf( path, %s/etc/config.ini, (char*)getenv(HOME) ); msgid=ftok( path, IPCKEY );也就是說其實(shí)ftok的作用就是根據(jù)你所指定的文件的索引點(diǎn)號(hào)生成一個(gè)獨(dú)一無二的KEY,并保持。不過在使用的過程中,一般都是直接指定一個(gè)固定的值,這樣使用起來簡單,但一定要確保和其它程序不沖突。二、使用消息隊(duì)列查看一個(gè)系統(tǒng)中的消息可以用ipcs q來查看,這可以看到msgid和權(quán)限以及當(dāng)前有幾條消息。當(dāng)你在調(diào)試的過程中,由于程序沒有正常結(jié)束,而你又想刪除此消息時(shí),請使用ipcrm q msgid命令。下面結(jié)合具體的實(shí)例代碼詳細(xì)說明一下使用的過程。Snd.c文件#include #include #include #include #include #include #include #define MAX_TEXT 512#define MSG_KEY 335struct my_msg_st long my_msg_type;/這個(gè)就是消息的類型,在接收的時(shí)候一定要指定這個(gè)/類型才會(huì)接收到相應(yīng)的消息。char some_textMAX_TEXT;int main()int i = 10;int running = 1;struct my_msg_st some_data;int msgid;char bufferBUFSIZ;msgid = msgget(key_t)MSG_KEY, IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR);/首先創(chuàng)建,如果不成功,就取得if(msgid=-1)printf(create faile get imsgidn);msgid=msgget(key_t)MSG_KEY,IPC_EXCL|S_IRUSR|S_IWUSR);if (msgid = -1) fprintf(stderr, msgget failed with error: %dn, errno);exit(EXIT_FAILURE);while(running) printf(%dEnter some text: less than %dn,msgid,MAX_TEXT);fgets(buffer, BUFSIZ, stdin);some_data.my_msg_type = 10;strcpy(some_data.some_text, buffer); if (msgsnd(msgid, (void *)&some_data, sizeof(some_data), 0) = -1) fprintf(stderr, msgsnd failedn); exit(EXIT_FAILURE); if(strncmp(buffer, end, 3) = 0) running = 0; exit(EXIT_SUCCESS);Rcv.c文件#include #include #include #include #include #include #include #include #define MAX_TEXT 512#define MSG_KEY 335struct my_msg_st long my_msg_type; char some_textMAX_TEXT; int main() int running = 1; int msgid; struct my_msg_st some_data; long int msg_to_receive = 10; msgid = msgget(key_t)MSG_KEY, IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR);if(msgid=-1)msgid=msgget(key_t)MSG_KEY,IPC_EXCL|S_IRUSR|S_IWUSR); if (msgid = -1) fprintf(stderr,msgget failed with error: %dn,errno); exit(EXIT_FAILURE); printf(prepare receive msg:%dn,msgid);while(running) /這里的msg_to_receive指定了接收消息的類型,如果類型不對,將取不到消息.IPC_NOWAIT果消息隊(duì)列里沒有消息,則馬上返回并設(shè)置errno=ENOMSG。如果指定為0則將等待消息的到來。 if (msgrcv(msgid,(void *)&some_data,sizeof(some_data),msg_to_receive,IPC_NOWAIT) = -1) if(ENOMSG=errno)printf(no Msg receiven);continue; fprintf(stderr, msgrcv failed with error: %dn, errno); exit(EXIT_FAILURE); printf(You wrote: %s, some_data.some_text); if (strncmp(some_data.some_text, end, 3) = 0) running = 0; if (msgctl(msgid, IPC_RMID, 0) = -1) /使用這個(gè)庫函數(shù)來移除消息隊(duì)列。 fprintf(stderr, msgctl(IPC_RMID) failedn); exit(EXIT_FAILURE); exit(EXIT_SUCCESS);.三、消息隊(duì)列的相關(guān)參數(shù)1.查看系統(tǒng)中默認(rèn)的消息隊(duì)列的相關(guān)參數(shù)Ipcs l可以查看當(dāng)前消息隊(duì)列的上限限制。- Messages: Limits -max queues system wide = 16 2Gmax size of message (bytes) = 65536 2Gdefault max size of queue (bytes) = 65536 2Gmsgmni 最大消息隊(duì)列數(shù) msgmax 最大消息長度(字節(jié)數(shù))msgmnb 消息隊(duì)列中的最大字節(jié)數(shù)其實(shí)我們要關(guān)心的參數(shù)主要有三個(gè),說得通俗點(diǎn)就是最多可以有多少個(gè)隊(duì)列使用,每個(gè)隊(duì)列里可以放多少消息,每個(gè)消息最多可以帶多少內(nèi)容?,F(xiàn)在解釋如下:系統(tǒng)中默認(rèn)的消息列數(shù)是16,最大可以達(dá)到2G,系統(tǒng)中消息的個(gè)數(shù)和消息長度的總數(shù),受隊(duì)列最大尺寸限制。Msgmnb= msgmax*最大個(gè)數(shù).其中消息隊(duì)列的長度受結(jié)構(gòu)使用。struct my_msg_st long my_msg_type;char some_textMAX_TEXT;大家如果有興趣,可以自己寫個(gè)程序測試試下,簡單的很就是無限制分配就可以了。修改消息隊(duì)列的參數(shù)1.永久修改root用戶下修改/etc/sysctl.conf 文件。2.臨時(shí)修改root用戶下sysctl -w kernel.msgmnb= 1048576/proc/sys/kernel/msgmax 單個(gè)消息的最大值/proc/sys/kernel/msgmnb 單個(gè)消息體的容量的最大值/proc/sys/kernel/msgmni 消息體的數(shù)量缺省值為16cat /proc/sys/kernel/shmmax可通過下面的方式進(jìn)行設(shè)置echo 819200 /proc/sys/kernel/msgmaxecho 1638400 /proc/sys/kernel/msgmnb echo 1600 /proc/sys/kernel/msgmni cd /proc/sys/kernel ; cat msgmax;cat msgmnb; cat msgmni;在程序中可以通過msgctl(msgid,IPC_STAT,&mymsq_ds);printf(%d,%d,%dn,mymsq_ds.msg_qbytes,mymsq_ds.msg_qnum,mymsq_ds.msg_cbytes
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公路工程材料性能試驗(yàn)試題及答案
- 測試文檔的類型及作用試題及答案
- 2025年機(jī)電工程關(guān)鍵點(diǎn)試題及答案
- 了解嵌入式視頻處理技術(shù)試題及答案
- 軟件測試管理經(jīng)驗(yàn)分享試題及答案總結(jié)
- 嵌入式系統(tǒng)中驅(qū)動(dòng)程序開發(fā)試題及答案
- 創(chuàng)新驅(qū)動(dòng)的數(shù)字化教育轉(zhuǎn)型模式
- 教育信息化數(shù)字孿生技術(shù)的創(chuàng)新應(yīng)用
- 民間故事播客節(jié)目行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 大數(shù)據(jù)驅(qū)動(dòng)的精準(zhǔn)廣告投放行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 高壓氧治療注意事項(xiàng)及操作規(guī)范指南
- 職業(yè)中等專業(yè)學(xué)校新能源汽車運(yùn)用與維修專業(yè)人才培養(yǎng)方案
- 圓錐式破碎機(jī)施工方案
- 中職英語技能大賽模擬試題(一)
- 《隧道工程》復(fù)習(xí)考試題庫(帶答案)
- 自來水廠調(diào)試方案
- 高速鐵路-軌道控制網(wǎng)CPIII測量課件
- 全過程造價(jià)咨詢投資控制目標(biāo)承諾及保證措施
- 第七版外科護(hù)理學(xué)-骨折病人的護(hù)理課件
- 三級(jí)醫(yī)院危重癥和疑難復(fù)雜疾病目
- 分?jǐn)?shù)的加法和減法教材分析課件
評(píng)論
0/150
提交評(píng)論