加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux System V消息队列实现回射客户/服务器和msgsnd、msgrcv函数

发布时间:2016-09-27 10:09:29 所属栏目:Linux 来源:站长网
导读:一、msgsnd 和 msgrcv 函数 #include sys/types.h #include sys/ipc.h #include sys/msg.h 功能:把一条消息添加到消息队列中 原型 int msgsnd(int msqid, cons
副标题[/!--empirenews.page--]

一、msgsnd 和 msgrcv 函数

#include <sys/types.h>

 #include <sys/ipc.h>

 #include <sys/msg.h>

功能:把一条消息添加到消息队列中

原型 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

参数

msgid: 由msgget函数返回的消息队列标识码

msgp:是一个指针, 指针指向准备发送的消息结构体

msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型

msgflg:控制着当前消息队列满或到达系统上限时将要发生的事情

返回值:成功返回0;失败返回- 1

msgflg=IPC_NOWAIT表示队列满不等待,返回EAGAIN错误。为0表示阻塞等待

消息结构在两方面受到制约。首先 ,它的具体数据必须小于系统规定的上限值MSGMAX;其次,它必须以一个long int长整数开始,接收者函数将利用这个长整 数确定消息的类型。

消息结构参考形式如下:

struct msgbuf {

long  mtype;

char mtext [1];

};

The  mtext  field  is an array (or other structure) whose size is specified by msgsz, a nonnegative integer value.Messages of zero length (i.e., no mtext field) are permitted.

即mtex 这块区域可以是个数组或者结构体,大小由参数msgsz 指明。

功能:是从一个消息队列接收消息

原型 ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

参数

msgid: 由msgget函数返回的消息 队列标识码

msgp:是一个指针,指针指向准备接收的消息结构体

msgsz:是msgp指向的消息长度,这个长度不含保存消 息类型的那个long int长整型

msgtype:它可以实现接收优先级的简单形式

msgflg:控制着队列中没有相应类型的消息 可供接收时将要发生的事

返回值:成功返回实际放到接收缓冲区里去的字符个数,失败返回-1

msgtype=0返回队 列第一条信息

msgtype>0返回队列第一条类型等于msgtype的消息 

msgtype<0返回队列第一条类型小于等于 msgtype绝对值的消息,并且是满足条件的消息类型最小的消息

msgflg=IPC_NOWAIT,队列没有可读消息不等待,返回 ENOMSG错误。

msgflg=MSG_NOERROR,消息大小超过msgsz时被截断

msgtype>0且msgflg=MSG_EXCEPT,接收类型不等 于msgtype的第一条消息。

二、消息队列实现回射客户/服务器

在前面的系列文章中,我们都是使用socket 套接字来实现回射客户/服务器程序,现在尝试使用消息队列来实现,主要就是利用上面介绍的两个函数msgsnd,msgrcv 。

linux System V消息队列实现回射客户/服务器和msgsnd、msgrcv函数

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读