linux 声明消息函数,linux消息队列函数--解析
#include www.2cto.com
---------------------------------------------------------------------
1、系統(tǒng)建立IPC通訊(如消息隊列、共享內(nèi)存時)必須指定一個ID值。通常情況下,該id值通過ftok函數(shù)得到。
ftok原型如下:
key_t ftok( char * fname, int id )
fname就時你指定的文件名,id是子序號。
在一般的UNIX實現(xiàn)中,是將文件的索引節(jié)點號取出,前面加上子序號得到key_t的返回值。
如指定文件的索引節(jié)點號為65538,換算成16進制為0x010002,而你指定的ID值為38,換算成16 進制為0x26,則最后的key_t返回值為0x26010002。
查詢文件索引節(jié)點號的方法是: ls -i
當刪除重建文件后,索引節(jié)點號由操作系統(tǒng)根據(jù)當時文件系統(tǒng)的使用情況分配,因此與原來不同,所以得到的索引節(jié)點號也不同。
如果要確保key_t值不變,要目確保ftok的文件不被刪除,要么不用ftok,指定一個固定的key_t 值,比如:
#define IPCKEY 0x111
char path[256];
sprintf( path, "%s/etc/config.ini", (char*)getenv("HOME") );
msgid=ftok( path, IPCKEY );[/code]
同一段程序,用于保證兩個不同用戶下的兩組相同程序獲得互不干擾的IPC鍵值。
由于 etc/config.ini(假定)為應(yīng)用系統(tǒng)的關(guān)鍵配置文件,因此不存在被輕易刪除的問題——即使被刪,也會很快被發(fā)現(xiàn)并重建(此時應(yīng)用系統(tǒng)也將被重起)。
ftok()的設(shè)計目的也在于此。
----------------------------------------------------
2、int msgget(key_t key, int msgflg); //創(chuàng)建消息隊列
參數(shù):
key:消息隊列關(guān)聯(lián)的鍵。為IPC_PRIVATE時表示創(chuàng)建自己的消息隊列
msgflg:消息隊列的建立標志和訪問權(quán)限。msgflg 的低位用來確定消息隊列的訪問權(quán)限。
IPC_CREAT:如果 key不存在,創(chuàng)建
IPC_EXCL:如果 key 存在,返回失敗
IPC_NOWAIT:如果需要等待,直接返回錯誤
如果單獨使用IPC_CREAT,則msgget()要么返回一個新創(chuàng)建的消息隊列的標識符,要么返回具有相同關(guān)鍵字值的隊列的標識符。如果 IPC_EXCL和IPC_CREAT一起使用,則msgget()要么創(chuàng)建一個新的消息隊列,要么如果隊列已經(jīng)存在則返回一個失敗值-1。
返回說明:
如果成功,返回消息隊列標識符
如果失敗,則返回-1:errno=EACCESS(權(quán)限不允許)
EEXIST(隊列已經(jīng)存在,無法創(chuàng)建)
EIDRM(隊列標志為刪除)
ENOENT(隊列不存在)
ENOMEM(創(chuàng)建隊列時內(nèi)存不夠)
ENOSPC(超出最大隊列限制)
www.2cto.com
舉例:
msgid=msgget(IPC_PRIVATE,IPC_CREAT|IPC_EXCL|00666); //創(chuàng)建消息隊列
--------------------------------------------------
3、int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); //將消息送入消息隊列
參數(shù):
msqid:消息隊列的標識符。
msgp:指向消息緩沖區(qū)的指針,此位置用來暫時存儲發(fā)送和接收的消息,是一個用戶可定義的通用結(jié)構(gòu),形態(tài)如下
struct msgbuf {
long mtype;???? /* 消息類型,必須 > 0 */
char mtext[1];? /* 消息文本 */
};
msgsz:消息的大小。
msgflg:用來指明進程在隊列數(shù)據(jù)滿(msgsnd)或空(msgrcv)的情況下所應(yīng)采取的行動。
如果設(shè)置為 IPC_NOWAIT,則在消息隊列已滿時不發(fā)送消息并且調(diào)用進程立即返回錯誤信息EAGAIN。
如果設(shè)置為 0,則調(diào)用進程阻塞直至消息隊列不為滿。
返回說明:
成功執(zhí)行時,msgsnd()返回0, 失敗返回-1
舉例:msgsnd(g_msg_id,&msg_snd,sizeof(msg_snd.msg_item),IPC_NOWAIT); //非阻塞發(fā)送消息
----------------------------------------------------------
4、ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); //從消息隊列讀取信息
參數(shù):
msgtyp:
msgtyp = 0:收取隊列中的第一條消息,任意類型。
msgtyp > 0:收取第一條 msgtyp 類型的消息。
msgtyp < 0:收取第一條最低類型(小于或等于 msgtyp 的絕對值)的消息。
其他參數(shù)參考msgsnd函數(shù)。
返回說明:
成功執(zhí)行時,msgrcv()返回0, 失敗返回-1
舉例:msgrcv(msgid,&msg_rbuf,sizeof(msg_rbuf.msg_item),10,0); //阻塞接收
www.2cto.com
----------------------------------------------------------
5、int msgctl (int msqid, int cmd, struct msqid_ds *buf); //消息隊列屬性控制
參數(shù):
msqid:消息隊列的標識符。
cmd:執(zhí)行的控制命令,即要執(zhí)行的操作。包括以下選項:
IPC_STAT:讀取消息隊列屬性。取得此隊列的msqid_ds 結(jié)構(gòu),并將其存放在buf指向的結(jié)構(gòu)中。
IPC_SET :設(shè)置消息隊列屬性。
IPC_RMID:刪除消息隊列。
IPC_INFO:讀取消息隊列基本情況。此命令等同于 ipcs 命令。
這 4 條命令(IPC_STAT、IPC_SET、IPC_INFO 和 IPC_RMID)也可用于信號量和共享存儲。
buf:臨時的 msqid_ds 結(jié)構(gòu)體類型的變量。用于存儲讀取的消息隊列屬性或需要修改的消息隊列屬性。
舉例:msgctl(qid, IPC_RMID, NULL)? //刪除消息隊列
總結(jié)
以上是生活随笔為你收集整理的linux 声明消息函数,linux消息队列函数--解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员微信头像_微信头像暴露了你的层次:
- 下一篇: Linux编译程序源码环境,Linux下