首页 > 编程语言 >系统编程-消息队列

系统编程-消息队列

时间:2024-08-28 19:53:44浏览次数:8  
标签:函数 队列 编程 -- 消息 include id

消息队列

目录

消息队列

引入

一、消息队列的特点

二、使用指令查看消息队列

三、使用消息队列进行通信的步骤

1、获取键值

2、创建或获取消息队列 id

3、使用消息队列进行数据的传输

4、msgrcv -- 从消息队列中读取数据

5、消息队列的多种操作函数


引入

-- 进程间通信 (IPC)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。

-- 这章讲消息队列

  • 相当于系统级别的链表(系统开着,消息队列在。系统关,消息队列关)-- 所有进程都可使用

  • 多个进程间进行数据传输           -- 消息队列

一、消息队列的特点

-- 类似于管道

  • (1)先进先出,数据读出来会从消息队列中消失。

  • (2)要进行消息的读取,必须有消息否则会读阻塞。

  • (3)消息队列满了,会产生写阻塞。

  • (4)有消息类型之分,用来确定读取的消息类型

-- 消息队列可以解决的问题:多个进程间进行数据的传输

二、使用指令查看消息队列

-- 指令:ipcs

  • ipas可以查看系统下的system V的状态 

    alt text

-- 指令:ipcs -q 只查看消息队列 

alt text

-- 消息队列的相关信息:

  • 键值:获取消息队列 id 的唯一标识符,一个键值对应一个消息队列的 id,是八位的十六进制,例如 0x12345678

  • msqid:用于区分不同的消息队列 也代表该消息队列的号(id)

  • 拥有者:谁创建的

  • 权限:对该消息队列的操作权限
    例:666 可读可写

  • 已用字节数:消息队列中一共存放了多少个字节的信息

  • 消息:存放了消息的个数


三、使用消息队列进行通信的步骤

alt text

1、获取键值

(1)函数获取:

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/ipc.h>

-- 函数原型

  • key_t ftok(const char *pathname, int proj_id)

-- 函数的作用:

  • 通过传入的参数来获取指定的键值(ftok的两个参数一样,获取的键值就一样)

-- 函数的参数:

  • pathname:必须是存在的路径
  • proj_id:0~255

-- 函数的返回值:

  • 会根据函数的参数来返回一个键值

alt text

(2)自己定义:

  • #define my_key 0x12345678

-- 键值的作用:

  • 一样的键值可以让不同进程来获取到同一个消息队列的id号
  • 一个键值对应一个id号,是一一对应的。具有唯一性。

2、创建或获取消息队列 id

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/ipc.h>
  • #include <sys/msg.h>

-- 函数原型

  • int msgget(key_t key, int msgflg)

-- 函数的作用:

  • 创建或获取消息队列的 id 用于进程间通信

-- 函数的参数:

  • key:键值 相同的键值可以获取相同的消息队列 id
  • msgflg:固定填写    IPC_CREAT|0666

-- 函数的返回值:

  • 成功返回 消息队列的 id >= 0
  • 失败返回 -1

alt text

alt text

3、使用消息队列进行数据的传输

-- 收发的数据类型必须为结构体

-- 函数的头文件

  • #include <sys/types.h>
  • #include <sys/ipc.h>
  • #include <sys/msg.h>

-- 函数原型

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

-- 函数的作用:

  • 向指定的消息队列中发送一条消息

-- 函数的参数:

  • msqid:要将消息发送到哪一个消息队列中去

  • msgsz:填写 mtext 的大小 ,填写:第二个参数的结构体大小 - 8

  • msgflg:填0是阻塞发送,如果消息队列空间不够,会阻塞,直到有空间可以进行写入
    -- IPC_NOWAIT 非阻塞发送

  • msgp:发送的消息的首地址

-- 这里必须要用结构体 需要自己在程序中定义(发送和接收的结构体必须定义的一模一样)

struct msgbuf {
    long mtype;
    /* message type, must be > 0 */
    char mtext[1];
    /* message data */
    xxxx;
    .....;
};

-- 结构体中的第一个成员必须为 long 类型,赋值时必须给大于 0 的值

-- 函数的返回值:

  • 成功返回 0
  • 失败返回 -1
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>

#define key 0x12345678

struct student
{
	long mtype;  -- 第一个数据类型必须是long型
	int id;
	char name[20];
};

int main()
{

	//key_t  key = ftok("/home/pimouren/learn", 55);
	printf("%x\n",key);
	
	int id = msgget(key,IPC_CREAT|0666);
	if(id == -1)
	{
		perror("msgget");
		return -1;
	}
	printf("id = %d\n",id);
	
	struct student stu;
	printf("请输入学生的学号!\n");
	scanf("%d",&stu.id);
	printf("请输入学生的名字!\n");
	scanf("%s",stu.name);
	
	int  mm = msgsnd(id, &stu,sizeof(stu)-8, 0);
	if(mm == -1)
	{
		perror("msgsnd");
		return -1;
	}
	
	
	return 0;
}

alt text

-- 再次向消息队列中写入数据,已用字节数发生改变

alt text

4、msgrcv         -- 从消息队列中读取数据

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/ipc.h>
  • #include <sys/msg.h>

-- 函数的原型

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

-- 函数的作用:

  • 从消息队列中进行数据的读取

-- 函数的参数:

  • msqid:要从哪一个消息队列读取消息
  • msgp:读取到的消息保存的首地址
  • msgsz:要读取的消息字节数,填写结构体大小 - 8
  • msgtyp:要接受的消息类型

"> 0"
-- 接收指定的消息类型中的第一条消息
"0"
-- 接收消息队列中的第一条消息
"<0"
-- 接收小于 msgtyp 绝对值的消息类型
例如 填写-3, |-3| == 3 ,那么可以读取 1 或2 的消息类型

  • msgflg: 0 阻塞接收 如果没有 msgtyp 指定消息类型会一直阻塞 直到有该消息类型来到 IPC_NOWAIT 非阻塞

-- 函数的返回值:

  • 成功返回 实际读取到的字节数
  • 失败返回 -1

alt text

alt text

alt text

5、消息队列的多种操作函数

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/ipc.h>
  • #include <sys/msg.h>

-- 函数原型

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

-- 函数的作用:

  • 对消息队列进行多种操作 例如:获取消息队列的信息, 更改消息队列设置, 删除消息队列

-- 函数的参数:

  • msqid:消息队列的 id 你要对哪一个消息队列进行操作
  • cmd:要进行的具体操作

IPC_STAT 获取消息队列的信息
IPC_SET 更改消息队列的设置
IPC_RMID 删除消息队列
当 cmd 为 IPC_RMID 时 第三个参数给 NULL buf:结构体指针 用于传出和设置消息队列属性

-- 函数的返回值:

  • 成功 返回 0
  • 失败 返回 -1

-- 这个函数主要用来删除消息队列

alt text

-- 使用指令删除消息队列

  • 指令:ipcrm -q msgid

alt text

标签:函数,队列,编程,--,消息,include,id
From: https://blog.csdn.net/m0_71813740/article/details/141608455

相关文章

  • 系统编程-共享内存
    共享内存目录共享内存引入一、使用指令查看共享内存二、使用共享内存进行通信的步骤1、获取键值2、创建或获取共享内存id3、映射共享内存到进程的地址空间4、进行数据的写入和读取        --memcpy5、对“块”进行赋值操作5、解除映射6、共享内存的多......
  • 重头开始嵌入式第二十九天(Linux系统编程 网络通信 tcp)
    目录1.常见网络模型1.bs2.p2p3.cs2.网络编程之TCP(传输控制协议)1.TCP模型2.服务器端:1.socket();2、bind();3、listen();4、accept();5、接受函数:/发送函数:6、close()  ===>关闭指定的套接字id;3.客户端:1.connect();2、send()3、客户端信息获取4、客户端的信息bin......
  • Java 入门指南:Java Socket 网络通信编程
    SocketSocket(套接字)是用于网络通信的编程接口、网络通信的基础,通过它可以实现不同计算机之间的数据传输,应用程序可以通过它发送或接收数据;就像操作文件那样可以打开、读写和关闭。它提供了一种机制,使得计算机之间可以进行数据的发送和接收。套接字允许应用程序将I/O应用......
  • 各种编程语言的优劣
    PythonPython是一种流行的高级编程语言,具有许多优点和一些缺点。以下是关于Python语言的优缺点及应用场景:优点:易学易用:Python语法简洁清晰,易于学习和使用,适合初学者入门。高效开发:Python的语法和标准库设计使得开发速度快,能够快速实现想法并快速迭代。广泛支......
  • 突破编程 C++ 设计模式(组合模式)详尽攻略
    在软件开发中,设计模式为程序员提供了解决特定问题的最佳实践。设计模式不仅提高了代码的可复用性和可维护性,还能帮助团队更好地进行协作。在这篇文章中,我们将深入探讨组合模式——一种结构型设计模式。组合模式允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组合......
  • 零基础国产GD32单片机编程入门(六)PWM波输出实战含源码
    文章目录一.概要二.PWM产生框架图三.配置一个TIME输出1KHZ,占空比50%PWM波例程四.工程源代码下载五.小结一.概要脉冲宽度调制(PWM),是英文“PulseWidthModulation”的缩写,简称脉宽调制,是利用单片机数字输出(1或0)来对外部模拟电路进行控制的一种非常有效的技术。PWM......
  • 【Linux网络编程】I/O 多路复用技术
    【Linux网络编程】I/O多路复用技术什么是I/O多路复用?为什么需要I/O多路复用最简单的socket网络模型,就是单线程模型,一个同时进行监听、处理,然而,单线程模型同时只能服务一个客户端,当线程发生阻塞的时候,其他客户端只能排队等待,甚至连接失败。为了能够同时服务更多的客户端,......
  • 【Linux网络编程】字节序
    【Linux网络编程】字节序字节序字节序就是字节在内存中存储的顺序,如32位整数0x01234567,在内存中存储时,有如下两种顺序:大端序将数值的高位存储在低位地址中,小端序则相反。网络字节序网络中传输数据均采用大端序。Linux字节序转换函数在#include<netinet/in.h>中提供了4......
  • 【Linux网络编程】Socket Api函数
    【Linux网络编程】SocketApi函数TCP/IP协议族TCP/IP协议族有sockaddr_in和sockaddr_in6两个专用的socket地址结构体,它们分别用于IPv4和IPv6,在此只将IPv4,如下为structsockaddr_in:structsockaddr_in{sa_family_tsin_family;//地址族:AF_INETu_int......
  • 消息队列MQ的使用
    承接我的另一篇博客 消息队列MQ-CSDN博客启动服务1.启动mqnamesrv2.启动mqbrokermqbroker-n127.0.0.1:9876应用1.普通消息同步发送publicclassEasyA{publicstaticvoidmain(String[]args)throwsMQClientException,MQBrokerException,RemotingExce......