第6章 System V消息队列
6.1 概述
System V消息队列在内核中是list存放的,头结点中有2个指针msg_first 和msg_last。其中每个节点包含:下个节点地址的指针、类型、长度、数据等。
6.2 函数
6.2.1 msgget 函数
| 功能:msgget 函数用于创建一个新的消息队列或访问一个已存在的消息队列。 | |
| 头文件 | #include <sys/msg.h> |
| 函数原型 | int msgget(key_t key, int oflsg); |
| 返回值 | 成功返回非负的标识符,失败返回-1. |
| 说明 | 1.返回值是一个非负标识符,其它三个msg函数用它来指代队列;它是基于key值产生的,而key可以是ftok的返回值,也可以是常数IPC_PRIVATE |
| 2.oflag:读写权限的组合(0666) | IPC_CREAT | IPC_EXCL | |
6.2.2 msgsnd 函数
| 功能:往消息队列中写入一个消息 | |
| 头文件 | #include <sys/msg.h> |
| 函数原型 | int msgsnd(int msqid, const void *ptr, size_t length, int flag); |
| 返回值 | 成功返回0,失败返回-1 |
| 说明 | 1.msqid是msgget返回的标识符 |
|
2.ptr参数是一个结构体指针,且第一个成员是long型,模板如下,也可自定义。 struct msgbuf { |
|
| 3.flag参数即可以是0,是阻塞函数,如果无法存放消息(消息队列中有太多的消息或者字节数),就休眠 | |
| 4.flag参数可以是IPC_NOWAIT,变成非阻塞的。如果无法存放消息,就返回-个EAGAIN错误。 | |
6.2.3 msgrcv 函数
| 功能:从消息队列中读出一个消息 | |
| 头文件 | #include <sys/msg.h> |
| 函数原型 | ssize_t msgrcv(int msqid, void *ptr, size_t length, long type, int flag); |
| 返回值 | 成功返回读出的字节数,失败返回-1. |
| 说明 | 1.msqid是msgget返回的标识符。 |
| 2.ptr是接受消息的结构体,和msgsnd一样,包含long类型 | |
| 3.length指结构体中数据部分的大小,是该函数能返回的最大数量,不包含long型字段。 | |
|
4.type:从消息队列中指定读出什么样的消息。 如果 type = 0,返回第一个消息; 如果 type > 0,返回其类型的第一个消息; 如果 type < 0,返回小于或等于type参数绝对值的消息中类型值最小的第一个消息。 |
|
|
5.flag:0,不做任何处理,没有消息就阻塞; flag:IPC_NOWAIT,没有消息就返回一个ENOMSG的错误; flag:MSG_NOERROR,如果接受消息数据部分大于length参数,就返回截短的数据,否则返回E2BIG错误。 |
|
6.2.4 msgctl 函数
| 功能:提供一个消息队列上的各种控制操作。 | |
| 头文件 | #include <sys/msg.h> |
| 函数原型 | int msgctl(int msqid, int cmd, struct msqid_ds *buf); |
| 返回值 | 成功返回0,失败返回-1 |
| 说明 | IPC_RMID:从系统中删除消息队列。 |
| IPC_SET:设置msgid_ds结构中的msg_perm.uid、msg_perm.gid、msg_perm.mode和msg_qbytes | |
| IPC_STAT:返回当前msqid_ds结构 | |
6.3 简单的程序
6.3.1 msgcreate 程序
创建一个消息队列,可以使用-e命令行选项来指定IPC_EXCL标志。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
// msgcreate [-e] /tmp/msgqueue
int main(int argc, char **argv)
{
;
| IPC_CREAT;
;
)
{
switch (c)
{
case 'e':
oflag |= IPC_EXCL;
break;
default:
break;
}
}
)
{
printf("usage: msgcreate [-e] <pathname>");
;
}
// 创建一个System V 消息队列
mqid = msgget(ftok(argv[optind], ), oflag);
)
{
perror("msgget error");
;
}
;
}
6.3.2 msgsnd 程序
把一个指定长度和类型的消息放到指定的消息队列中。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
struct my_msgbuf
{
long type;
];
};
// msgsnd <pathname> <bytes> <type>
// msgsnd /tmp/msqueue 100 1
int main(int argc, char **argv)
{
| IPC_CREAT;
;
;
;
)
{
printf("usage: msgsnd <pathname> <bytes> <type>\n");
;
}
len = atoi(argv[]);
type = atoi(argv[]);
// 创建一个System V 消息队列
mqid = msgget(ftok(argv[], ), oflag);
)
{
perror("msgget error");
;
}
// 构造数据
struct my_msgbuf *ptr = (struct my_msgbuf*)malloc(sizeof(struct my_msgbuf) + len);
memset(ptr, , sizeof(struct my_msgbuf) + len);
ptr->type = type;
// 发送消息
msgsnd(mqid, ptr, len, );
;
}
6.3.3 msgrcv 程序
从消息队列中读出指定的消息,可以使用-n命令行改成非阻塞
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
struct my_msgbuf
{
long type;
];
};
#define MAX_MSG 100
// msgrcv [-n] [-t type] <pathname>
// msgrcv -t 1 /tmp/msqueue
int main(int argc, char **argv)
{
;
| IPC_CREAT;
;
;
;
struct my_msgbuf *buf = (struct my_msgbuf *)malloc(sizeof(struct my_msgbuf) + MAX_MSG);
memset(buf, , sizeof(struct my_msgbuf) + MAX_MSG);
)
{
switch (c)
{
case 'n':
flag |= IPC_NOWAIT;
break;
case 't':
type = atoi(optarg);
break;
default:
break;
}
}
)
{
printf("usage: msgrcv [-n] [-t type] <pathname>");
;
}
// 创建一个System V 消息队列
mqid = msgget(ftok(argv[optind], ), oflag);
)
{
perror("msgget error");
;
}
// 读取消息
int n = msgrcv(mqid, buf, MAX_MSG, type, flag);
printf("recv n = %d\n", n);
;
}
6.3.4 msgrmid 程序
从系统中删除一个System V消息队列
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
// msgrmid <pathname>
// msgrmid /tmp/msqueue
int main(int argc, char **argv)
{
;
)
{
printf("usage: msgrmid <pathname>\n");
;
}
// 创建一个System V 消息队列
mqid = msgget(ftok(argv[], ), );
)
{
perror("msgget error");
;
}
// 删除一个System V 消息队列
msgctl(mqid, IPC_RMID, NULL);
;
}
第6章 System V消息队列的更多相关文章
- 第二十五章 system v消息队列(一)
IPC对象的持续性 随进程持续 :一直存在直到打开的最后一个进程结束.(如pipe和FIFO) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ...
- 第二十七章 system v消息队列(三)
消息队列实现回射客户/服务器 msg_srv.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> ...
- 第二十六章 system v消息队列(二)
msgsnd int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 作用: 把一条消息添加到消息队列中 参数: msqi ...
- 进程间通信 System V 消息队列
1.msgget (key_t ket,int flag) ; //创建一个新的消息队列或者访问一个已存在的消息队列 2.msgsnd(int msid, const void *ptr ,size_ ...
- Linux进程通信之System V消息队列
System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...
- 利用System V消息队列实现回射客户/服务器
一.介绍 在学习UNIX网络编程 卷1时,我们当时可以利用Socket套接字来实现回射客户/服务器程序,但是Socket编程是存在一些不足的,例如: 1. 服务器必须启动之时,客户端才能连上服务端,并 ...
- UNIX环境高级编程——system V消息队列
unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的. 消息队列(也叫报文队列)客服了这些缺点: 消息队列就是一个消息的链表. 可以把消 ...
- linux c编程:System V消息队列一
消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...
- linux网络编程之system v消息队列(二)
今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ...
随机推荐
- 【Unity3D基础教程】给初学者看的Unity教程(六):理解Unity的新GUI系统(UGUI)
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点推荐.谢谢! 理解UGUI的基础架构 UGUI是Unity在4 ...
- loadrunner---<二>---菜鸟对cookie的思考
http://www.cnblogs.com/Pierre-de-Ronsard/archive/2012/11/19/2772630.html loadrunner---<二>---菜鸟 ...
- Phython 学习笔记之——类的初步认识
类是面向对象编程的核心,他扮演相关数据及逻辑容器的角色.他们提供了创建实例对象的蓝图.因为python语言不要求必须以面向对象的方式编程(与JAVA不同),这里简单的举一个例子. 如何定义一个类 cl ...
- Font Awesome字体图标
1.什么是字体图标字体图标是一个包含许多图标的字体库.可以理解为一种特殊的字体,只不过里面包含的都是图标. 2.Font Awesome图标字体库Font Awesome是目前最受欢迎最全面的图标字体 ...
- sql 2000 NOLOCK 和 ROWLOCK 和 UPDLOCK
关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修改并释放锁,否则其他用户就无法修改该组数据. 有些数据库,包括SQL Se ...
- OpenJudge计算概论-计算三角形面积【海伦公式】
/*============================================== 计算三角形面积 总时间限制: 1000ms 内存限制: 65536kB 描述 平面上有一个三角形,它的 ...
- ASP.NET MV3 部署网站 报"Could not load file or assembly ' System.Web.Helpers “ 错的解决方法
转自:http://www.cnblogs.com/taven/archive/2011/08/14/2138077.html 国内很多网站空间都只支持.NET 2.0 和 .NET 3.0 3.5, ...
- maven设置---Dmaven.multiModuleProjectDirectory system propery is not set.
设置maven 环境变量: MAVEN_HOME:D:\Java\apache-maven-3.3.3 M2_HOME:D:\Java\apache-maven-3.3.3 path:%MAVEN_H ...
- 查看SQL执行计划
一用户进入某界面慢得要死,查看SQL执行计划如下(具体SQL语句就不完全公布了,截断的如下): call count cpu elapsed disk ...
- android操作sdcard中的多媒体文件(一)——音乐列表的制作
android操作sdcard中的多媒体文件(一)——音乐列表的制作 原文地址 最近做了一个android音乐播放器,个人感觉最难的就是“后台播放”以及有关“播放列表”的部分,但是总算是找到了实现的方 ...