linux System V消息队列实现回射客户/服务器和msgsnd、msgrcv函数
副标题[/!--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 。 (编辑:济南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |