`

C语言进程间通信(三)——消息队列

 
阅读更多

消息队列是最具有数据操作性的数据传输方式,在消息队列中可随意根据特定的数据类型检索消息,随内核持续的

消息队列是一个消息的链表,每个消息队列都有个队列头,用结构struct msg_queue描述,队列头包含队列的大量消息,包括消息队列键值,用户ID,组ID,消息数目等。

struct msg_queue
{
	struct ipc_perm q_perm;
	time_t q_stime;	//最后一次msgsnd时间
	time_t q_rtime;	//最后一次msgrcv时间
	time_t q_ctime;	//最后一次变更时间
	unsigned long q_cbytes;	//当前消息队列中字节数目
	unsigned long q_qnum;	//队列中消息个数
	unsigned long q_qbytes;	//队列中最大字节数目
	pid_t q_lspid;	//最后msgsnd的进程ID
	pid_t q_lrpid;	//最后receive进程ID
	struct list_head q_messages;
	struct list_head q_receivers;
	struct list_head q_senders;
}

结构msqid_ds用来设置或返回消息队列的信息

struct msqid_ds
{
	struct ipc_perm q_perm;
	struct msg *msg_first;	//第一个消息
	struct msg *msg_last;	//最后一个消息
	time_t msg_stime;	//最后一次msgsnd时间
	time_t msg_rtime;	//最后一次msgrcv时间
	time_t msg_ctime;	//最后一次变更时间
	pid_t msg_lspid;	//最后msgsnd的进程ID
	pid_t msg_lrpid;	//最后receive进程ID
	//...
}

消息队列读端

//read_queue.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
#include <errno.h>

#define LEN 10

typedef struct {
        long int my_msg_type;
        char msg[LEN+1];
}msg_buf;

int main()
{
        int ret;
        int msg_id;

        msg_id = msgget((key_t)1000,0666|IPC_CREAT);
        if(msg_id == -1){
                printf("msgget failed\n");
                return -1;
        }
        printf("msg_id:%d\n",msg_id);
        msg_buf mb;

        ret = msgrcv(msg_id,(void *)&mb,sizeof(msg_buf),3,IPC_NOWAIT);
        if(ret == -1){
                printf("msgrcv failed:%d\n",errno);
                return -1;
        }
        printf("recv %s\n",mb.msg);
        return 0;
}

消息队列写端

//create_queue.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#include<string.h>
#include<sys/stat.h>
#include<unistd.h>
#include<errno.h>

#define LEN 10
typedef struct {
        long int my_msg_type; //64位机器必须设置为long
        char msg[LEN+1];
}msg_buf;

int main()
{
        int i;
        int ret;
        int msg_id;

        msg_id = msgget((key_t)1000,0666|IPC_CREAT);
        if(msg_id == -1){
                printf("msgget failed\n");
                return -1;
        }
        printf("msg_id=%d\n",msg_id);

        msg_buf mb;
        mb.my_msg_type = 3;
        strncpy(mb.msg,"msg1",LEN);

        ret = msgsnd(msg_id,(void *)&mb,sizeof(msg_buf),0);
        if(ret == -1){
                printf("msgsnd failed\n");
                return -1;
        }
        printf("message sent:%d\n",ret);

        return 0;
}

注意针对64位机器,必须设置type为long类型,不然消息不会被接收端收到

编译运行结果如下

root:~/ciaos # ./write
msg_id=327689
message sent:0
root:~/ciaos # ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
0x000003e8 327689     root       666        24           1

root:~/ciaos # ./read
msg_id:327689
recv msg1
root:~/ciaos # ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
0x000003e8 327689     root       666        0            0
分享到:
评论

相关推荐

    进程间通信之消息队列 ( message queue )——完整代码

    进程间通信之消息队列 ( message queue ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....

    linux下进程间通信--消息队列

    标题"Linux下进程间通信--消息队列"指出了我们讨论的核心——如何在Linux环境中利用消息队列进行进程间的通信。下面我们将深入探讨消息队列的概念、工作原理、使用方法以及提供的优点。 1. **消息队列概念**: ...

    Linux下C语言编程——进程通信

    System V消息队列是另一种进程间通信方式,允许进程将数据结构(消息)发送到队列,由其他进程接收。相关函数有: - `msgget()`:创建或获取消息队列,指定键值和权限标志。 - `msgsnd()`:向消息队列发送消息。 - ...

    Linux下C语言编程--进程通信、消息管理

    共享内存是一种高效的进程间通信机制,它允许多个进程直接访问同一块内存区域。主要API包括: - `shmget(key_t key, size_t size, int shmflg);`:创建或获取共享内存段。 - `shmat(int shmid, void *shmaddr, int ...

    C语言也能干大事——全集下载地址

    进程间通信(IPC)是多进程环境下必不可少的技术之一。这部分可能介绍了管道、信号量、共享内存等IPC机制。 #### 高级算法 在算法基础之上,这部分内容可能会进一步探讨更复杂的数据处理技术,例如图论算法(如...

    基于C语言多进程通信的银行ATM系统,分为客户端和服务器端。.zip

    通过理解和掌握这个项目,我们可以深入理解C语言的多进程编程以及进程间通信的机制。 首先,我们要了解C语言在多进程编程中的基本概念。C语言提供了创建、管理进程的系统调用,如`fork()`用于创建子进程,`exec()`...

    操作系统 进程通信

    ### 操作系统中的进程通信...通过本次实验,不仅可以掌握进程创建的基本方法,还能深入了解两种常见的进程间通信机制——共享内存和消息队列的工作原理及其应用。这对于进一步学习操作系统理论和实践都是极为有益的。

    C语言简易ATM机

    至于消息队列,这可能是用于ATM机内部不同模块间通信的一种同步机制。在多线程或多进程环境中,消息队列可以提供一种高效、可靠的方式来传递信息,确保数据的一致性并避免竞态条件。在Linux环境下,可以使用System V...

    linux进程及进程间通讯

    在深入探讨进程间通信之前,我们先了解一下进程的基础概念。 **进程定义**:进程是计算机中已运行程序的实例,是系统进行资源分配和调度的基本单位。每个进程都有一个唯一的进程标识号(PID),并且可以拥有独立的...

    linux操作系统下c语言编程入门

    - 进程间通信 3. **Linux程序设计入门——文件操作** - 文件打开与关闭 - 文件读写 - 文件定位 - 文件属性设置 4. **Linux程序设计入门——时间概念** - 时间的获取 - 时间的转换 - 定时器的应用 5. **...

    多进程同步-生产者消费者模式-C实现

    生产者消费者模式基于操作系统提供的信号量(Semaphore)或管程(Monitor)等机制,以解决进程间的通信和同步问题。在这个模式中,生产者进程负责生成数据并放入缓冲区,而消费者进程则负责从缓冲区取出数据进行处理...

    NIX平台下C语言高级编程

    最后,进程间通信(IPC)在NIX平台上的C语言编程中占据重要地位,包括管道(pipe)、消息队列、共享内存、信号量和套接字等。这些机制允许不同进程之间交换数据,实现协同工作。 综上所述,NIX平台下的C语言高级...

    linux高级应用

    消息队列是另一种进程间通信机制,特别适用于少量数据的顺序共享。它将消息存储在一个链表中,并通过队列ID来标识。 #### 消息队列的特点 - **先进先出**:消息队列遵循先进先出的原则。 - **消息打包**:消息队列...

    猴子过桥问题

    常见的进程间通信方式包括管道、信号量、消息队列、共享内存、套接字等。 针对猴子过桥问题,我们可以借鉴同步原语——信号量(Semaphore)来解决。信号量是一种用于控制多个进程访问共享资源的机制,它包含一个...

    linux下c语言编程入门

    - 管道是进程间通信的一种方式,允许一个进程向另一个进程发送数据。 #### 4. Linux程序设计入门——时间概念 - **时间表示** - 时间在编程中有着广泛的应用,包括系统时间、日历时间等。 - **时间的测量** - ...

    史上最简单的Linux单机版聊天C程序

    在实际的开发过程中,除了`fork()`,还可以使用其他IPC(Inter-Process Communication,进程间通信)机制来增强聊天程序的功能,例如: - **管道(Pipe)**:简单且直接的数据通道,允许一个进程向另一个进程写入...

    struture.zip

    结合描述,我们可以推测这是一个关于使用双线程改进进程间通信(IPC)的案例,具体是两个进程——Jack进程和Rose进程,它们分别负责处理用户键盘输入和接收对方的消息。在这个过程中,"struct"标签可能指代C语言中的...

    列举系统中所有进程.zip_列举进程_所有进程

    5. **进程间通信(IPC)**:进程间通信允许进程共享数据、同步或协调它们的行为。常见的IPC机制包括管道、消息队列、共享内存、信号量等。 6. **命令行工具**:在Linux和类Unix系统中,`ps`命令用于列出系统中的...

Global site tag (gtag.js) - Google Analytics