消息队列是最具有数据操作性的数据传输方式,在消息队列中可随意根据特定的数据类型检索消息,随内核持续的
消息队列是一个消息的链表,每个消息队列都有个队列头,用结构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 ) 消息队列是消息的链表,具有特定的格式,并由消息队列标识符标识. 七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四....
标题"Linux下进程间通信--消息队列"指出了我们讨论的核心——如何在Linux环境中利用消息队列进行进程间的通信。下面我们将深入探讨消息队列的概念、工作原理、使用方法以及提供的优点。 1. **消息队列概念**: ...
System V消息队列是另一种进程间通信方式,允许进程将数据结构(消息)发送到队列,由其他进程接收。相关函数有: - `msgget()`:创建或获取消息队列,指定键值和权限标志。 - `msgsnd()`:向消息队列发送消息。 - ...
共享内存是一种高效的进程间通信机制,它允许多个进程直接访问同一块内存区域。主要API包括: - `shmget(key_t key, size_t size, int shmflg);`:创建或获取共享内存段。 - `shmat(int shmid, void *shmaddr, int ...
进程间通信(IPC)是多进程环境下必不可少的技术之一。这部分可能介绍了管道、信号量、共享内存等IPC机制。 #### 高级算法 在算法基础之上,这部分内容可能会进一步探讨更复杂的数据处理技术,例如图论算法(如...
通过理解和掌握这个项目,我们可以深入理解C语言的多进程编程以及进程间通信的机制。 首先,我们要了解C语言在多进程编程中的基本概念。C语言提供了创建、管理进程的系统调用,如`fork()`用于创建子进程,`exec()`...
### 操作系统中的进程通信...通过本次实验,不仅可以掌握进程创建的基本方法,还能深入了解两种常见的进程间通信机制——共享内存和消息队列的工作原理及其应用。这对于进一步学习操作系统理论和实践都是极为有益的。
至于消息队列,这可能是用于ATM机内部不同模块间通信的一种同步机制。在多线程或多进程环境中,消息队列可以提供一种高效、可靠的方式来传递信息,确保数据的一致性并避免竞态条件。在Linux环境下,可以使用System V...
在深入探讨进程间通信之前,我们先了解一下进程的基础概念。 **进程定义**:进程是计算机中已运行程序的实例,是系统进行资源分配和调度的基本单位。每个进程都有一个唯一的进程标识号(PID),并且可以拥有独立的...
- 进程间通信 3. **Linux程序设计入门——文件操作** - 文件打开与关闭 - 文件读写 - 文件定位 - 文件属性设置 4. **Linux程序设计入门——时间概念** - 时间的获取 - 时间的转换 - 定时器的应用 5. **...
生产者消费者模式基于操作系统提供的信号量(Semaphore)或管程(Monitor)等机制,以解决进程间的通信和同步问题。在这个模式中,生产者进程负责生成数据并放入缓冲区,而消费者进程则负责从缓冲区取出数据进行处理...
最后,进程间通信(IPC)在NIX平台上的C语言编程中占据重要地位,包括管道(pipe)、消息队列、共享内存、信号量和套接字等。这些机制允许不同进程之间交换数据,实现协同工作。 综上所述,NIX平台下的C语言高级...
消息队列是另一种进程间通信机制,特别适用于少量数据的顺序共享。它将消息存储在一个链表中,并通过队列ID来标识。 #### 消息队列的特点 - **先进先出**:消息队列遵循先进先出的原则。 - **消息打包**:消息队列...
常见的进程间通信方式包括管道、信号量、消息队列、共享内存、套接字等。 针对猴子过桥问题,我们可以借鉴同步原语——信号量(Semaphore)来解决。信号量是一种用于控制多个进程访问共享资源的机制,它包含一个...
- 管道是进程间通信的一种方式,允许一个进程向另一个进程发送数据。 #### 4. Linux程序设计入门——时间概念 - **时间表示** - 时间在编程中有着广泛的应用,包括系统时间、日历时间等。 - **时间的测量** - ...
在实际的开发过程中,除了`fork()`,还可以使用其他IPC(Inter-Process Communication,进程间通信)机制来增强聊天程序的功能,例如: - **管道(Pipe)**:简单且直接的数据通道,允许一个进程向另一个进程写入...
结合描述,我们可以推测这是一个关于使用双线程改进进程间通信(IPC)的案例,具体是两个进程——Jack进程和Rose进程,它们分别负责处理用户键盘输入和接收对方的消息。在这个过程中,"struct"标签可能指代C语言中的...
5. **进程间通信(IPC)**:进程间通信允许进程共享数据、同步或协调它们的行为。常见的IPC机制包括管道、消息队列、共享内存、信号量等。 6. **命令行工具**:在Linux和类Unix系统中,`ps`命令用于列出系统中的...