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