創建消息隊列
消息隊列的創建,需要用到msgget函數。
int msgget(key_t key, int msgflg);
key:該參數是消息隊列的唯一標識,由ftok生成。
msgflg:取值有以下幾個選擇:IPC_CREAT、IPC_EXCL ,這兩個參數詳細的作用可以man msgflg看詳細介紹。
返回值:返回一個近乎唯一的Message queue id
我們可以指定一個文件,調用ftok ,它會根據這個文件的 inode,生成一個近乎唯一的 key。
key_t ftok(const char *pathname, int proj_id);
pathname:文件信息,必須指定在一個存在的,可訪問的文件。
proj_id:8bit的數據,0-255隨意設定。
這樣就可以獲得一個近乎唯一的key了!
只要在這個消息隊列的生命周期內,這個文件不要被刪除就可以了。只要不刪除,無論什么時刻,再調用 ftok,也會得到同樣的 key。
綜上,創建一個消息隊列只需兩步:
①:ftok生成一個key
②:msgget生成一個消息隊列的ID
如下:
int main() {
int messagequeueid;
key_t key;
if((key = ftok("/root/messagequeue/messagequeuekey", 1)) < 0)
{
perror("ftok error");
exit(1);
}
printf("Message Queue key: %d.n", key);
if ((messagequeueid = msgget(key, IPC_CREAT|0777)) == -1)
{
perror("msgget error");
exit(1);
}
printf("Message queue id: %d.n", messagequeueid);
}
ftok要指定一個存在的文件,所以我們在執行之前,需要創建該文件。
查看消息隊列:
System V IPC 體系有一個統一的命令行工具:ipcmk,ipcs 和 ipcrm 用于創建、查看和刪除 IPC 對象。
查看創建的IPC對象:ipcs -q
dong@ubuntu:~//Interprocess_Communication$ ipcs
------ Message Queues --------
key msqid owner perms used-bytes messages
0x01110005 0 dong 777 0 0
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
------ Semaphore Arrays --------
key semid owner perms nsems
發送消息
消息隊列發送消息,主要調用msgsnd 函數。
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
msqid:該參數是msgget所得到的message queue 的 id
msgp:消息結構體
struct msg_buffer {
long mtype;
char mtext[1024];
};
msgsz:表示消息結構體中,mtext最大長度。
msgflg:一位掩碼,可取值有:IPC_NOWAIT、MSG_COPY、MSG_EXCEPT、MSG_NOERROR,取值說明可見man msgsnd
接收消息
消息隊列接收消息,主要調用msgrcv 函數。
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
msqid:該參數是msgget所得到的message queue 的 id
msgp:消息結構體
msgsz:可接收數據最大長度
msgflg:一位掩碼,可取值有:IPC_NOWAIT、MSG_COPY、MSG_EXCEPT、MSG_NOERROR,取值說明可見man msgsnd
有了消息這種模型,兩個進程之間的通信就像咱們平時發郵件一樣,你來一封,我回一封,可以頻繁溝通了。
審核編輯:湯梓紅
-
嵌入式
+關注
關注
5085文章
19138瀏覽量
305705 -
隊列
+關注
關注
1文章
46瀏覽量
10911 -
進程
+關注
關注
0文章
203瀏覽量
13962
發布評論請先 登錄
相關推薦
評論