Linux网络编程之System V消息队列

System V消息队列函数:

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

int msgget(key_t key, int msgflg);

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

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

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

msgget函数:

功能:用来创建和访问一个消息队列

原型

int msgget(key_t key, int msgflg);

参数

key:某个消息队列的名字

msgflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的

返回值:成功返回一个非负整数,即该消息队列的标识码;失败返回-1

 Linux网络编程之System V消息队列_第1张图片

msgctl函数:

功能:消息队列的控制函数

原型

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

参数

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

cmd:是将要采取的动作,(有三个可取值)

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

cmd取值如下:

命令

说明

IPC_STAT

把msqid_ds结构中的数据设置为消息队列的当前关联值

IPC_SET

在进程有足够权限的前提下,把消息队列的当前关联值设置为msqid_ds数据结构中给出的值

IPC_RMID

删除消息队列

 

msgsnd函数:

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

原型

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错误。

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

消息结构参考形式如下:

   struct msgbuf {

      long mtype;

      char mtext[1];

   }

msgrcv函数:

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

原型

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的第一条消息。

你可能感兴趣的:(System,Linux网络编程,V消息队列)