創(chuàng)建消息隊(duì)列
消息隊(duì)列的創(chuàng)建,需要用到msgget函數(shù)。
int msgget(key_t key, int msgflg);
key:該參數(shù)是消息隊(duì)列的唯一標(biāo)識(shí),由ftok生成。
msgflg:取值有以下幾個(gè)選擇:IPC_CREAT、IPC_EXCL ,這兩個(gè)參數(shù)詳細(xì)的作用可以man msgflg看詳細(xì)介紹。
返回值:返回一個(gè)近乎唯一的Message queue id
我們可以指定一個(gè)文件,調(diào)用ftok ,它會(huì)根據(jù)這個(gè)文件的 inode,生成一個(gè)近乎唯一的 key。
key_t ftok(const char *pathname, int proj_id);
pathname:文件信息,必須指定在一個(gè)存在的,可訪問(wèn)的文件。
proj_id:8bit的數(shù)據(jù),0-255隨意設(shè)定。
這樣就可以獲得一個(gè)近乎唯一的key了!
只要在這個(gè)消息隊(duì)列的生命周期內(nèi),這個(gè)文件不要被刪除就可以了。只要不刪除,無(wú)論什么時(shí)刻,再調(diào)用 ftok,也會(huì)得到同樣的 key。
綜上,創(chuàng)建一個(gè)消息隊(duì)列只需兩步:
①:ftok生成一個(gè)key
②:msgget生成一個(gè)消息隊(duì)列的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要指定一個(gè)存在的文件,所以我們?cè)趫?zhí)行之前,需要?jiǎng)?chuàng)建該文件。
查看消息隊(duì)列:
System V IPC 體系有一個(gè)統(tǒng)一的命令行工具:ipcmk,ipcs 和 ipcrm 用于創(chuàng)建、查看和刪除 IPC 對(duì)象。
查看創(chuàng)建的IPC對(duì)象: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
發(fā)送消息
消息隊(duì)列發(fā)送消息,主要調(diào)用msgsnd 函數(shù)。
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
msqid:該參數(shù)是msgget所得到的message queue 的 id
msgp:消息結(jié)構(gòu)體
struct msg_buffer {
long mtype;
char mtext[1024];
};
msgsz:表示消息結(jié)構(gòu)體中,mtext最大長(zhǎng)度。
msgflg:一位掩碼,可取值有:IPC_NOWAIT、MSG_COPY、MSG_EXCEPT、MSG_NOERROR,取值說(shuō)明可見(jiàn)man msgsnd
接收消息
消息隊(duì)列接收消息,主要調(diào)用msgrcv 函數(shù)。
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
msqid:該參數(shù)是msgget所得到的message queue 的 id
msgp:消息結(jié)構(gòu)體
msgsz:可接收數(shù)據(jù)最大長(zhǎng)度
msgflg:一位掩碼,可取值有:IPC_NOWAIT、MSG_COPY、MSG_EXCEPT、MSG_NOERROR,取值說(shuō)明可見(jiàn)man msgsnd
有了消息這種模型,兩個(gè)進(jìn)程之間的通信就像咱們平時(shí)發(fā)郵件一樣,你來(lái)一封,我回一封,可以頻繁溝通了。
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5059文章
18974瀏覽量
302069 -
隊(duì)列
+關(guān)注
關(guān)注
1文章
46瀏覽量
10882 -
進(jìn)程
+關(guān)注
關(guān)注
0文章
201瀏覽量
13938
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論