Linux多线程同步之消息队列有何特点

 我来答
就烦条0o
2017-11-17 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
消息队列是消息的链表,存放在内核中并有消息队列标示符标示。
msgget用于创建一个新队列或打开一个现存的队列。msgsnd将新消息加入到消息队列中;每个
消息包括一个long型的type;和消息缓存;msgrcv用于从队列中取出消息;取消息很智能,不一定先进先出
①msgget,创建一个新队列或打开一个现有队列
#include
int msgget ( key_t key, int flag );
//成功返回消息队列ID;错误返回-1
②msgsnd: 发送消息
#include
int msgsnd( int msgid, const void* ptr, size_t nbytes, int flag )
//成功返回0,错误返回-1
a:
flag可以指定为IPC_NOWAIT;
若消息队列已满,则msgsnd立即出错返回EABAIN;
若没指定IPC_NOWAIT; msgsnd会阻塞,直到消息队列有空间为止
③msgrcv: 读取消息:
ssize_t msgrcv( int msgid, void* ptr, size_t nbytes, long type, int flag );
a. type == 0; 返回消息队列中第一个消息,先进先出
b. type > 0
返回消息队列中类型为tpye的第一个消息
c. type < 0
返回消息队列中类型 <=
|type| 的数据;若这种消息有若干个,则取类型值最小的消息
消息队列创建步骤:
#define
MSG_FILE "."
struct msgtype {
long mtype;
char buffer[BUFFER+1];
};
if((key=ftok(MSG_FILE,'a'))==-1)
{
fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));
exit
(1);
}
if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)
{
fprintf(stderr,"Creat Message
Error:%s\n", strerror(errno));
exit
(1);
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式