1\创建或打开消息队列
函数原型:int msgget(key_t key, int msgflg)
参数
第一个参数为ftok方法创建的一个kety_t或者为一个整数值
第二个参数为逻辑控制,IPC_CREAT:创建新标识符;IPC_CREAT|IPC_EXCL:创建新标识之前查看是由有已存在的标识符.

返回值
返回一个整形的标识符,返回的标识符是具有系统唯一性,也就是操作系统的全局变量,即系统中任何知道该值的进程都可以访问该消

息队列

2\发送消息队列
函数原型:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)
参数
第一个参数为msgget所获得IPC标识符
第二个参数为要发送的消息,其结构为struct msgbuf
第三个参数为要发送消息的大小
第四个参数为控制msgsnd行为的控制符IPC_NOWAIT表示消息的发送为一个无阻塞的操作.

返回值
0成功,-1失败

3\接收消息队列
函数原型:int msgrcv(int msqid, void *msgp, size_t msgsz, int msgtyp, int msgflg)
参数
第一个参数msqid,要接收消息队列的标识符
第二个参数msgp,要接收消息的缓冲区
第三个参数msgsz,要接收消息的大小
第四个参数msgtyp,等于该值的消息队列中的第一个消息(>0)或者等于小于该值绝对值消息队列中的第一个消息
第五个参数msgflg,接收消息的控制符,0一直等待消息到来;IPC_WAIT无阻塞等待

返回值
成功时返回接收到的消息大小,-1失败

实验代码:

/* 消息队列发送msgqueue_send.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h> #define MYMSGQUEUE_NAME "/tmp/mkfifo.0001" /* 已存在的文件名 */
#define MAKER_KEY 0x1234 struct msgbuf
{
int msg_type; /* 消息类型 */
char msg_data[1024]; /* 消息内容 */
}; int main(int argc, char *argv[])
{
struct msgbuf mymsg;
key_t mymsgkey;
int mymsgid;
int result; mymsgkey = ftok(MYMSGQUEUE_NAME, MAKER_KEY); /* 生成key */
if(mymsgkey == -1)
{
printf("make key failed, app exit!error : %s.\n", strerror(errno));
exit(-1);
}
printf("make key succeed, key : %d.\n", mymsgkey); mymsg.msg_type = 66;
strncpy(mymsg.msg_data, "This message is from the [msgqueue_send.c].", sizeof(mymsg.msg_data)); mymsgid = msgget(mymsgkey, IPC_CREAT|0666); /* 创建消息队列标识符 */
if(mymsgid < 0)
{
printf("create msgid failed, app exit!\n");
exit(-1);
}
printf("create msgid succeed, msgid : %d\n", mymsgid); result = msgsnd(mymsgid, &mymsg, sizeof(mymsg.msg_data), IPC_NOWAIT);
if(result < 0)
{
printf("send message queue failed, app exit!\n");
exit(-1);
}
printf("send message queue succeed, app exit!\n"); return 0;
}
/* 读取消息队列msgqueue_read.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h> #define MSGQUEUE_NAME "/tmp/mkfifo.0001" /* 已存在的文件名 */
#define MAKER_KEY 0x1234 struct msgbuf
{
int msg_type; /* 消息类型 */
char msg_data[1024]; /* 消息内容 */
}; int main(int argc, char *argv[])
{
key_t mymsgkey = ftok(MSGQUEUE_NAME, MAKER_KEY); /* 生成key */
if(mymsgkey == -1)
{
printf("make key failed, app exit!error : %s.\n", strerror(errno));
exit(-1);
}
printf("make key succeed, key : %d.\n", mymsgkey); int mymsgid = msgget(mymsgkey, IPC_CREAT|0666); /* 创建消息队列标识符 */
if(mymsgid < 0)
{
printf("create msgid failed, app exit!\n");
exit(-1);
}
printf("create msgid succeed, msgid : %d\n", mymsgid); struct msgbuf mymsg;
memset(mymsg.msg_data, '\0', sizeof(mymsg.msg_data));
int result = msgrcv(mymsgid, &mymsg, sizeof(mymsg.msg_data), 66, IPC_NOWAIT);
if(result < 0)
{
printf("receive message queue failed, app exit!\n");
exit(-1);
}
printf("receive message queue succeed.\n message : %s\n", mymsg.msg_data); return 0;
}

实验结果

用命令ipcs查看消息队列,发现有一个key为0x34000082的消息正是我们之前创建的一个消息队列,十进制为872415298

system的消息队列实例的更多相关文章

  1. System V 消息队列 实例

    前言: 消息队列是消息的链接表,存放在内核中,并由消息队列标识符标识.我们将称消息队列为 “队列”,其标识符为“队列I D”.msgget创建一个新队列或打开一个存在的队列; msgsnd向队列末端添 ...

  2. 进程间通信 System V 消息队列

    1.msgget (key_t ket,int flag) ; //创建一个新的消息队列或者访问一个已存在的消息队列 2.msgsnd(int msid, const void *ptr ,size_ ...

  3. 第6章 System V消息队列

    6.1 概述 System V消息队列在内核中是list存放的,头结点中有2个指针msg_first 和msg_last.其中每个节点包含:下个节点地址的指针.类型.长度.数据等. 6.2 函数 6. ...

  4. Linux进程通信之System V消息队列

    System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...

  5. 利用System V消息队列实现回射客户/服务器

    一.介绍 在学习UNIX网络编程 卷1时,我们当时可以利用Socket套接字来实现回射客户/服务器程序,但是Socket编程是存在一些不足的,例如: 1. 服务器必须启动之时,客户端才能连上服务端,并 ...

  6. POSIX和SYSTEM的消息队列应该注意的问题

    首先看看POSIX的代码: 1.posix_mq_server.c #include <mqueue.h>#include <sys/stat.h>#include <s ...

  7. UNIX环境高级编程——system V消息队列

    unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的.     消息队列(也叫报文队列)客服了这些缺点:     消息队列就是一个消息的链表.     可以把消 ...

  8. linux c编程:System V消息队列一

    消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...

  9. 第二十五章 system v消息队列(一)

    IPC对象的持续性 随进程持续 :一直存在直到打开的最后一个进程结束.(如pipe和FIFO) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ...

随机推荐

  1. 说说secondarynamenode作用和配置

    说说secondarynamenode作用 http://my.oschina.net/u/1464779/blog/289895 说说secondarynamenode的配置 hadoop2.X如何 ...

  2. Spring中添加新的配置表,并对新的配置表进行处理

    实习过程中boss交代的任务(以下出现的代码以及数据只给出小部分,提供一个思路) 目的:Spring中添加新的配置表,并对新的配置表进行处理:替换的新的配置表要友好,同时保证替换前后功能不能发生变化. ...

  3. [luogu P1552] [APIO2012]派遣

    [luogu P1552] [APIO2012]派遣 题目背景 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 题目描述 在这个帮派里,有一名忍者被称之为Master.除 ...

  4. 思科恶意加密TLS流检测论文记录——由于样本不均衡,其实做得并不好,神马99.9的准确率都是浮云啊,之所以思科使用DNS和http一个重要假设是DGA和HTTP C&C(正常http会有图片等)。一开始思科使用的逻辑回归,后面17年文章是随机森林。

    论文记录:Identifying Encrypted Malware Traffic with Contextual Flow Data from:https://songcoming.github. ...

  5. ssh和ssl的联系和区别

    ssh:Secure Shell,安全Shell,是一个软件,处于应用层旨在取代明文通信的telnet:对应的开源实现程序是openssh. ssl:Secure Sockets Layer,安全套接 ...

  6. axios ajax fetch 区别

    请求方式千千万,axios是一种对ajax的封装,fetch是一种浏览器原生实现的请求方式,跟ajax对等

  7. etymon word air aero aeri aer ag agreement walk joint trick skill chief forget out~1

      1● air 2● aero 3● aeri 4● aer 空气 充气       1● ag     做,代理做   =====>agency       1● agr 2● agri 3 ...

  8. Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获

    一.全局异常 1.首先创建异常处理包和类 2.使用@ControllerAdvice注解,全局捕获异常类,只要作用在@RequestMapping上,所有的异常都会被捕获 package com.ex ...

  9. SQLite 剖析

    由于sqlite对多进程操作支持效果不太理想,在项目中,为了避免频繁读写 文件数据库带来的性能损耗,我们可以采用操作sqlite内存数据库,并将内存数据库定时同步到文件数据库中的方法. 实现思路如下: ...

  10. Linux第八周作业

    一 理解编译链接的过程和ELF可执行文件格式 这张图说明了可执行程序的产生 大致过程为 .c文件汇编成汇编代码.asm, 然后再汇编成目标码.o, 然后链接成可执行文件a.out, 这时可执行文件就可 ...