System V IPC之消息队列
消息隊(duì)列由消息隊(duì)列id來(lái)唯一標(biāo)識(shí)
?
消息隊(duì)列就是一個(gè)消息的列表 用戶可以在消息隊(duì)列中添加消息 讀取消息
?
消息隊(duì)列可以按照類型來(lái)發(fā)送和接收消息
?
?????????????????????????????????????????????????? 消息隊(duì)列使用步驟
?
打開(kāi)/創(chuàng)建消息隊(duì)列 msgget
?
向消息隊(duì)列發(fā)送消息 msgsnd
?
從消息隊(duì)列接收消息 msgrcv
?
控制消息隊(duì)列 msgctl
?
??????????????????????????????????????? 創(chuàng)建/打開(kāi)消息隊(duì)列
?
#include <sys/ipc.h>
#include <sys/msg.h>n
int msgget(key_t key, int msgflg)
?
成功返回消息隊(duì)列的id 失敗返回EOF
key 和消息隊(duì)列關(guān)聯(lián)的key IPC_PRIVATE(私有的)或ftok(如果想共享這個(gè)消息隊(duì)列 通過(guò)這個(gè)函數(shù)創(chuàng)建key)
msgflg 標(biāo)志位 IPC_CREAT|0666
??????????????????????????????????????????? 消息發(fā)送
?
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msgid, const void *msgp, size_t size,int msgflg)
?
成功返回0 失敗返回-1
msgid 消息隊(duì)列id
msgp 消息緩沖區(qū)地址
size 消息正文長(zhǎng)度
msgflg 標(biāo)志位 0(阻塞, 直到空間足夠 發(fā)送成功,,函數(shù)返回0)或IPC_NOWAIT(不會(huì)阻塞, 讓函數(shù)-1 )
?
???????????????????????????????????? 消息格式
?
通信雙方首先定義好統(tǒng)一的消息格式
?
用戶根據(jù)應(yīng)用需求定義結(jié)構(gòu)體類型
?
首成員類型為long, 代表消息類型(正整數(shù))
?
其他成員都屬于消息正文
???????????????????????????????????? 消息接收
?
#include <sys/ipc.h>
#include <sys/msg.h>
int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int msgflg)
?
成功返回消息隊(duì)列長(zhǎng)度 失敗返回-1
msgid 消息隊(duì)列id
msgp 消息隊(duì)列緩沖區(qū)地址
size 指定接收的消息長(zhǎng)度
msgtype 指定接收的消息類型 如果為0 表示接收消息隊(duì)列中最早的消息
如果為負(fù)數(shù) 是按照優(yōu)先級(jí)接收
msgflg 標(biāo)志位 0(如果無(wú)消息 ,阻塞 直到有消息 或信號(hào)打斷 或消息隊(duì)列被刪除)或IPC_NOWAIT
(如果沒(méi)有消息 返回一個(gè)錯(cuò)誤)
????????????????????????????????????? 控制消息隊(duì)列
?
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msgid, int cmd, struct msqid_ds *buf)
成功返回 0 失敗返回-1
msgid 消息隊(duì)列id
cmd 要執(zhí)行的操作
IPC_STAT :獲取消息隊(duì)列的屬性
IPC_SET :設(shè)置消息隊(duì)列的屬性
IPC_RMID 刪除消息隊(duì)列的屬性(不需要第三個(gè)參數(shù), 執(zhí)行這個(gè)后 立馬執(zhí)行
不論有沒(méi)有消息在發(fā)送或接受
buf 存放消息隊(duì)列屬性的地址
總結(jié)
以上是生活随笔為你收集整理的System V IPC之消息队列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 千古风流一坛醋剧情介绍
- 下一篇: 英雄联盟联赛竟猜结算期要多久