system v 消息队列(二)
来源:互联网 发布:中国联通网络套餐 编辑:程序博客网 时间:2024/05/21 09:46
1.msgsnd函数
(1)功能:把一条消息添加到消息队列中
(2)原型:intmsgsnd(int msqid, const void* msgp. size_t msgsz, int msgflg);
(3)参数:msgqid:由msgget函数返回的消息队列标识码
msgp:是一个指针,指针指向准备发送的消息
msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型
msgflg:控制着当前消息队列满或到达系统上限时将要发生的事情
(4)返回值:成功返回0,;失败返回-1
(5)msgflg=IPC_NOWAIT表示队列满不等待,返回EAGAIN错误
(6)消息结构在两方面收到制约。首先它必须小于系统规定的上限值;其次,它必须以一个long int长整数开始,接收者函数将利用这个长整数确定消息的类型
(7)消息结构参考形式如下:
struct msgbuf {
long mtype;
char mtext[1];
};
2.msgrcv函数
(1)功能:是从一个消息队列接收消息
(2)原型:ssize_t msgrcv(int msgqid, void*msgp, size_t msgsz, long msgtyp, int msgflg);
(3)参数:msgid:由msgget函数返回的消息队列标识码
msgp:是一个指针,指针指向准备接收的消息
msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型
msgtype:它可以实现接收优先级的简单形式
msgflg:控制着队列中没有相应类型的消息可供接收时将要发生的事
(4)返回值:成功返回实际放到接收缓冲区里去的字符个数,失败返回-1
(5)msgtype=0返回队列第一条消息
(6)msgtyp>0返回队列第一条类型等于msgtype的消息
(7)msgtyp<0返回队列第一条类型小于等于msgtype绝对值的消息(消息类型最小的先接收)
(8)msgflg=IPC_NOWAIT,队列没有可读消息不等待,返回ENOMSG错误
(9)msgtyp=MSG_NOERROR,消息大小超过msgsz是被截断
(10)msgtyp>0且msgflg=MSG_EXCEPT,接收类型不等于msgtype的第一条消息
3.示例
msg_send.cpp
#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdlib.h>#include <stdio.h>#include <errno.h>#define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0)struct MSG {long mtype;char mtext[1];};int main(int argc, char* argv[]) {if(argc != 3) {fprintf(stderr, "Usage: %s <bytes> <type>\n", argv[0]);exit(EXIT_FAILURE);}int len = atoi(argv[1]);int type = atoi(argv[2]);int msgid;msgid = msgget(1234, 0); //按照原来创造的权限打开if(msgid == -1) ERR_EXIT("msgget");struct MSG* ptr;ptr = (struct MSG*)malloc(sizeof(long)+len);ptr->mtype = type;if(msgsnd(msgid, ptr, len, 0) <0)ERR_EXIT("msgsnd");return 0;}
msg_recv.cpp
./recv -n -t 2
#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdlib.h>#include <stdio.h>#include <errno.h>#define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ }while(0)struct MSG {long mtype;char mtext[1];};#define MSGMAX 8192int main(int argc, char* argv[]) {int flag = 0;int type = 0;int opt;while(1) {opt = getopt(argc, argv, "nt:");if(opt == '?')exit(EXIT_FAILURE);if(-1 == opt)break;switch(opt) {case 'n':flag |= IPC_NOWAIT;break;case 't'://int n = atoi(optarg);//printf("n=%d\n", n);type = atoi(optarg);break;}}int msgid;msgid = msgget(1234, 0); //按照原来创造的权限打开if(msgid == -1) ERR_EXIT("msgget");struct MSG* ptr;ptr = (struct MSG*)malloc(sizeof(long)+MSGMAX);ptr->mtype = type;int n = 0;if((n=msgrcv(msgid, ptr, MSGMAX, type, flag)) < 0)ERR_EXIT("msgsnd");printf("read %d bytes type=%ld\n", n, ptr->mtype);return 0;}
- system v 消息队列(二)
- 消息队列(System V)
- system v 消息队列
- System V 消息队列
- system v--消息队列
- System V消息队列
- system V消息队列
- System V消息队列
- System V 消息队列
- System V 消息队列
- System V消息队列(2)
- system V 消息队列(msg)
- 消息队列(system V IPC)
- System V 消息队列(一)
- System V消息队列(三)
- System V IPC_msg消息队列
- 58-System V 消息队列
- System V 消息队列 (每个客户一个队列)
- memcached编译安装
- 伪数组转化为数组的方法
- The volume “boot” has only 0 byte disk space remaining
- Android
- Github for Windows使用教程图解
- system v 消息队列(二)
- Java的类可以同时继承thread和实现runable
- Arcgis for Android 集成(二)AndroidStudio
- hdu1455
- 11.3-全栈Java笔记:线程的生命周期
- java网络编程之端口
- 小程序catch阻止事件冒泡
- 使用idea搭建springboot的maven项目
- cls 参数