消息隊列IPC(inter process communication)小記

1.獲取消息隊列

消息隊列相關的API都在sys/msg.h庫中,要創建消息隊列,使用函數msgget();這個函數第一個參數爲消息隊列ID(此Id是給定主機上唯一的描述符或關鍵字),第二個參數爲識別消息旗標的參數,返回值是一個句柄,和文件描述符相似,指向指定Id的消息隊列。

int msgget(key_t key, int msgflg);
key_t值必須是一個非零的值或者是特殊符號IPC_PRIVATE。

msgflg允許用戶設置兩個不同類型的參數:一個指令和一個訪問權限設置選項。權限和文件權限類似。指令有三種:

1)IPC_CREAT

2)IPC_CREAT|IPC_EXCL

3)0:告訴msgget消息隊列已存在,獲取消息隊列描述符

key=ftok("/home/queue",0);        //保證消息隊列id唯一

msgid=msgget(key,IPC_CREAT|0666);

2.配置消息隊列

消息大小默認是16kB,可以採用msgctl()函數調整其大小。eg:

struct msqid_ds buf;

msgid=msgget(xxx,0);

msgctl(msgid,XXX,&buf);

msgctl()函數的第二個參數有三種值可以設置:

1)IPC_STAT:讀取消息隊列當前默認設置

2)IPC_SET :修改消息隊列設置

3)IPC_RMID:移除指定的消息隊列

注:msgctl()函數可以獲取消息隊列信息、設置消息隊列信息和移除消息隊列

3.向消息隊列寫入消息

消息通過消息隊列發送,消息隊列上下文環境對消息只有一個限制,即要發送的消息對象必須在它的開頭有一個long類型的變量,用於定義消息的類型。通過msgsnd()函數來向消息隊列寫消息。

4.從消息隊列讀取消息

首先通過msgget()函數獲取消息隊列Id,然後通過msgrcv()函數從消息隊列讀取消息。

5.移除消息隊列

使用msgctl()函數和參數IPC_RMID來移除。

msgid=msgget(xxx,0);

msgctl(msgid,IPC_RMID,NULL);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章